示例代码
PWM Flicker
示例工程实现PWM的固定占空比模式,并改变PWM的频率、占空比等参数,可以通过逻辑分析仪进行波形观察,工程路径:SDK_Folder\projects\peripheral\pwm\app_pwm。
初始化参数
app_pwm_params_t pwm_params = {
.id = APP_PWM0_MODULE,
.pin_cfg = {
.channel_a = {
.type = APP_PWM0_GPIO_TYPE,
.mux = APP_PWM0_GPIO_MUX,
.pin = APP_PWM0_CHANNEL_A,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_ENABLE,
},
.channel_b = {
.type = APP_PWM0_GPIO_TYPE,
.mux = APP_PWM0_GPIO_MUX,
.pin = APP_PWM0_CHANNEL_B,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_ENABLE,
},
.channel_c = {
.type = APP_PWM0_GPIO_TYPE,
.mux = APP_PWM0_GPIO_MUX,
.pin = APP_PWM0_CHANNEL_C,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_ENABLE,
},
},
.active_channel = APP_PWM_ACTIVE_CHANNEL_ALL,
.init = {
.mode = PWM_MODE_FLICKER,
.align = PWM_ALIGNED_EDGE,
.freq = 100,
.bperiod = 500,
.hperiod = 200,
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
.bstoplvl = PWM_STOP_LVL_LOW,
#endif
.channel_a = {
.duty = 30,
.drive_polarity = PWM_DRIVEPOLARITY_POSITIVE,
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
.fstoplvl = PWM_STOP_LVL_LOW,
#endif
},
.channel_b = {
.duty = 50,
.drive_polarity = PWM_DRIVEPOLARITY_NEGATIVE,
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
.fstoplvl = PWM_STOP_LVL_HIGH,
#endif
},
.channel_c = {
.duty = 80,
.drive_polarity = PWM_DRIVEPOLARITY_POSITIVE,
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
.fstoplvl = PWM_STOP_LVL_LOW,
#endif
},
},
};
- id:定义PWM ID
选择APP_PWM0_MODULE,即PWM0
- pin_cfg:配置通道A/B/C引脚
- pin_cfg.channel_a:PWM通道A引脚配置
- pin_cfg.channel_b:PWM通道B引脚配置
- pin_cfg.channel_c:PWM通道C引脚配置
- active_channel:选择激活的通道
选择APP_PWM_ACTIVE_CHANNEL_ALL,激活所有通道
- init:PWM参数配置
- init.mode:采用PWM_MODE_FLICKER,即选择Flicker模式
- init.align:PWM脉冲对齐方式PWM_ALIGNED_EDGE
- init.freq:PWM频率10 MHz
- init.bperiod:PWM在呼吸模式下的呼吸周期为500 ms(Flicker模式下,该参数无效)
- init.hperiod:PWM在呼吸模式下的保持时间为200 ms(Flicker模式下,该参数无效)
- init.bstoplvl:呼吸模式下停止电平:PWM_STOP_LVL_LOW表示停止电平为低电平,PWM_STOP_LVL_HIGH表示停止电平为高电平
- init.channel_a.duty:PWM通道A占空比
- init.channel_a.drive_polarity:PWM输出模式下的驱动极性,PWM_DRIVEPOLARITY_POSITIVE表示正极性,起始电平为低电平;PWM_DRIVEPOLARITY_NEGATIVE表示负极性,起始电平为高电平
- init.channel_a.fstoplvl:Flicker模式下停止电平:PWM_STOP_LVL_LOW表示停止电平为低电平,PWM_STOP_LVL_HIGH表示停止电平为高电平
重要函数
- 初始化函数
ret = app_pwm_init(&pwm_params)
- 开始PWM输出
app_pwm_start(APP_PWM0_MODULE)
- 更新PWM频率
app_pwm_update_freq(APP_PWM0_MODULE, 1000)
- 修改通道参数
app_pwm_config_channel(APP_PWM0_MODULE, APP_PWM_ACTIVE_CHANNEL_B, &channel_cfg)
- 停止指定的通道输出
app_pwm_inactive_channel(APP_PWM0_MODULE, APP_PWM_ACTIVE_CHANNEL_A)
- 停止PWM输出
app_pwm_stop(APP_PWM0_MODULE)
测试验证
用逻辑分析仪观察MSIO0、MSIO1和MSIO2的波形变化,以GR5526为例,下面是观察的波形。
- MSIO0:开始输出波形占空比为30%,频率为100 Hz,然后停止输出,最后设置成频率为1000 Hz,占空比为60%的波形。
- MSIO1:开始输出波形占空比为50%,频率为100 Hz,然后进行了一次极性反转,接着输出为1000 Hz,占空比为20%的波形,最后设置成频率为1000 Hz,占空比为60%的波形。
- MSIO2:开始输出波形占空比为80%,频率为100 Hz,接着改变频率为1000 Hz,最后设置成频率为1000 Hz,占空比为60%的波形。
