FireBLE

FireBLE 是一个面向于打造智能生活的开源平台,以BLE(Bluetooth Low Energy)技术为核心,拥有超低的功耗、不俗的处理能力和广泛的应用场合,专注于更智能、高效率的工作模式,让生活在科技中更安全、方便、快捷。也许您一个不经意的想法与FireBLE擦出的火花,会在这片原野上燎出火焰,甚至燃烧整个世界。

PWM 驱动

更新时间:2017-08-08 阅读:2511

前言

PWM(pulse-width modulation)指脉宽调制技术,以每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。QN902x包含两路PWM周期和占空比都是8位的PWM输出通道。

初始化

参照例程的system_init进行初始化,配置GPIO。

    SystemInit();
    pwm_io_config();

PWM_CH0使用

首先进行PWM_CH0(GPIO_P27)的测试。
初始化PWM_CH0以及开启PWM中断

pwm_init(PWM_CH0);

配置PWM输出参数

pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(400, PWM_PSCAL_DIV));

  • PWM_PSCAL_DIV为PWM的时钟分频系数,在使用开启Timer Bypass的时候为63,不开启时为15,默认开启。
  • PWM_COUNT_US(1000, PWM_PSCAL_DIV)表示配置PWM的时钟周期为1000us。
  • PWM_COUNT_US(400, PWM_PSCAL_DIV)表示配置PWM的脉冲宽度为400us。


使能PWM_CH0输出

    pwm_enable(PWM_CH0, MASK_ENABLE);

使能后,直接更改PWM的配置,可以实现不同的占空比输出

    pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(800, PWM_PSCAL_DIV));
    pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(1000, PWM_PSCAL_DIV));
    pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(0, PWM_PSCAL_DIV));
    pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(400, PWM_PSCAL_DIV));
    pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(800, PWM_PSCAL_DIV));
    pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(1000, PWM_PSCAL_DIV));
    pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(0, PWM_PSCAL_DIV));
    pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(800, PWM_PSCAL_DIV));

禁止PWM_CH0输出

    pwm_enable(PWM_CH0, MASK_DISABLE);

禁止PWM的IO复用

    pwm_io_dis_config();

PWM_CH1使用

PWM_CH1采用了更大的自定义分频系数配置PWM_CH1的输出。


先初始化PWM_CH1,打开中断。

    pwm_io_config();
    pwm_init(PWM_CH1);

配置PWM_CH1的输出参数,采用了自定义分频系数

    //P2.6 will output pwm wave with period for 1500us and pulse for 1000us
    pwm_config(PWM_CH1, 119, PWM_COUNT_US(1500, 119), PWM_COUNT_US(1000, 119));

使能PWM_CH1的输出

    pwm_enable(PWM_CH1, MASK_ENABLE);
    pwm_io_dis_config();