示例程序
本章说明如何下载、配置并运行 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 通道,通道编号为 1~4。示例库提供以下功能:
| 功能 | C、STM32 | Python | Arduino | Modbus 指令 |
|---|---|---|---|---|
| 读取或设置单路频率 | read_frequency、write_frequency | read_frequency()、write_frequency() | readFrequency()、writeFrequency() | 读 0x03,写 0x10 |
| 读取或设置单路占空比 | read_duty、write_duty | read_duty()、write_duty() | readDuty()、writeDuty() | 读 0x03,写 0x06 |
| 同时读写一路频率和占空比 | read_channel、write_channel | read_channel()、write_channel() | readChannel()、writeChannel() | 读 0x03,写 0x10 |
| 连续读写多个通道 | read_channels、write_channels | read_channels()、write_channels() | readChannels()、writeChannels() | 读 0x03,写 0x10 |
| 读取或设置串口参数 | read_serial_param、write_serial_param | read_serial_parameters()、write_serial_parameters() | readSerialParameters()、writeSerialParameters() | 读 0x03,写 0x06 |
| 读取或设置设备地址 | read_address、write_address | read_device_address()、write_device_address() | readDeviceAddress()、writeDeviceAddress() | 读 0x03,写 0x06 |
| 读取软件版本 | read_version | read_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 下的实测结果;

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。

STM32 示例
示例使用的硬件:NUCLEO-F103RB 和 RS485 CAN Shield。
STM32 示例位于 STM32/ 目录,已在 Keil 工程 MDK-ARM/Modbus PWM 4CH.uvprojx 中加入 Src/pwm4ch.c 和 Inc/pwm4ch.h。
使用 Keil MDK 编译和烧录:
- 双击打开
STM32/MDK-ARM/Modbus PWM 4CH.uvprojx - 在 Keil 中选择目标
Modbus PWM 4CH,按Rebuild重新编译工程。 - 连接下载器并按下
Download烧录程序。
- 使用SSCOM 串口调试助手打开 USART2 调试串口,参数为
115200, 8N1。 - 复位开发板,查看设备操作、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 通道的读取和写入。

Arduino 示例
示例使用的硬件:UNO PLUS 和 RS485 CAN Shield。
使用 Arduino IDE 编译和上传:
-
双击打开
Arduino/Modbus_RTU_PWM_Output_4CH/Modbus_RTU_PWM_Output_4CH.ino。 -
在 Arduino IDE 中选择开发板
Arduino Uno,并选择开发板对应的串口。 -
单击
验证,编译示例程序。 -
编译完成后,单击
上传,将程序上传到 UNO PLUS。 -
上传完成后,打开 Arduino IDE 的
串口监视器,将波特率设置为115200。 -
复位开发板,查看设备操作、TX、RX 和运行结果。
设备函数调用示例:
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 即可。

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