Forum: Mikrocontroller und Digitale Elektronik Hardware PWM berechnen


von UserMitKleinemProblemchen (Gast)


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.
1
$regfile = "m8def.dat"
2
$crystal = 4000000
3
4
Config Portb.1 = Output
5
6
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 64
7
8
Do
9
 Compare1a = 235
10
 Loop
11
12
End

von Falk B. (falk)


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?

von UserMitKleinemProblemchen (Gast)


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.

von TestX .. (xaos)


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

von UserMitKleinemProblemchen (Gast)


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.

von TestX .. (xaos)


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

von Spess53 (Gast)


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

von UserMitKleinemProblemchen (Gast)


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.

von Spess53 (Gast)


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

von UserMitKleinemProblemchen (Gast)


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"

von Spess53 (Gast)


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

von Falk B. (falk)


Angehängte Dateien:

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

von UserMitKleinemProblemchen (Gast)


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 ?

von Falk B. (falk)


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

von UserMitKleinemProblemchen (Gast)


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.

von Falk B. (falk)


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

von UserMitKleinemProblemchen (Gast)


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.

von UserMitKleinemProblemchen (Gast)


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.

von UserMitKleinemProblemchen (Gast)


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.
1
$regfile = "m8def.dat"
2
$crystal = 4000000
3
4
Config Portb.1 = Output
5
6
   Tccr1a = &B11000000                                      ' output compare A
7
   Tccr1b = &B00011001                                      ' CTC mode 12, prescaler 1
8
9
   Compare1a = 50                                           ' Pulsbreite in Takten
10
11
Do
12
   Capture1 = 39999                                         ' 100 Hz
13
14
15
Loop
16
17
End

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Hhmmm, Mist, falscher Timermodus. Mode 12 macht keine PWM :-(

Siehe Anhang, das sollte jetzt laufen.

MFG
Falk

von Andreas K. (derandi)


Lesenswert?

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

von UserMitKleinemProblemchen (Gast)


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.

von Falk B. (falk)


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.

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.