PWM na ATMEGA328P
Napsal: 10 lis 2014, 00:05
Potřebuji změnit PWM z výstupu OC2A na výstup OC2B. Pouhé nastavení modu pinu OC2B a změna registru zdá se nestačí. Je tam jiný zádrhel?
Kód: Vybrat vše
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
void setup()
{
// pinMode(11, OUTPUT); // pin OC2A= PWM output / frequency output
pinMode(3, OUTPUT); // pin OC2B= PWM output / frequency output
Setup_timer2();
// disable interrupts to avoid timing distortion
cbi (TIMSK0,TOIE0); // disable Timer0 available
sbi (TIMSK2,TOIE2); // enable Timer2 Interrupt
}
void loop() {
while(1){}
}
//******************************************************************
// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock
void Setup_timer2() {
// Timer2 Clock Prescaler to : 1
sbi (TCCR2B, CS20);
cbi (TCCR2B, CS21);
cbi (TCCR2B, CS22);
// Timer2 PWM Mode set to Phase Correct PWM
cbi (TCCR2A, COM2A0); // clear Compare Match
sbi (TCCR2A, COM2A1);
sbi (TCCR2A, WGM20); // Mode 1 / Phase Correct PWM
cbi (TCCR2A, WGM21);
cbi (TCCR2B, WGM22);
}
//******************************************************************
// Timer2 Interrupt Service at 31372,550 KHz = 32uSec
ISR(TIMER2_OVF_vect) {
// read value fron ROM sine table and send to PWM DAC
// OCR2A = pgm_read_byte_near(wave256 + icnt);
OCR2B = pgm_read_byte_near(wave256 + icnt);
if(++icnt>255) icnt=0;
}