www.mikrocontroller.net

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


Autor: Friedrich Keil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Friedrich Keil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Nein, bei Phase Correct nur 15,69kHz

MfG Spess

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, müßte 1 sein.

gruß hans

Autor: Friedrich Keil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.