最近打算自己做個藍牙接收機,接在四軸上,于是研究下怎么輸出4路PWM。
計劃是用定時器中斷,然后在中斷的時候計算占空比,然后對指定的PIN腳做高低電平的切換。
折騰了半天才大致上了解了這方面的用法,下面的代碼在16M的ATMEGA8芯片上實現(xiàn)了1秒中斷一次。
void setup() {
pinMode(13, OUTPUT);
//禁止中斷
cli();
//TCNT1在這里是累加寄存器,一次時鐘增加一次
//TCNT1 = 0;
// TCCR1控制寄存器
TCCR1A = 0;
TCCR1B = 0;
// OCR1A是累加上限寄存器,調(diào)整這個值就可以控制頻率了
// 這里的15625是這樣計算:16M / 1024 = 15625
OCR1A = 15625;
// 設(shè)置1024分頻
// 這里_BV是個宏,就是 1 << n 的作用,各種設(shè)置bit的寫法好分裂的感覺。
TCCR1B |= (_BV(CS12) | _BV(CS10));
// WGM12控制的CTC模式,就是自己會把TCNT1給清0了,否則要手工清0
TCCR1B |= 1 << WGM12;
// 設(shè)置比較中斷
bitSet(TIMSK, OCIE1A);
//開啟中斷
sei();
}
int flag = 0;
void loop() {
// put your main code here, to run repeatedly:
}
ISR(TIMER1_COMPA_vect) {
if (flag == 0)
{
flag = 1;
digitalWrite(13, HIGH);
}
else
{
flag = 0;
digitalWrite(13, LOW);
}
}