PWM控制器

PWM控制器一共可以输出5路不同的PWM信号,每一路的高电平持续时间、低电平持续时间都可以分别独立进行配置。PWM控制器的时钟源频率也可以进行配置。

【基本特性】

PWM控制器的主要特性如下表所示:

  • PWM控制器时钟源最高可达16MHz,时钟源频率可以进行配置。
  • IO输出最高可达8MHz。(时钟源=16MHz , high_time=low_time=1)
  • 每个PWM通道相互独立,可以分别配置高低电平持续时间,但是公用时钟源。
  • 5路输出,每一路PWM对应的IO口可以进行配置。

【时钟结构】

PWM时钟由系统32MHz时钟生成,经过可配置的分频器之后,送往各路PWM输出。

分频参数CLK_DIV可以进行配置,CLK_DIV取值范围为0x00-0xFF,当CLK_DIV>0的时候,分频输出频率如下公式所示:

../_images/pwm_clk.png

PWM 的时钟结构如图所示:

../_images/pwm_freq.png

【程序设计】

第一步:设置分频参数

分频参数和PWM通道无关,改变分频参数会改变所有PWM通道。

所以不在每个通道的参数设置,而是在宏定义中进行设置。在“app_pwm.h”中,定义了分频参数以及数据结构。

#define ALL_CHANNEL_PWM_CLK_DIV     1

其中“ALL_CHANNEL_PWM_CLK_DIV”即CLK_DIV分频数值,取值范围是0x00-0xFF。参数取值与分频数值如下表所示:

ALL_CHANNEL_PWM_CLK_DIV取值 分频
0 1/2
0x01-0xFF 1/(1+ ALL_CHANNEL_PWM_CLK_DIV)

第二步:实例化PWM对象

app_pwm_inst_t bxpwm = PWM_INSTANCE();

如果使用PWM外设,必须首先声明PWM实例,然后才可以对实例进行操作。

其中“PWM_INSTANCE”宏定义可以进行PWM实例的声明。只需声明一个实例即可,一个实例中包含了5个channel。

第三步:设置PWM的IO口,并初始化

bxpwm.channel[PWM_CHANNEL_0].pin_num = 8;
bxpwm.channel[PWM_CHANNEL_1].pin_num = 9;
bxpwm.channel[PWM_CHANNEL_2].pin_num = 10;
bxpwm.channel[PWM_CHANNEL_3].pin_num = 11;
bxpwm.channel[PWM_CHANNEL_4].pin_num = 12;
app_pwm_init(&bxpwm.inst);

如果用不到5个channel,则可以不进行配置对应的pin_num。

IO设置完毕之后,采用app_pwm_init函数来进行初始化。

第四步:开启或关闭输出:

方式一:配置高低电平

//#define ALL_CHANNEL_PWM_CLK_DIV     1
app_pwm_set_time(&bxpwm.inst , PWM_CHANNEL_0 ,   1 ,   1);      //high:0.0625us     low:0.0625us     period:8MHz
app_pwm_set_time(&bxpwm.inst , PWM_CHANNEL_1 , 160 , 160);      //high:10us         low:10us         period:50kHz
app_pwm_set_time(&bxpwm.inst , PWM_CHANNEL_2 , 160 , 320);      //high:10us         low:20us         period:33.33kHz
app_pwm_set_time(&bxpwm.inst , PWM_CHANNEL_3 , 160 ,   0);      //still high
app_pwm_set_time(&bxpwm.inst , PWM_CHANNEL_4 ,   0 , 160);      //still low

如上述代码所示,参数含义如下表:

参数 含义
hdl 配置哪个PWM实例。
channel 配置哪一个通道
high_time
高电平持续时间,以分频之后的频率来计数。
如果该参数为0,则输出常低。
low_time
低电平持续时间,以分频之后的频率来计数。
如果该参数为0,则输出常高。

方式二:配置频率与占空比

//#define ALL_CHANNEL_PWM_CLK_DIV     1
app_pwm_set_duty(&bxpwm.inst , PWM_CHANNEL_0 , 1000   ,   0);   //still low
app_pwm_set_duty(&bxpwm.inst , PWM_CHANNEL_1 , 1000   , 100);   //still high
app_pwm_set_duty(&bxpwm.inst , PWM_CHANNEL_2 , 1000   ,  10);   //high:100us     low:900us    period:1000us
app_pwm_set_duty(&bxpwm.inst , PWM_CHANNEL_3 , 10000  ,  20);   //high:20us      low:80us     period:100us
app_pwm_set_duty(&bxpwm.inst , PWM_CHANNEL_4 , 100000 ,  30);   //high:3us       low:7us      period:10us

如上述代码所示,参数含义如下表:

参数 含义
hdl 配置哪个PWM实例。
channel 配置哪一个通道
frequency 输出PWM的频率,单位为Hz。(max 160k hz)
percent
PWM的占空比,范围:0~100
如果该参数为100,则输出常高。
如果该参数为0,则输出常低。