Forum: Mikrocontroller und Digitale Elektronik möchte attiny24 Phase Correct UND Fast PWM


von Friedrich Keil (Gast)


Lesenswert?

ich habe hier ein problem.

ich möchte mit dem attiny24 die Hardware-PWM benutzen.

ich möchten den internen RC oszillator mit 8 MHz benutzen.
es soll ein PWM-signal mit 50 KHz rauskommen.
ti- und to-Anteil von dem signal sollen
nicht 50/50% sein, sondern möglichst frei einstellbar sein
(z.B. 70/30 oder 90/10).

gleichzeitig benötige ich zu dem PWM-output einen zusätzlichen
output, der den ersten output invertiert ausgibt, also immer auf
low ist, wärend der normale output auf high ist.


das mit dem zusätzlichen invertierten output kann ich,
so wie ich das verstanden habe, aktivieren,
wenn ich einen phase-correct PWM mode auswähle.

das problem ist aber, so wie ich das richtig verstehe, daß
ich bei einem phase-correct PWM mode nur PWM frequenzen
bis ca. 31 khz machen kann.

will ich eine höhere frequenz, muß ich fast-PWM (mode 7) auswählen,
wo ich auswählen kann, daß der Timer früher als 256 zurückgesetzt werden 
kann, aber dann halt es eben akzeptieren muß, daß der 2. timer-output 
nicht als phase-correct benutzt werden kann.

Ich habe auch noch einen 2. timer. wenn ich für den einen PWM den 1. 
8bit timer benutze, könnte den 2. 16bit timer für das invertierte signal 
benutzen. aber kriege ich den 16bit timer so eingestellt, daß er genau 
syncron zu dem 8bit timer läuft?


was sind da eure vorschläge?

kriege ich den phase-correct mode doch so eingestellt, daß er eine 50KHz 
frequenz mit variablem ti/to verhältnis ausspuckt, oder kriege ich der 
pwm im fast pwm mode doch ein zusätzliches invertiertes signal entlockt, 
oder muß ich den 2. 16bit timer zusätzlich benutzen und dafür sorgen, 
daß 8bit und 16bit timer irgendwie syncron laufen?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

du könntest die PW natürlich auch extern invertieren, mit einem Inverter 
oder einem Transistor.

von hans (Gast)


Lesenswert?

Hallo Friedrich,

der Timer1 im Tiny 24 macht das kpl. so wie du willst.

// Target : T24
// Crystal: 8.0000Mhz

#include <iot24v.h>
#include <macros.h>

void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTA = 0x00;
 DDRA  = 0x60;   //PA5 PA6 Ausgang
}

//TIMER1 initialize - prescale:1
// desired value: 50KHz
// actual value: 50,000KHz (0,0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xFF
 TCNT1L = 0x60
 OCR1AH = 0x00;
 OCR1AL = 0xA0;     // PWM-Wert A
 OCR1BH = 0x00;
 OCR1BL = 0xA0;     // PWM-Wert B
 TCCR1A = 0xB0;
 TCCR1B = 0x00; //start Timer
 //Add TCCR1C
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer1_init();

 MCUCR = 0x00;
 TIMSK0= 0x00; //timer interrupt sources
 TIMSK1= 0x00; //timer interrupt sources
 GIMSK = 0x00; //interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//
void main(void)
{
 init_devices();
 //insert your functional code here...
}

Die Auflösung beträgt bei den 50kHz nur Werte von 0-160.
Deine Werte trägst du in OCR1A und OCR1B ein.
Deine Ausgabe hast du auf den PINS PA6 PWMA und PA5 PWMB.

Bei 8Bit Auflösung sind es nur 31,2... kHz
gruß hans

von Friedrich Keil (Gast)


Lesenswert?

ah ok danke. moment mal, warum wird TCCR1B am ende nach der 
setz-prozedur wieder auf 0x00 gesetzt? dann müßte er doch gestoppt sein 
oder?

von spess53 (Gast)


Lesenswert?

Hi

>Bei 8Bit Auflösung sind es nur 31,2... kHz

Nein, bei Phase Correct nur 15,69kHz

MfG Spess

von hans (Gast)


Lesenswert?

Stimmt, müßte 1 sein.

gruß hans

von Friedrich Keil (Gast)


Lesenswert?

hm moment ganz kapier ich das trotzdem noch nicht.
wenn du den Timer TCNT1 auf -160 vor dem überlauf-maximum setzt, dann 
läuft er einmal nach 160 über und fängt dann ganz bei 0 an. es sei denn, 
etwas anderes hindert ihn am überlaufen oder setzt ihn bei jedem 
neu-durchlauf neu auf -160 vor dem überlauf, aber welchen sinn macht es 
dann, den TCNT1 auf FF-60 zu setzen? wie zählt der jetzt überhaupt?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.