跳到主要内容

示例程序

本章说明如何下载、配置并运行 C、Python、STM32 和 Arduino 示例,通过 Modbus RTU 控制四路 PWM 输出模块。

示例范围

本产品为成品功能模块,不属于二次开发模块,不提供模块内部固件源码及工程文件。

本页提供的 C、Python、STM32 和 Arduino 程序仅用于演示外部主控如何通过 Modbus RTU 操作模块,并非属于模块源码。

主控板适配、硬件故障排查以及用户自行修改的 GPIO、UART 初始化代码不属于示例程序支持范围。

下载示例程序

Ubuntu 用户安装下载和解压工具,然后下载示例压缩包。下面的地址是占位符,发布 Wiki 时请替换为实际下载链接:

sudo apt install -y wget unzip
wget https://www.waveshare.net/w/upload/6/60/Pwm_4ch.zip
unzip pwm_4ch_demo.zip
cd pwm_4ch_demo

解压后的目录结构如下:

pwm_4ch_demo/
├── c/
├── python/
├── STM32/
└── Arduino/

Windows 用户可以使用浏览器下载示例程序并解压,后续进入对应平台目录即可。

功能概览

设备共有 4 个 PWM 通道,通道编号为 14。示例库提供以下功能:

功能C、STM32PythonArduinoModbus 指令
读取或设置单路频率read_frequencywrite_frequencyread_frequency()write_frequency()readFrequency()writeFrequency()0x03,写 0x10
读取或设置单路占空比read_dutywrite_dutyread_duty()write_duty()readDuty()writeDuty()0x03,写 0x06
同时读写一路频率和占空比read_channelwrite_channelread_channel()write_channel()readChannel()writeChannel()0x03,写 0x10
连续读写多个通道read_channelswrite_channelsread_channels()write_channels()readChannels()writeChannels()0x03,写 0x10
读取或设置串口参数read_serial_paramwrite_serial_paramread_serial_parameters()write_serial_parameters()readSerialParameters()writeSerialParameters()0x03,写 0x06
读取或设置设备地址read_addresswrite_addressread_device_address()write_device_address()readDeviceAddress()writeDeviceAddress()0x03,写 0x06
读取软件版本read_versionread_software_version()readSoftwareVersion()0x03

Python 示例

Python 示例位于 python/ 目录,使用 pymodbus 完成 Modbus RTU 通信。建议在虚拟环境中安装依赖:

sudo apt install -y python3 python3-venv python3-pip
cd python
python3 -m venv .venv
source .venv/bin/activate
python -m pip install pymodbus
初始化提示

打开 main_pwm4ch.py,根据实际连接修改串口和设备地址。示例默认的串口为 /dev/ttyUSB0

SERIAL_PORT = "/dev/ttyUSB0"

示例中的主要操作如下:


# 串口总线和 PWM 设备分别初始化,同一条总线可连接多个设备。
client = ModbusSerialClient(
port=SERIAL_PORT,
baudrate=9600,
bytesize=8,
parity="N",
stopbits=1,
timeout=0.3,
)
bus = ModbusRtuBus(client)
bus.connect()
pwm = ModbusRtuPwmOutput4Ch(device_id=1)

# 读取 CH1 的频率和占空比
value = pwm.read_channel(bus, 1)

# 将 CH1 设置为 1000 Hz、50%
pwm.write_channel(bus, 1, 1000.0, 50.0)

# 同时设置 CH1 和 CH2
pwm.write_channels(bus, 1, [(1000.0, 50.0), (200.0, 20.0)])

# 读取 CH1~CH2
values = pwm.read_channels(bus, 1, 2)

运行完整示例:

python main_pwm4ch.py

以下是 Python 示例程序在 Ubuntu 下的实测结果;

 Modbus RTU PWM Output 4CH Python 示例

C 示例

C 示例位于 c/ 目录:

  • pwm4ch.h:数据结构、错误码和对外接口声明。
  • pwm4ch.c:Modbus RTU 帧组装、CRC 校验、响应检查和设备操作实现。
  • main_pwm4ch.c:完整调用示例,并打印每次通信的 TX、RX 数据帧。
  • Makefile:编译、运行和清理命令。
初始化提示

运行前请在 main_pwm4ch.c 中修改 PWM4CH_DEMO_PORT。Linux 可填写 /dev/ttyUSB0/dev/ttyACM0,Windows 可填写 COM6 等实际端口名称。示例程序不接收命令行参数,修改后需要重新执行 make

pwm4ch_bus_t bus;
pwm4ch_t pwm;

/* 打开串口并初始化地址为 1 的设备。 */
pwm4ch_bus_open(&bus, "/dev/ttyUSB0", 9600);
pwm4ch_init(&pwm, 1);

/* 将 CH1 设置为 1000 Hz、50%。 */
pwm.write_channel(&pwm, &bus, 1, 1000.0, 50.0);

/* 读回 CH1,结果保存在 pwm.channel[0] 中。 */
pwm.read_channel(&pwm, &bus, 1);

pwm4ch_bus_close(&bus);

编译命令:

sudo apt install -y build-essential
cd c
make
./pwm4ch_demo

Windows 使用 MSYS2/MinGW 时执行:

cd c
mingw32-make
.\pwm4ch_demo.exe

C 示例会保存并打印最后一次发送帧 tx、接收帧 rx 和 Modbus 异常码,便于检查设备地址、功能码、寄存器以及 CRC。

 Modbus RTU PWM Output 4CH C 示例

STM32 示例

示例使用的硬件:NUCLEO-F103RB 和 RS485 CAN Shield。

STM32 示例位于 STM32/ 目录,已在 Keil 工程 MDK-ARM/Modbus PWM 4CH.uvprojx 中加入 Src/pwm4ch.cInc/pwm4ch.h

使用 Keil MDK 编译和烧录:

  1. 双击打开 STM32/MDK-ARM/Modbus PWM 4CH.uvprojx
  2. 在 Keil 中选择目标 Modbus PWM 4CH,按 Rebuild 重新编译工程。
  3. 连接下载器并按下Download 烧录程序。
     Modbus RTU PWM Output 4CH STM32 示例下载
  4. 使用SSCOM 串口调试助手打开 USART2 调试串口,参数为 115200, 8N1
  5. 复位开发板,查看设备操作、TX、RX 和运行结果。

示例工程的 RS485 和调试串口引脚如下。

通道STM32F103 引脚连接或用途
RS485 发送PA9 / USART1_TX连接 RS485 收发器 DI
RS485 接收PA10 / USART1_RX连接 RS485 收发器 RO
RS485 方向使能PA8 / GPIO Output同时连接 DE/RE;高电平发送,低电平接收
调试串口发送PA2 / USART2_TX连接串口工具 RX,输出 TX、RX 报文和运行结果
调试串口接收PA3 / USART2_RX示例已初始化,当前演示不读取调试命令

设备函数调用示例:

PWM4CH_Bus pwm_bus;
PWM4CH_Device pwm;

PWM4CH_Init(&pwm, 1);

pwm.write_channel(&pwm, &pwm_bus, 1, 1000.0f, 50.0f);
pwm.read_channel(&pwm, &pwm_bus, 1);

程序复位后通过 USART2 调试串口依次执行设备地址、串口参数、软件版本以及 PWM 通道的读取和写入。

 Modbus RTU PWM Output 4CH STM32 示例

Arduino 示例

示例使用的硬件:UNO PLUS 和 RS485 CAN Shield。

使用 Arduino IDE 编译和上传:

  1. 双击打开 Arduino/Modbus_RTU_PWM_Output_4CH/Modbus_RTU_PWM_Output_4CH.ino

  2. 在 Arduino IDE 中选择开发板 Arduino Uno,并选择开发板对应的串口。

  3. 单击 验证,编译示例程序。

  4. 编译完成后,单击 上传,将程序上传到 UNO PLUS。

  5. 上传完成后,打开 Arduino IDE 的 串口监视器,将波特率设置为 115200

  6. 复位开发板,查看设备操作、TX、RX 和运行结果。

     Modbus RTU PWM Output 4CH Arduino 示例

设备函数调用示例:

SoftwareSerial rs485(2, 8); // RX, TX
ModbusRtuBus bus(rs485, 7); // 串口和 RS485 收发
ModbusRtuPwmOutput4Ch pwm(1); // PWM 设备地址

pwm.writeChannel(bus, 1, 1000.0f, 50.0f);
pwm.readChannel(bus, 1);

const Pwm4ChValue &value = pwm.value(1);

完整示例默认打印每次通信的 TX、RX 报文。无需打印时,注释 .ino 文件开头的 #define PWM4CH_PRINT_FRAMES 即可。

 Modbus RTU PWM Output 4CH Arduino 示例

注意事项

注意事项
  • 修改设备地址或串口参数后,后续通信必须同步使用新参数。
  • 通信失败时,依次检查供电、RS485 A/B 接线、串口权限、设备地址和波特率。