测试指南
测试环境
-
硬件
-
开发板
-
示波器,用于观察输出 PWM 信号的波形
-
-
软件
-
PC 端的串口终端软件,用于 PC 和开发板进行串口通信
-
RT-Thread 系统自带的
pwm
命令行工具
-
-
软件配置
打开 RT-Thread 系统的 PWM 设备驱动框架,会在启动时注册生成
pwm
命令。
动态配置 PWM
使用 pwm 命令来配置某一通道的步骤如下所示,以通道 3 为例:
- 列示所有 pwm
相关命:
pwm
Usage: pwm probe <device name> - probe pwm by name pwm enable <channel> - enable pwm channel pwm disable <channel> - disable pwm channel pwm get <channel> - get pwm channel info pwm set_pul <channel> <irq_mode> <period> <pulse> <pulse cnt> - set pwm pulse pwm set <channel> <period> <pulse> - set pwm channel info
-
使用 probe 参数,选择一个 PWM 设备(PWM/EPWM)。
pwm 命令只支持 probe 一个设备,假设设备名称为pwm
:pwm probe pwm
系统输出示例如下:probe pwm success
-
使用 set 参数,分别设置通道 3 的周期和占空比。
例如,将周期设置为 1,000,000 微秒,占空比设置为 60%:pwm set 3 1000000 600000
系统输出示例如下:pwm info set on pwm at channel 3
在修改通道 3 的参数时,需要借助示波器来观察确认输出的方波信号是否符合预期。
运行期间也可以动态 set 通道 3 的周期和占空比。例如-
将周期设置为 1,000,000 微秒,占空比设置为 10%:
pwm set 3 1000000 100000
系统输出示例如下:pwm info set on pwm at channel 3
-
再将占空比设置为 90%:
pwm set 3 1000000 900000
系统输出示例如下:pwm info set on pwm at channel 3
-
-
enable 通道 3
pwm enable 3
系统输出示例如下:pwm channel 3 is enabled success
-
使用 set_pul 参数指定数目脉冲输出。
例如,设置中断模式为 0,周期为 1,000,000 微秒,脉冲宽度为 500,000 微秒,脉冲数为 5:pwm set_pul 3 0 1000000 500000 5 pwm pul set on pwm at channel 3 [I] aic_pwm_irq()198 isr cnt:5,disabled the pwm3 interrupt now.
重复上述命令,可以再次触发脉冲输出:pwm set_pul 3 0 1000000 500000 5 pwm pul set on pwm at channel 3 [I] aic_pwm_irq()198 isr cnt:5,disabled the pwm3 interrupt now.
- 使用
pwm_status
查看通道的动作配置。pwm_status In PWM V1.00: Module Enable: 1, IRQ Enable: 0x8 Ch En Mode Tb-clk-rate Def CBD CBU CAD CAU PRD ZRO 00 Up 240000000 - - - - - - - - - - - - 10 Up 240000000 - - - - - - - - - - - - 20 Up 240000000 - - - - - - - - - - - - 31 Up 240000000 - - - Low Hgh - - - - Low Hgh -
通道 3 默认配置为 CAU 动作,所以此处 irq_mode 配置为 0。同时由于 CAU 为 Low,所以输出的脉冲方向为下降沿。
脉冲输出的方向与 action 配置有关,同时指定脉冲数目输出依赖中断,中断模式需要与 action 配置相对应。
其中 irq_mode 范围为 0-3,依次为:-
0: TBCTR=CMPA 且计数器正在递增时触发事件
-
1: TBCTR=CMPA 且计数器正在递减时触发事件
-
2: TBCTR=CMPB 且计数器正在递增时触发事件
-
3: TBCTR=CMPB 且计数器正在递减时触发事件
-
简要编程指南
struct rt_device_pwm *pwm_dev = RT_NULL;
pwm_dev = (struct rt_device_pwm *)rt_device_find("pwm");
if (pwm_dev == NULL) {
rt_kprintf("can't find pwm device!\n");
return -RT_ERROR;
}
rt_pwm_set(pwm_dev, 3, 10000, 5000);
rt_pwm_enable(pwm_dev, 3);
rt_pwm_set_output(pwm_dev, 2, 10000, 5000, 0);
rt_pwm_set_output(pwm_dev, 2, 10000, 2000, 1);
rt_pwm_enable(pwm_dev, 2);
-
RT-Thread PWM 子系统中的 open/read/write/control 接口设计不太友好,建议按照使用上述接口。
-
使用 rt_pwm_set_output 可实现同一 PWM 通道,同一周期下的两种不同占空比输出。