合宙 ESP32C3 首个ardunio程序

https://blog.csdn.net/dpjcn1990/article/details/136085443

 

复制代码
#define LED_BUILTIN1 12
#define LED_BUILTIN2 13

//usb转ttl即可,无需485转ttl #define RS485_RX_PIN 1 #define RS485_TX_PIN 0 #define RS485_ENABLE_PIN 18 #define RS485 Serial1 void setup() { Serial.begin(9600); pinMode(LED_BUILTIN1, OUTPUT); pinMode(LED_BUILTIN2, OUTPUT); digitalWrite(LED_BUILTIN1, LOW); digitalWrite(LED_BUILTIN2, LOW); pinMode(RS485_ENABLE_PIN, OUTPUT); digitalWrite(RS485_ENABLE_PIN, LOW); RS485.begin(9600, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN1, LOW); digitalWrite(LED_BUILTIN2, LOW); delay(1000); digitalWrite(LED_BUILTIN1, HIGH); digitalWrite(LED_BUILTIN2, HIGH); delay(1000); Serial.println("合宙ESP32C3"); //Serial1.println("123456789"); while (Serial1.available() > 0) { // 检查是否有数据可读 char incomingByte = Serial1.read(); // 从串口读取一个字节的数据 Serial.print("Received: "); // 输出接收到的数据前缀 Serial.println(incomingByte, HEX); // 以十六进制形式输出接收到的数据 } }
复制代码

 

 

第二个 通信modbus与pwm控制

复制代码
#include <dummy.h>
// =================================================================================================
//  电磁吸盘控制器
//  通过Modbus-rtu 控制占空比,占空比控制 电磁吸盘 的电流,进而控制电磁力   
//          
// =================================================================================================

// =================================================================================================
// eModbus: Copyright 2020 by Michael Harwerth, Bert Melis and the contributors to ModbusClient
//               MIT license - see license.md for details
// =================================================================================================
#include <Arduino.h>
#include "HardwareSerial.h"
// Modbus server include
#include "ModbusServerRTU.h"

//增添头文件
#include "hal/uart_types.h"
#include "driver/uart.h"
#include "driver/gpio.h"
//#include "ledc.h"
//#include "soc/soc_caps.h"

//增添宏定义 与RS485调制解调模块接口
#define RS485_RX_PIN 1
#define RS485_TX_PIN 0

#define RS485_ENABLE_PIN 18
#define RS485 Serial1
#define RS485_SerialNum UART_NUM_1

#define RTU_ADD 0x05
// 定义队列,用来传输数据
QueueHandle_t queueMsg = xQueueCreate(8, sizeof(char[2]));

////实现PWM控制
int duty_cycle_now = 0;
// use 8 bit precision for LEDC timer
#define LEDC_TIMER_8_BIT 8
const int MAX_DUTY_CYCLE = (int)(pow(2, LEDC_TIMER_8_BIT) - 1);
// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 1000

// LED pins  
// 这里实际连接的是电磁铁控制NPN
#define LED_PIN_1 8  
//板载LED
#define LED_BUILTIN1 12
#define LED_BUILTIN2 13

void pwmInit(){
  pinMode(LED_PIN_1, OUTPUT);
  pinMode(LED_BUILTIN1, OUTPUT);
  pinMode(LED_BUILTIN2, OUTPUT);
  digitalWrite(LED_BUILTIN1, LOW);
  digitalWrite(LED_BUILTIN2, LOW);

  // 配置PIN,频率,分辨率
  ledcAttach(LED_PIN_1, LEDC_BASE_FREQ, LEDC_TIMER_8_BIT);

  //// set the brightness on LEDC channel 0
  pwmOut(0);
}

void pwmOut(int dutyCycle){
    // 设置PWM波占空比, 值高,导通时间长,最大 MAX_DUTY_CYCLE,这里是255
  if(dutyCycle <= MAX_DUTY_CYCLE)
  {
    // 按照新值输出PWM波信号
    Serial.println("PWM_Duty:");
    Serial.println(dutyCycle);
    // set the brightness on LEDC channel 0
    duty_cycle_now = MAX_DUTY_CYCLE-dutyCycle;
    // write duty to LEDC
     ledcWrite(LED_PIN_1, duty_cycle_now);
  }
}

////定义PWM控制任务
//xTaskCreate(pwmTask, "pwmTask", 1024 * 8, NULL, 1, NULL);
void pwmTask(void *ptParam) {  //LCD任务主体
  pwmInit();
  while (1) {
    uint16_t PWM_Duty;
    //TickType_t timeOut = portMAX_DELAY;
    TickType_t timeOut = 10;
    if (xQueueReceive(queueMsg, &PWM_Duty, timeOut) == pdPASS) {
      pwmOut((int)PWM_Duty);  
    }  else {
      //Serial.println("Message Queue is Empty");
    };
    vTaskDelay(100);
  }
}

// Modbus RTU 作为服务器 通信
// Create a ModbusRTU server instance listening with 2000ms timeout
ModbusServerRTU MBserver(2000); // 超时时长


// FC03: worker do serve Modbus function code 0x03 (READ_HOLD_REGISTER)
// 0x04 读取输入寄存器值   READ_INPUT_REGISTER

ModbusMessage FC04(ModbusMessage request) {
  uint16_t address;           // requested register address
  uint16_t words;             // requested number of registers
  ModbusMessage response;     // response message to be sent back
  delay(100);
  // get request values
  request.get(2, address);
  request.get(4, words);
  //    Serial.println(request.size());
  //    Serial.println("\n");
     Serial.println("request:address and words");
     Serial.println(address);
     Serial.println(words);
  
  // Address and words valid? We assume 10 registers here 
  if (address>=0 && words>=1 && (address + words) <= 10) {
    // Looks okay. Set up message with serverID, FC and length of data
    response.add(request.getServerID(), request.getFunctionCode(), (uint8_t)(words * 2));
    // Fill response with requested data
    for (uint16_t i = address; i < address + words; ++i) {
      response.add((uint8_t)(duty_cycle_now>>8),(uint8_t)(duty_cycle_now%255));//当前PWM占空比
    }
  } else {
    // No, either address or words are outside the limits. Set up error response.
    response.setError(request.getServerID(), request.getFunctionCode(), ILLEGAL_DATA_ADDRESS);
  }
  return response;
}

// FC06: worker do serve Modbus function code 0x06 (READ_HOLD_REGISTER)
// 0x06 写单个保持寄存器

ModbusMessage FC06(ModbusMessage request) {
  uint16_t address;           // requested register address
  uint16_t regvalue;             // requested register value
  ModbusMessage response;     // response message to be sent back
  delay(100);
  // get request values
  request.get(2, address);
  request.get(4, regvalue);
  Serial.println(regvalue);
  // Address and words valid? We assume 10 registers here for demo
  if ( (address== 0)&&(regvalue<=MAX_DUTY_CYCLE)) {
    // Looks okay. Set up message with serverID, FC and length of data
    response.add(request.getServerID(), request.getFunctionCode());
    // Fill response with requested data
    response.add((uint8_t)(regvalue>>8),(uint8_t)(regvalue%256));
    // 数据发进队列
    //portMAX_DELAY - 无限Block
    //TickType_t timeOut = portMAX_DELAY;
    TickType_t timeOut = 10;
    if (xQueueSend(queueMsg, &regvalue, timeOut) != pdPASS)  {
      Serial.print("queue send error");
      Serial.println("Queue is full.");
    };
  } else {
    Serial.print("the MAX_DUTY_CYCLE is:");
    Serial.println(MAX_DUTY_CYCLE);
    // No, either address or words are outside the limits. Set up error response.
    response.setError(request.getServerID(), request.getFunctionCode(), ILLEGAL_DATA_ADDRESS);
  }
  return response;
}
// Setup() - initialization happens here
void setup() {
  // PWM初始化
  //pwmInit();

  // Init Serial monitor
  Serial.begin(115200);
  while (!Serial) {}
  Serial.println("__ OK __");

  // RS485串口外设 连接 Modbus RTU
  RTUutils::prepareHardwareSerial(RS485);
  
  RS485.begin(115200, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN);
  while (!RS485) {
    delay(10);
  }
  // HS245 总线控制器芯片 导通
  pinMode(RS485_ENABLE_PIN, OUTPUT);
  digitalWrite(RS485_ENABLE_PIN, LOW);

  if (!RS485.setMode(UART_MODE_RS485_HALF_DUPLEX)) {
    Serial.print("Failed to set RS485 mode");
  }
  // END,RS485串口外设 连接 Modbus RTU
  // Register served function code worker for server 1, FC 0x04
    MBserver.registerWorker(RTU_ADD, READ_INPUT_REGISTER, &FC04);
    
    MBserver.registerWorker(RTU_ADD, WRITE_HOLD_REGISTER, &FC06); 
  // Start ModbusRTU background task
    MBserver.begin(RS485);

  //启动PWM控制任务
   xTaskCreate(pwmTask, "pwmTask", 1024 * 8, NULL, 3, NULL);
}

// loop() - nothing done here today!
void loop() {
  digitalWrite(LED_BUILTIN1, LOW);
  digitalWrite(LED_BUILTIN2, LOW);
  delay(1000);
  digitalWrite(LED_BUILTIN1, HIGH);
  digitalWrite(LED_BUILTIN2, HIGH);
  delay(1000);
  //ledcWriteChannel(LEDC_CHANNEL, 250);
}
复制代码

 

复制代码
#include <dummy.h>
// =================================================================================================
//  电磁吸盘控制器
//  通过Modbus-rtu 控制占空比,占空比控制 电磁吸盘 的电流,进而控制电磁力   
//          
// =================================================================================================

// =================================================================================================
// eModbus: Copyright 2020 by Michael Harwerth, Bert Melis and the contributors to ModbusClient
//               MIT license - see license.md for details
// =================================================================================================
#include <Arduino.h>
#include "HardwareSerial.h"
// Modbus server include
#include "ModbusServerRTU.h"

//增添头文件
#include "hal/uart_types.h"
#include "driver/uart.h"
#include "driver/gpio.h"
//#include "ledc.h"
//#include "soc/soc_caps.h"

//增添宏定义 与RS485调制解调模块接口
#define RS485_RX_PIN 1
#define RS485_TX_PIN 0

#define RS485_ENABLE_PIN 18
#define RS485 Serial1
#define RS485_SerialNum UART_NUM_1

#define RTU_ADD 0x05
// 定义队列,用来传输数据
QueueHandle_t queueMsg = xQueueCreate(8, sizeof(char[2]));

////实现PWM控制
int duty_cycle_now = 0;
// use 8 bit precision for LEDC timer
#define LEDC_TIMER_8_BIT 8
const int MAX_DUTY_CYCLE = (int)(pow(2, LEDC_TIMER_8_BIT) - 1);
// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 1000

// LED pins  
// 这里实际连接的是电磁铁控制NPN
#define LED_PIN_1 8  
//板载LED
#define LED_BUILTIN1 12
#define LED_BUILTIN2 13

void pwmInit(){
  pinMode(LED_PIN_1, OUTPUT);
  pinMode(LED_BUILTIN1, OUTPUT);
  pinMode(LED_BUILTIN2, OUTPUT);
  digitalWrite(LED_BUILTIN1, LOW);
  digitalWrite(LED_BUILTIN2, LOW);

  // 配置PIN,频率,分辨率
  ledcAttach(LED_PIN_1, LEDC_BASE_FREQ, LEDC_TIMER_8_BIT);

  //// set the brightness on LEDC channel 0
  pwmOut(0);
}

void pwmOut(int dutyCycle){
    // 设置PWM波占空比, 值高,导通时间长,最大 MAX_DUTY_CYCLE,这里是255
  if(dutyCycle <= MAX_DUTY_CYCLE)
  {
    // 按照新值输出PWM波信号
    Serial.println("PWM_Duty:");
    Serial.println(dutyCycle);
    // set the brightness on LEDC channel 0
    duty_cycle_now = MAX_DUTY_CYCLE-dutyCycle;
    // write duty to LEDC
     ledcWrite(LED_PIN_1, duty_cycle_now);
  }
}

////定义PWM控制任务
//xTaskCreate(pwmTask, "pwmTask", 1024 * 8, NULL, 1, NULL);
void pwmTask(void *ptParam) {  //LCD任务主体
  pwmInit();
  while (1) {
    uint16_t PWM_Duty;
    //TickType_t timeOut = portMAX_DELAY;
    TickType_t timeOut = 10;
    if (xQueueReceive(queueMsg, &PWM_Duty, timeOut) == pdPASS) {
      pwmOut((int)PWM_Duty);  
    }  else {
      //Serial.println("Message Queue is Empty");
    };
    vTaskDelay(100);
  }
}

// Modbus RTU 作为服务器 通信
// Create a ModbusRTU server instance listening with 2000ms timeout
ModbusServerRTU MBserver(2000); // 超时时长


// FC03: worker do serve Modbus function code 0x03 (READ_HOLD_REGISTER)
// 0x04 读取输入寄存器值   READ_INPUT_REGISTER

ModbusMessage FC04(ModbusMessage request) {
  uint16_t address;           // requested register address
  uint16_t words;             // requested number of registers
  ModbusMessage response;     // response message to be sent back
  delay(100);
  // get request values
  request.get(2, address);
  request.get(4, words);
  //    Serial.println(request.size());
  //    Serial.println("\n");
     Serial.println("request:address and words");
     Serial.println(address);
     Serial.println(words);
  
  // Address and words valid? We assume 10 registers here 
  if (address>=0 && words>=1 && (address + words) <= 10) {
    // Looks okay. Set up message with serverID, FC and length of data
    response.add(request.getServerID(), request.getFunctionCode(), (uint8_t)(words * 2));
    // Fill response with requested data
    for (uint16_t i = address; i < address + words; ++i) {
      response.add((uint8_t)(duty_cycle_now>>8),(uint8_t)(duty_cycle_now%255));//当前PWM占空比
    }
  } else {
    // No, either address or words are outside the limits. Set up error response.
    response.setError(request.getServerID(), request.getFunctionCode(), ILLEGAL_DATA_ADDRESS);
  }
  return response;
}

// FC06: worker do serve Modbus function code 0x06 (READ_HOLD_REGISTER)
// 0x06 写单个保持寄存器

ModbusMessage FC06(ModbusMessage request) {
  uint16_t address;           // requested register address
  uint16_t regvalue;             // requested register value
  ModbusMessage response;     // response message to be sent back
  delay(100);
  // get request values
  request.get(2, address);
  request.get(4, regvalue);
  Serial.println(regvalue);
  // Address and words valid? We assume 10 registers here for demo
  if ( (address== 0)&&(regvalue<=MAX_DUTY_CYCLE)) {
    // Looks okay. Set up message with serverID, FC and length of data
    response.add(request.getServerID(), request.getFunctionCode());
    // Fill response with requested data
    response.add((uint8_t)(regvalue>>8),(uint8_t)(regvalue%256));
    // 数据发进队列
    //portMAX_DELAY - 无限Block
    //TickType_t timeOut = portMAX_DELAY;
    TickType_t timeOut = 10;
    if (xQueueSend(queueMsg, &regvalue, timeOut) != pdPASS)  {
      Serial.print("queue send error");
      Serial.println("Queue is full.");
    };
  } else {
    Serial.print("the MAX_DUTY_CYCLE is:");
    Serial.println(MAX_DUTY_CYCLE);
    // No, either address or words are outside the limits. Set up error response.
    response.setError(request.getServerID(), request.getFunctionCode(), ILLEGAL_DATA_ADDRESS);
  }
  return response;
}
// Setup() - initialization happens here
void setup() {
  // PWM初始化
  //pwmInit();

  // Init Serial monitor
  Serial.begin(115200);
  while (!Serial) {}
  Serial.println("__ OK __");

  // RS485串口外设 连接 Modbus RTU
  RTUutils::prepareHardwareSerial(RS485);
  
  RS485.begin(115200, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN);
  while (!RS485) {
    delay(10);
  }
  // HS245 总线控制器芯片 导通
  pinMode(RS485_ENABLE_PIN, OUTPUT);
  digitalWrite(RS485_ENABLE_PIN, LOW);

  if (!RS485.setMode(UART_MODE_RS485_HALF_DUPLEX)) {
    Serial.print("Failed to set RS485 mode");
  }
  // END,RS485串口外设 连接 Modbus RTU
  // Register served function code worker for server 1, FC 0x04
    MBserver.registerWorker(RTU_ADD, READ_INPUT_REGISTER, &FC04);
    
    MBserver.registerWorker(RTU_ADD, WRITE_HOLD_REGISTER, &FC06); 
  // Start ModbusRTU background task
    MBserver.begin(RS485);

  //启动PWM控制任务
   xTaskCreate(pwmTask, "pwmTask", 1024 * 8, NULL, 3, NULL);
}

// loop() - nothing done here today!
void loop() {
  digitalWrite(LED_BUILTIN1, LOW);
  digitalWrite(LED_BUILTIN2, LOW);
  delay(1000);
  digitalWrite(LED_BUILTIN1, HIGH);
  digitalWrite(LED_BUILTIN2, HIGH);
  delay(1000);
  //ledcWriteChannel(LEDC_CHANNEL, 250);
}
复制代码

 

posted @ 2025-02-24 07:48  辛河  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示