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的时候,分频输出频率如下公式所示:
PWM 的时钟结构如图所示:
【程序设计】¶
第一步:设置分频参数¶
分频参数和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,则输出常低。
|