Forum: Compiler & IDEs PWM -> 50Hz -> Änderung des Verhältnisses (bei 8 MHz)


von Oliver R. (roliver)


Lesenswert?

Hallo,

ich habe jetzt schon einige beispiele des PWM getestet, doch leider 
keine Lösung gefunden.
Wolle gerne ein Hardware PWM mit 50 Hz erzeugen in dem ich die 
Puls/Pausen Verhältnis
ändern kann.
Mit Soft PWM kein Thema, doch dann habe ich für nix anders mehr zeit ;-)
Der Contoller sollte mit 8Mhz laufen, da ich noch eine Anzeige mit 
steuere.
meine soft Lösung war: (xadc bekommt werte von 0 - 100, durch ADC read 
und Formel)
1
PORTB &= ~_BV(PB1);
2
_delay_ms(19);
3
PORTB |=_BV(PB1); 
4
_delay_ms(1);
oder
1
PORTB &= ~_BV(PB1);
2
_delay_ms(1);
3
PORTB |=_BV(PB1);  
4
_delay_ms(19);
oder
1
x=20/100*xadc;
2
PORTB &= ~_BV(PB1);
3
_delay_ms(x);
4
PORTB |=_BV(PB1); 
5
_delay_ms(20-x);
Gruß

Oliver

von Stefan E. (sternst)


Lesenswert?

Oliver R. schrieb:
> ich habe jetzt schon einige beispiele des PWM getestet, doch leider
> keine Lösung gefunden.
> Wolle gerne ein Hardware PWM mit 50 Hz erzeugen in dem ich die
> Puls/Pausen Verhältnis
> ändern kann.

Gibt es auch irgendeine konkrete Frage, oder soll das ein "macht ihr das 
mal für mich"-Post sein?

Ansonsten:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

von Oliver R. (roliver)


Lesenswert?

meine Frage ist, dass ich das mit den
1
TCCR1A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1);
2
TCCR1B =0;
3
TCCR1B = (1<<CS10);
4
//TCCR1B = (1<<CS11);
5
//TCCR1B |= (1<<CS12);
nicht verstehe, wie ich da auf 50Hz komme?

von Christian (Gast)


Lesenswert?

Du teilst mithilfe eines geeigneten Prescalers deinen "Haupttakt" 
herunter, überlegst dir dann, wie lange der µC für einen "Hochzähltakt" 
braucht und lässt den Timer solange hochzählen, bis du ingesamt auf eine 
Zeit von 1/50 Hz kommst.

Das sind wirklich die Basics! Arbeite das Tutorial durch!

von Oliver R. (roliver)


Lesenswert?

noch nee dumme frage,
wenn ich jetzt den timer auf pre 1024 stelle.
  TCCR1B = (1<<CS10) | (1<<CS12);

OCR1A = 78
sollte doch dann ca. 50ms (25an/25aus) sein?

Das ist dann 50er tastverhltnis,
doch muss ich jetzt in irq die verschiebung regen?

Oder habe ich da noch was nicht verstanden?
Wollte immer ca. 50Hz nur ...
on 10%, off 90% bis on 90% und off 10%
...das will noch nicht kick machen,
bin schon den ganzen tag am tudo...

von Christian (Gast)


Lesenswert?

Willst du jetzt 50ms oder 50 Hz? Du kennst den Zusammenhag zwischen f 
und T ?

von Oliver R. (roliver)


Lesenswert?

ach, mist meinte 20ms und 10ms zu 10ms sorry verschreiben ;-)
laut meiner Rechnung sollte das stimmen,
8 MHZ -> 125 ns, pre 1024 ->  128us * 78 => 10ms oder?

von Christian (Gast)


Lesenswert?

Du teilst den Takt herunter, nicht die Zeit.
8 MHz / 1024 = 7.8125 KHz --> 0.128 ms/Takt

von Oliver R. (roliver)


Lesenswert?

?? also, bei mir sind auch 8MHZ /1024 = 7,8125Khz -> 7812,5 Hz und sind 
doch 0,000128s -> 128 us und f=1/t -> 1/128us = 7,8125 kHz? oder nicht?

aber mir das das mit dem verschieben des Tastverhältnisses noch nicht 
klar und auch nicht in tutorial...?

von Karl H. (kbuchegg)


Lesenswert?

Oliver R. schrieb:
> ?? also, bei mir sind auch 8MHZ /1024 = 7,8125Khz -> 7812,5 Hz und sind
> doch 0,000128s -> 128 us und f=1/t -> 1/128us = 7,8125 kHz? oder nicht?

FAQ: Timer

> aber mir das das mit dem verschieben des Tastverhältnisses noch nicht
> klar und auch nicht in tutorial...?

Was genau ist dir da nicht klar?

Du hast ein Rechtecksignal (ok, du hast 2 Signale im Vergleich)



         +------+                   +------+                    +--...
         |      |                   |      |                    |
         |      |                   |      |                    |
         |      |                   |      |                    |
   ------+      +-------------------+      +--------------------+



         +----------------------+   +-----------------------+   +--...
         |                      |   |                       |   |
         |                      |   |                       |   |
         |                      |   |                       |   |
   ------+                      +---+                       +---+


beide haben die gleiche Frequenz, denn der Abstand von der steigenden 
Flanke bis zur nächsten steigenden Flanke ist in beiden Fällen derselbe.

Der einzige Unterschied: im 2. Signal dauert die High-Phase länger, 
dafür ist die Low-Phase dementsprechend kürzer. Das erste hat einen 
Tastgrad von (über den Däumen) 30%, das zweite hat einen Tastgrad von 
ca. 90%.

Wenn also der Timer für einen kompletten PWM Zyklus (von steigender 
Flanke bis zur nächsten steigenden Flanke) einmal von 0 bis 255 zählen 
muss, dann muss er für die 30% von 0 bis 0.3*255 = 76 zählen, während er 
zur Realisierung der 90% PWM bis 0.9*255 = 229 zählen muss, ehe er dann 
bei Hardware-PWM den Pin wieder auf Low ziehen soll.

Bei Hardware-PWM kann das die Hardware selber machen, bei Software-PWM 
muss man das dann eben in einem Programm nachbilden.

von Christian (Gast)


Lesenswert?

Oliver R. schrieb:
> ?? also, bei mir sind auch 8MHZ /1024 = 7,8125Khz -> 7812,5 Hz und sind
> doch 0,000128s -> 128 us und f=1/t -> 1/128us = 7,8125 kHz? oder nicht?
>
> aber mir das das mit dem verschieben des Tastverhältnisses noch nicht
> klar und auch nicht in tutorial...?

Du hast natürlich recht. 0.128 ms sind natürlich 128 us. Mein Fehler ;-)

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.