PWM廣泛用于電機(jī)調(diào)速、LED控制器調(diào)光等領(lǐng)域,有些開(kāi)源硬件(如:Arduino)將這種輸出稱之為“模擬輸出”。Rainbow使用的MCU包含四個(gè)通用定時(shí)器,每個(gè)定時(shí)器可以支持四個(gè)通道的PWM輸出,所以理論上我們可以使用的PWM輸出管腳有16個(gè)。Rainbow的軟件設(shè)計(jì)中使用36M時(shí)鐘作為定時(shí)器的計(jì)數(shù)時(shí)鐘,使用12bit的計(jì)數(shù),因此占空比可以在0-100%之間有4096個(gè)不同的PWM輸出等級(jí),對(duì)應(yīng)的PWM波的頻率大約為9K左右。
在Rainbow中進(jìn)行PWM輸出非常簡(jiǎn)單,只需要按照下列步驟即可:
1、設(shè)置對(duì)應(yīng)管腳的輸出模式為:GPIO_Mode_Out_PP,例如:我們使用PA0輸出PWM,pinMode(PA0, GPIO_Mode_Out_PP);
2、調(diào)用pwmWrite()在指定管腳輸出PWM,如:pwmWrite(PA0, 100),表示在PA0口輸出的PWM占空比為:100/4096 * 100%
在軟件包的“Projects\PWM”文件夾包含了本文的完整工程,可以直接編譯、燒寫(xiě)和調(diào)試。來(lái)看看main.cpp的代碼:
#include "WProgram.h"
void setup()
{
//初始化開(kāi)發(fā)板
boardInit();
//設(shè)置LED的輸出模式
pinMode(LED1_PIN, GPIO_Mode_Out_PP);
}
void loop()
{
//先讓LED從暗變亮
for(int16_t i=0; i<0x0FFF; i+=100)
{
pwmWrite(LED1_PIN, i);
//延時(shí)100ms
delay(100);
}
//再讓LED從亮變暗
for(int16_t i=0x0FFF; i>0; i-=100)
{
pwmWrite(LED1_PIN, i);
//延時(shí)100ms
delay(100);
}
}
int main(void)
{
setup();
while(1) loop();
}
程序非常簡(jiǎn)單,在setup()函數(shù)中設(shè)置了PWM輸出管腳的模式為GPIO_Mode_Out_PP,然后通過(guò)一個(gè)循環(huán)使得LED由暗變亮,然后再由亮變暗,周而復(fù)始進(jìn)行。
上面的程序編譯無(wú)誤后,將程序燒寫(xiě)到Rainbow中,我們可以看到板載的LED亮度由暗變亮,然后再由亮變暗。