Hier ist mein Testprogramm für PWM:
Code:
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
#include "pwmRoutines.h"
// modifier for PWM signal width
// modification is based on pin interrupts
volatile uint8_t pwmWidth = 0x40;
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);
// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
TCNT0 = 0xfe;
// set initial PWM Width
OCR0A = pwmWidth = 0x10;
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;
}
void pwmRun( void )
{
while (1)
{
;
}
}
pwmInitx() ist jeweils die Initialisierungsroutine für den TimerX. Verwendet wird ein ATMega168. Der pwmWidth Parameter wird in Interruptroutinen modifiziert. Alternativ geht aber das Setzen in pwmRun().
Lesezeichen