4. PWM_LED
Overview
以 AC638N 为例,通过 pwm 脉冲宽度调节控制 led 亮度与亮灭。提供 PWM_LED 的应用示例、工程配置、API 介绍和常见问题。
4.1. 应用示例
PWM_LED 的具体源代码详见 sdk/bsp/AC638N/src/pwm_led.c
pwm_led.c
中参考示例如下:#define PWM_LED_BRI_MODE 0 //呼吸模式和固定模式选择 PWM_LED_PLATFORM_DATA_BEGIN(test_pwm_led_pdata) .port = IO_PORTC_02, //引脚 .inv_prd = 1, //h_pwm和l_pwm一个周期交替输出 .t_cnt_prd = 640, //内部独立计数器计数节拍,即最小时间单位 tc = 640 * (1 / 32000) = 20ms, 即每20ms,cnt加1 .pwm_prd = 320, //pwm的周期 = 320 * (1 / 32000) = 10ms #if PWM_LED_BRI_MODE .mode = 1, //占空比呼吸模式 .mode_1.h_pwm_duty_max = 128, //h_pwm最大占空比,即每过一个pwm周期,占空比变化1,占空比递增时间 = 128 * 10 = 1280ms,占空比递减时间 = 128 * 10 = 1280ms .mode_1.l_pwm_duty_max = 240, //l_pwm最大占空比,即每过一个pwm周期,占空比变化1,占空比递增时间 = 240 * 10 = 2400ms,占空比递减时间 = 240 * 10 = 2400ms .mode_1.h_pwm_duty_max_cnt = 25, //h_pwm占空比增到最大时,维持的时间 = 25 * tc = 25 * 20ms = 500ms .mode_1.l_pwm_duty_max_cnt = 50, //l_pwm占空比增到最大时,维持的时间 = 50 * tc = 50 * 20ms = 1000ms .mode_1.pwm_duty_0_cnt = 100, //pwm呼吸结束后,维持高组态的时间 = 100 * tc = 100 * 20ms = 2000ms //所以h_pwm的总周期 = 2 * 1280 + 500 + 2000 = 5060ms, l_pwm的总周期 = 2 * 2400 + 1000 + 2000 = 7400ms #else .mode = 0, //占空比固定模式 .mode_0.h_pwm_duty = 128, //h_pwm固定占空比:(128 / 320) * 100% = 40% .mode_0.l_pwm_duty = 240, //l_pwm固定占空比: (240 / 320) * 100% = 75% .mode_0.t_cnt0 = 64, //内部计数器cnt在 0 ~ 64 期间,控制引脚一直处于高阻状态,不允许PWM波形输出, 时间 = (64 - 0) * tc = 64 * 20 = 1280ms .mode_0.t_cnt1 = 80, //内部计数器cnt在 64 ~ 80 期间,控制引脚解除高阻态,允许PWM波形输出, 时间 = (80 - 64) * tc = 16 * 20 = 320ms .mode_0.t_cnt2 = 96, //内部计数器cnt在 80 ~ 96 期间,控制引脚一直处于高阻状态,不允许PWM波形输出, 时间 = (96 - 80) * tc = 16 * 20 = 320ms .mode_0.t_cnt3 = 112, //内部计数器cnt在 96 ~ 112 期间,控制引脚解除高阻态,允许PWM波形输出, 时间 = (112 - 96) * tc = 16 * 20 = 320ms //内部计数器cnt在112 ~ 255 期间,控制引脚一直处于高阻状态,不允许PWM波形输出, 时间 = (256 - 112) * tc = 144 * 20 = 2880ms //内部计数器数到255后又从0开始数,循环往复,所以该模式的一个计数周期固定是 256 * tc = 256 * 20ms = 5120ms #endif PWM_LED_PLATFORM_DATA_END() //测试代码要放到 lrc 时钟初始化之后 void pwm_led_test(void) { log_info("******** pwm led test *************"); pwm_led_init((void *)&test_pwm_led_pdata); extern void wdt_clr(); while (1) { wdt_clr(); } }
4.2. 工程配置
在 sdk/apps/main.c 中函数
user_main()
添加如下工程代码:int user_main() { extern void pwm_led_test(void); pwm_led_test(); }
编译下载后,PC2 接两个 LED 灯,一个是共阳极,一个是共阴极。观察是否两个 LED 灯是否9s和5s交替亮灭。
4.3. API参考
PWM_LED 常用相关 API 介绍,具体软件代码见 sdk/bsp/AC638N/src/pwm_led.c