Hallo Fritz.
Das habe ich für den ATtiny2313 geschrieben. Das kannst du für den 8535
anpassen:
// PWM mit dem Tiny2313. PWM-Ausgang an OC1A(PB3)
#include <iot2313v.h>
#include <macros.h>
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0xFF;
}
void timer1_init(void)
{
TCCR1B = 0x00; // stop Timer
// TC1 arbeitet im PWM-Modus und zählt von 0 bis 2^N -1 und wieder
zurück
// N = 8..10 ( in diesem Beispiel 10Bit PWM ist N=10)
// TC1 zählt also von 0 bis 1023 und zurück von 1023 bis 0.
OCR1A=512; // 50% High 50% Low
// das gilt für nichtinvert. PWM
// OCR1A = 256; // 25% H 75% L
// OCR1A = n (n=1...1023) ==> n/1024 *100% H und der Rest Low
TCCR1A = (1 << WGM11) | (1 << WGM10) | (1 << COM1A1); // nicht inv.
10Bit PWM
TCCR1B = (1<<CS11); // Counterfrequenz = Taktfrequenz = 4MHz
// f(TC1) = 4MHz
// f(PWM) = f(TC1) /((2^(N+1)-2) = 4MHz / (2^11 -2) = 1955 Hz
// T(PWM) = 1/f(PWM) = 511,5us
// bei OCR1A=512 ==> THigh(PWM) = 255,75ms und TLow(PWM) = 255,75ms
// Tein = 255,75ms
// Taus = 255,75ms
// und mit Uein = 5V und Uaus = 0V ergibt sich ein Mittelwert von
// Um = Uaus + (Uein - Uaus)*(Tein/Tpwm) = 0V + (5V -
0V)*255,75/511,5
// Um = 2,5V
// Da Uaus = 0V ist, gilt die vereinfachte Formel:
// Um = 5V * Tein/Tpwm
// Um = 5V * n/1024 (n= 1...1023); n ist der Inhalt des Registers
OCR1A
// Möchte man eine bestimmte Spannung Um einstellen, muss man OCR1A
mit dem
// Wert n = Um * 1024/5 laden.
// Beispiel: Um = 3V ==> OCR1A = 3*1024/5 = 614
}
void init_devices(void)
{
CLI(); //disable all interrupts
port_init();
timer1_init();
}
void main(void)
{
init_devices();
while(1);
}