Vajk, vielleicht hilft Dir ein bisschen Code weiter (ist für den Mega16
. Da werden in den einzelnen Routinen jeweils die 8bit (Timer 0 und 2) sowie der 16bit Timer (Timer 1) gesetzt
Code:
void pwmInit( void )
{
// enable PWM outputs
DDRD = (1<<6) | (1<<5);
pwmWidth = 0x10;
// initialise time and pwm modes
pwmInit0();
// pwmInit1();
// pwmInit2();
}
void pwmInit0( void )
{
// 8 bit phase correct PWM
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|(1<<WGM00);
// set prescaler for PWM frequency
TCCR0B = (1<<CS01); // This selects prescaler 8. fPWM = F_CPU/(510*Prescaler) = 4.52kHz@18.432MHz
// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
TCNT0 = 0xfe;
// set initial PWM Width
OCR0A = pwmWidth;
OCR0B = 0x03;
}
void pwmInit1( void )
{
// 16 bit phase correct PWM
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
// set prescaler for PWM frequency
TCCR1B = (1<<CS11);
// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
TCNT1 = 0x00fe;
// set initial PWM Width
OCR1A = (uint16_t)pwmWidth;
OCR1B = (uint16_t)0x03;
}
void pwmInit2( void )
{
// 8 bit phase correct PWM
TCCR2A = (1<<COM2B1)|(1<<WGM20);
// set prescaler for PWM frequency
TCCR2B = (1<<CS21);
// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
TCNT2 = 0xfe;
// set initial PWM Width
OCR2B = pwmWidth;
}
Durch Umsetzen der entsprechenden OCRxA und OCRxB Register im Programm, kannst Du das Puls-Pausen Verhältnis ändern.
Lesezeichen