PWM Flicker
PWM Flicker的示例工程用于实现PWM的固定占空比模式。当示例工程工作时,可以通过逻辑分析仪观察其波形为固定占空比的波形,或观察LED闪烁频率为一固定频率。
PWM Flicker示例的源代码和工程文件位于SDK_Folder\projects\peripheral\pwm\pwm_flicker,其中工程文件在文件夹Keil_5下。
代码理解
工程流程图如图 23所示:
- 配置PWM模块。
led1_handle.p_instance = PWM1_MODULE; led1_handle.active_channel = HAL_PWM_ACTIVE_CHANNEL_B; led1_handle.init.mode = PWM_MODE_FLICKER; led1_handle.init.align = PWM_ALIGNED_EDGE; led1_handle.init.freq = 1000; //PWM output freq = 100Hz1000Hz led1_handle.init.channel_b.duty = 50; led1_handle.init.channel_b.drive_polarity = PWM_DRIVEPOLARITY_NEGATIVE; hal_pwm_init(&led1_handle); led2_handle.p_instance = PWM0_MODULE; led2_handle.active_channel = HAL_PWM_ACTIVE_CHANNEL_C; led2_handle.init.mode = PWM_MODE_FLICKER; led2_handle.init.align = PWM_ALIGNED_EDGE; led2_handle.init.freq = 1000; //PWM output freq = 100Hz led2_handle.init.channel_c.duty = 50; led2_handle.init.channel_c.drive_polarity = PWM_DRIVEPOLARITY_NEGATIVE; hal_pwm_init(&led2_handle);PWM详细配置参数请参考PWM Breath。此示例中init.mode选择PWM_MODE_FLICKER。
- 调用led_light()开启PWM FLICKER模式。代码如下:
void led_light(uint8_t id, uint8_t light) { pwm_channel_init_t pwm_channel; pwm_channel.drive_polarity = PWM_DRIVEPOLARITY_NEGATIVE; pwm_channel.duty = (uint16_t)light * 100 / 255; if (id == LED1) { hal_pwm_stop(&led1_handle); hal_pwm_config_channel(&led1_handle, &pwm_channel, HAL_PWM_ACTIVE_CHANNEL_B); hal_pwm_start(&led1_handle); } else if (id == LED2) { hal_pwm_stop(&led2_handle); hal_pwm_config_channel(&led2_handle, &pwm_channel, HAL_PWM_ACTIVE_CHANNEL_C); hal_pwm_start(&led2_handle); } }
测试验证
- 用GProgrammer下载pwm_flicker.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中将会显示PWM执行过程。
- 观察逻辑分析仪其波形为固定占空比的波形,若配置为边缘对齐模式,开启的通道会在占空比周期开始位置对齐;若配置为中心对齐模式,开启的通道会在占空比周期中间以轴对称的方式对齐。观察LED其闪烁频率为一固定频率。