www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hardware PWM berechnen


Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich brauche fuer ein kleines Projekt einen Nadelimpuls mit bei einer 
Frequent einmal 100Hz und einmal 233Hz.

Ich dachte mir das dies am einfachsten mit einem µC gehen wird. Dazu 
habe ich irgendwo im Web ein Programm gefunden, mit dem ich etwas 
gespielt habe. Grundsaetzlich funktioniert es auch aber wie rechne ich 
Quarz und Prescaper so zusammen das ich auf 100Hz bzw. 233Hz komme ? 
beides brauche ich nicht, dass wird mir zu kompliziert. Ich flashe dann 
lieber zwei ATMega8 mit jeweils einer Frequenz.

Das Programm im Anhang.
Danke fuer Eure Muehe, auch wenn ihr nur mal rein seht.
$regfile = "m8def.dat"
$crystal = 4000000

Config Portb.1 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 64

Do
 Compare1a = 235
 Loop

End

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  UserMitKleinemProblemchen (Gast)

>Ich brauche fuer ein kleines Projekt einen Nadelimpuls mit bei einer
>Frequent einmal 100Hz und einmal 233Hz.

Wie breit soll denn der Nadelimpuls sein? 1ns? 1ms?

>Ich dachte mir das dies am einfachsten mit einem µC gehen wird.

Muss nicht sein. Ein einfacher RC-Taktgeber + RC-Hochpass macht auch 
prima Nadelimpulse.

>gespielt habe. Grundsaetzlich funktioniert es auch aber wie rechne ich
>Quarz und Prescaper so zusammen das ich auf 100Hz bzw. 233Hz komme ?

>beides brauche ich nicht, dass wird mir zu kompliziert. Ich flashe dann
>lieber zwei ATMega8 mit jeweils einer Frequenz.

O mein Gott. Soviel Dummheit und Ignoranz tut ja weh. Schon mal was von 
den Grundrechenarten gehört?

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:

> Wie breit soll denn der Nadelimpuls sein? 1ns? 1ms?

Das brauche ich nicht so eng sehen, kurze Spitzen reichen und das kann 
ich ja ueber Compare1a = xxx ziemlich klein stellen.

> Muss nicht sein. Ein einfacher RC-Taktgeber + RC-Hochpass macht auch
> prima Nadelimpulse.

Mag sein aber die AVRs habe ich gerade da und im Prinzip geht es ja 
schon, nur das die Frequenz nicht stimmt.

> O mein Gott. Soviel Dummheit und Ignoranz tut ja weh. Schon mal was von
> den Grundrechenarten gehört?

Noch keinen Kaffee gehabt ? Rumgemotze brauche ich nicht, Hilfe waere 
mir lieber.
Wenn ich wuesste was ich wo rechnen sollte, dann haette ich nicht 
gefragt. Ich habe keine Ahnung vom Programmieren.

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UserMitKleinemProblemchen schrieb:
> Noch keinen Kaffee gehabt ? Rumgemotze brauche ich nicht, Hilfe waere
> mir lieber.
> Wenn ich wuesste was ich wo rechnen sollte, dann haette ich nicht
> gefragt. Ich habe keine Ahnung vom Programmieren.

dann lern es :P
mal ganz im ernst, du musst dich da erstmal reinlesen in das ganze.. und 
vor allem genau beschreiben was du willst.
ein impuls und eine frequenz passen vom sinn her nicht zusammen...
solltest du ein periodisches signal mit einer bestimmten frequenz haben 
wollen so musst du den prescaler soweit anpassen, dass du in den 
gewünschten bereich einkommst (nimm am besten gleich einen 16bit 
timer..). dann musst du das Timer register vorladen um so deine 
gewünschte frequenz mit puls/pause verhältnis genau zu erreichen

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So kompliziert baucht das doch garnicht zu sein.

Ich brauche einmal ein Programm fuer 233Hz und einmal fuer 100. Das 
zusammenzufassen und auf zwei pins auszugeben geht bestimmt, kann ich 
aber nicht, brauche ich auch nicht.

Es geht doch ueber die Zeile...

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 64

...und dem Quarz, recht gut, nur bin ich in der Frequenz etwas zu hoch.

Ich moechte doch nur wissen wie ich ueber die Parameter Quarz, PWM 
(timer) und Prescale auf 100 bzw 233Hz komme. Da muss es doch 
irgendeinen Rechenweg geben.
Das Tastverhaeltnis (compare) interessiert mich erst mal ueberhaupt 
nicht.

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UserMitKleinemProblemchen schrieb:
> Ich moechte doch nur wissen wie ich ueber die Parameter Quarz, PWM
> (timer) und Prescale auf 100 bzw 233Hz komme. Da muss es doch
> irgendeinen Rechenweg geben.
> Das Tastverhaeltnis (compare) interessiert mich erst mal ueberhaupt
> nicht.

PWM_Frequenz = Quarz_Frequenz/Prescaler/Timer_Auflösung

wie du siehst kommst du damit sogut wie nie auf die gewünschte frequenz 
;) daher => timer vorladen

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich moechte doch nur wissen wie ich ueber die Parameter Quarz, PWM
>(timer) und Prescale auf 100 bzw 233Hz komme. Da muss es doch
>irgendeinen Rechenweg geben.

Ja. Steht lang und breit im Datenblatt.

MfG Spess

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi D. schrieb:
> daher => timer vorladen

Ich sehe schon, dass ist komplizierter als ich dachte. Suche ich nach 
"Timer vorladen" finde ich Programmierkurse.
Da nehme ich dann doch lieber den guten alten NE555

Danke fuer den Hilfeversuch.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>wie du siehst kommst du damit sogut wie nie auf die gewünschte frequenz
>;) daher => timer vorladen

Erzähle nicht so einen Müll. Bei AVRs geht das ohne Vorladen.

Die o.g. Frequenzen lassen sich z.B. mit einem 16Bit-Timer und 4MHz mit 
0% bzw. 0.002% Abweichung erzeugen.

MfG Spess

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie waere es wenn Du uns sagst wie, statt hier dem Klugsch... zu 
spielen, wie "Steht im Datenblatt" oder "Erzaehle nicht so einen Muell"

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Datenblatt:

16-bit Timer/Counter1->Modes of Operation->Fast PWM Mode

Und schon hast du die Formel.

In den Timermodes 14 und 15 kannst du mit ICR1 bzw. OCR1A den Top-Wert 
des Zähler und damit die Frequenz einstellen. Mit den Top-werten von 
$270E bzw. $10C2 (bei 4MHz und Prescaler 8) bekommst du deine 
Frequenzen. Mit OCR1A oder OCR1B lässt sich die Pulsbreite einstellen 
(minimal 2µs).

MfG Spess

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:
  • CTC.bas (703 Bytes, 147 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
@  UserMitKleinemProblemchen (Gast)

>So kompliziert baucht das doch garnicht zu sein.

Ist es auch nicht.

>Ich brauche einmal ein Programm fuer 233Hz und einmal fuer 100.

Warum zwei? Das kann man locker in eins packen und per Taster 
umschalten.

>Ich moechte doch nur wissen wie ich ueber die Parameter Quarz, PWM
>(timer) und Prescale auf 100 bzw 233Hz komme. Da muss es doch
>irgendeinen Rechenweg geben.

Ja, siehe das Posting von Andi.

4 MHz / 100 Hz = 40.000
4 MHz / 233 Hz = 17.167

>Das Tastverhaeltnis (compare) interessiert mich erst mal ueberhaupt
>nicht.

Doch, denn das macht dann deine Pulsbreite.

Ach ja, da ist mal wieder das schöne Vorurteile über BASCOM-User. 
Handbuch lesen Fehlanzeige. ;-) Ok, CTC wird von BASCOM nicht direkt 
unterstützt. Hmmm. Ich würde das mal so machen. Siehe Anhang. Ist aber 
nicht getestet, hab keinen ATmega8.

MfG
Falk

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Warum zwei? Das kann man locker in eins packen und per Taster
> umschalten.

Sicher, wenn man es kann. Ich kann es nicht, dass ist ja gerade mein 
Dilemma.

> Ja, siehe das Posting von Andi.

Das Posting von Andi habe ich ja noch halbwegs verstanden nur komme ich 
dann nie auf 100Hz oder 233Hz. Weil eben der prescaler "feste" Werte 
haben muss. Das hatte ich mir einfacher vorgestellt.

> 4 MHz / 100 Hz = 40.000
> 4 MHz / 233 Hz = 17.167

Hmmm ja.

>>Das Tastverhaeltnis (compare) interessiert mich erst mal ueberhaupt
>>nicht.
>
> Doch, denn das macht dann deine Pulsbreite.

Ich will das jetzt nicht unnoetig ausbreiten, aber was hat die 
Pulsbreite mit der Frequenz zu tun ? Die frequenz bleibt doch immer 
gleich, nur duty cycle aendert sich doch. Wenn es eine Sache der 
Progammierung ist, verstehe ich das sowieso nicht.

> Ach ja, da ist mal wieder das schöne Vorurteile über BASCOM-User.
> Handbuch lesen Fehlanzeige. ;-)

Das mag sein, aber ich programmiere nicht, habe also auch kein Handbuch. 
Als ich nach PWM gesucht hatte, kam gleich AVR Hardware PWM, was sich ja 
super einfach anhoert. Also habe ich mal nach Programmen dazu gesucht 
und habe obiges gefunden. Das es jetzt Basic ist, war Zufall. Aber C 
oder asm haette ich wohl noch weniger verstanden, haette es aber auch 
irgendwie getan.

Dein Programm funktioniert leider nicht. Die Schleife laeuft in der 
Simulation, aber es kommt kein Signal.

Was Du da oben jetzt gemacht hast ist doch jetzt keine Hardware PWM 
mehr, oder ?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  UserMitKleinemProblemchen (Gast)

>Das Posting von Andi habe ich ja noch halbwegs verstanden nur komme ich
>dann nie auf 100Hz oder 233Hz. Weil eben der prescaler "feste" Werte
>haben muss. Das hatte ich mir einfacher vorgestellt.

Der Prescaler ist auch Nebensache und wird hier sowieso nicht gebraucht. 
Der Trick heisst CTC, damit kann man beliebige Periodendauern erzeugen.

>Als ich nach PWM gesucht hatte, kam gleich AVR Hardware PWM, was sich ja
>super einfach anhoert.

Ist es auch, aber minimale Kenntnisse werden dennoch benötigt.

>Dein Programm funktioniert leider nicht. Die Schleife laeuft in der
>Simulation, aber es kommt kein Signal.

Und was passiert im REALEN AVR? Wie misst du das?

>Was Du da oben jetzt gemacht hast ist doch jetzt keine Hardware PWM
>mehr, oder ?

Doch, das ist Hardware-PWM.
Ich kann im den Programm keinen Fehler finden, sind ja nur zwei 
Register, welche beschrieben werden müssen, um Timer 1 zu konfigurieren. 
Nur ist das Signal an PB1 invertiert, sprich es ist meist HIGH und nur 
kurze LOW-Pulse. Willst du das anders herum haben, musst du statt dessen 
diesen Wert nehmen

Tccr1a = &B10000000

MFG
Falk

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Und was passiert im REALEN AVR? Wie misst du das?

Ich habe das natuerlich geflasht und ausprobiert, aber das Oszi stellt 
sich strur und zeigt nichts an.
Danach habe ich in diesem Bascom Simulator mal geguckt was sich 
ueberhaupt tut. Dort laeuft das Programm wie es soll durch und bleibt 
dann in der Schleife.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  UserMitKleinemProblemchen (Gast)

>> Und was passiert im REALEN AVR? Wie misst du das?

>Ich habe das natuerlich geflasht und ausprobiert, aber das Oszi stellt
>sich strur und zeigt nichts an.

Kann eine falsche Einstellung sein, Stichwort Trigger. Schliesslich ist 
der Nadelimpuls SEHR schmal, gerade mal 5 Takte, macht ~1us.

Ändere mal die Zeile

Compare1a = 5000

Dann sollte man was sehen, auch ohne gescheiten Trigger.

MfG
Falk

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Siehe Anhang. Ist aber
> nicht getestet, hab keinen ATmega8.

Ich habe noch genuegend andere AVRs da. ATMega 8  88  16  32  644 
ATTiny 2313 90S2313, falls Du selbst mal testen willst oder diese 
einfacher zu programmieren sind.

Es ist auch kein Thema das in C zu machen. Dafuer gibt es jedenfalls 
deutlich bessere Anleitungen im Web. Nur muss ich dazu erst mal wissen 
nach was ich gucken soll. Jetzt erstmal eine Programmiersparache zu 
lernen nur im ein Signal zu erzeugen, ist mir zu uebel, dass wird wohl 
jeder verstehen. Aber mal gucken was noch kommt, evtl. zu einem anderen 
Projekt.

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, auf 5000 geaendert, nichts, eine saubere gerade Linie. Mit dem 
Oszi kann ich ganz gut umgehen, glaube nicht das ich da noch solche 
Fehler mache. Ausserdem hat es eine Auto-Funktion, da sucht es die 
passenden Einstellungen. Klappt auch zu 80%.
Fuses bin ich mir auch ziemlich sicher. Das andere Programm oben geht 
nach wie vor.

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe damit jetzt mal was rumgespielt. Statt ein PWM habe ich einen 
5V Offset. Egal was ich im compare1a einstelle.

Dann habe ich den Schalterkram mal rausgenommen. Muesste doch so auch 
funktionieren ? Macht aber rein garnichts.
$regfile = "m8def.dat"
$crystal = 4000000

Config Portb.1 = Output

   Tccr1a = &B11000000                                      ' output compare A
   Tccr1b = &B00011001                                      ' CTC mode 12, prescaler 1

   Compare1a = 50                                           ' Pulsbreite in Takten

Do
   Capture1 = 39999                                         ' 100 Hz


Loop

End

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:
  • CTC.bas (762 Bytes, 178 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Hhmmm, Mist, falscher Timermodus. Mode 12 macht keine PWM :-(

Siehe Anhang, das sollte jetzt laufen.

MFG
Falk

Autor: Andreas K. (derandi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google anwerfen, "Impulsgenerator" eintippen.
So viel einfacher als mit einfach einen µC zu verwenden, den man nicht 
versteht.

Autor: UserMitKleinemProblemchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk

Super, geht. Zumindest die 100Hz. Sogar fast genau. 99,9994Hz
Die Umschaltung will nicht, dass kann aber jetzt auf die Schnelle auch 
an mir gelegen haben. Aber das will ich jetzt auch selbst raus bekommen.

Jedenfalls ein recht herzliches DANKE SCHOEN fuer Deine Muehe und 
Ausdauer !

@Andreas K.

Jetzt weiss ich das auch und wuerde es nicht nochmal machen. In der Zeit 
haette ich das 5x diskret aufgebaut. Aber wenn man im Web mal nachliest 
"PWM mit µC ist ja 'so' einfach" Ja sieht man wie einfach das ist.
Der Vorteil ist aber jetzt, ich kann dieses Programm beliebig erweitern, 
abaendern oder loeschen und was anderes auf den AVR flashen und habe 
null Verluste.
Deswegen drucken auch gerade die beiden Tutorials von hier, die ich mir 
sicherlich mal ansehen werde. Was kommt weiss ich nicht, sehen wi aber.

Vielen Dank an alle.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  UserMitKleinemProblemchen (Gast)

>Die Umschaltung will nicht, dass kann aber jetzt auf die Schnelle auch
>an mir gelegen haben. Aber das will ich jetzt auch selbst raus bekommen.

Der Taster an PB0 muss nach Masse schalten.

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.