PWM广泛用于电机调速、LED控制器调光等领域,有些开源硬件(如:Arduino)将这种输出称之为“模拟输出”。Rainbow使用的MCU包含四个通用定时器,每个定时器可以支持四个通道的PWM输出,所以理论上我们可以使用的PWM输出管脚有16个。Rainbow的软件设计中使用36M时钟作为定时器的计数时钟,使用12bit的计数,因此占空比可以在0-100%之间有4096个不同的PWM输出等级,对应的PWM波的频率大约为9K左右。
在Rainbow中进行PWM输出非常简单,只需要按照下列步骤即可:
1、设置对应管脚的输出模式为:GPIO_Mode_Out_PP,例如:我们使用PA0输出PWM,pinMode(PA0, GPIO_Mode_Out_PP);
2、调用pwmWrite()在指定管脚输出PWM,如:pwmWrite(PA0, 100),表示在PA0口输出的PWM占空比为:100/4096 * 100%
在软件包的“Projects\PWM”文件夹包含了本文的完整工程,可以直接编译、烧写和调试。来看看main.cpp的代码:
#include "WProgram.h"
void setup()
{
//初始化开发板
boardInit();
//设置LED的输出模式
pinMode(LED1_PIN, GPIO_Mode_Out_PP);
}
void loop()
{
//先让LED从暗变亮
for(int16_t i=0; i<0x0FFF; i+=100)
{
pwmWrite(LED1_PIN, i);
//延时100ms
delay(100);
}
//再让LED从亮变暗
for(int16_t i=0x0FFF; i>0; i-=100)
{
pwmWrite(LED1_PIN, i);
//延时100ms
delay(100);
}
}
int main(void)
{
setup();
while(1) loop();
}
程序非常简单,在setup()函数中设置了PWM输出管脚的模式为GPIO_Mode_Out_PP,然后通过一个循环使得LED由暗变亮,然后再由亮变暗,周而复始进行。
上面的程序编译无误后,将程序烧写到Rainbow中,我们可以看到板载的LED亮度由暗变亮,然后再由亮变暗。