PWM_LED

Overview

以 AC638N 为例,通过 pwm 脉冲宽度调节控制 led 亮度与亮灭。提供 PWM_LED 的应用示例、工程配置、API 介绍和常见问题。

应用示例

  • 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();
        }
    }
    

工程配置

  • sdk/apps/main.c 中函数 user_main() 添加如下工程代码:

    int user_main()
    {
        extern void pwm_led_test(void);
        pwm_led_test();
    }
    
  • 编译下载后,PC2 接两个 LED 灯,一个是共阳极,一个是共阴极。观察是否两个 LED 灯是否9s和5s交替亮灭。

API参考

PWM_LED 常用相关 API 介绍,具体软件代码见 sdk/bsp/AC638N/src/pwm_led.c

Functions

void pwm_led_init(void *pdata)

PWM_LED模块初始化函数

Parameters:

pdata – 初始化的参数结构体地址:struct pwm_led_platform_data *

void pwm_led_test(void)

PWM_LED参考示例