PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : atmega32-PWM-Frequenz



muat
25.01.2007, 20:21
Hallo,

Ich arbeite mit atmega32, und brauche 800hz PWM Signal.
Kann jemand mir ein beispiel Programm geben, oder die Bibliothek von PWM für atmega32 in c?
İch habe einige Bibliotheken, aber sie funktioniert nicht.

uwegw
25.01.2007, 20:33
echte PWM mit variabeler Pulslänge, oder eine feste Rechteckfrequenz 800Hz mit gleichlangen High- und Low-Phasen? Welche Taktfrequenz? Wecher Timer kann genutzt werden?

muat
25.01.2007, 20:38
ıch bin ein Schuler inder Türkei, und ich kann nicht sehr gut Deutsch. Deshalb kann ich Sie falsch verstehen.

Taktfrequenz ist 16 mhz. Timer ist egal aber ich denke Timer1 ist besser.

uwegw
25.01.2007, 20:44
Brauchst du sowas:
https://www.roboternetz.de/wiki/uploads/Main/pwm.gif

oder sowas:
http://www.geocities.com/franzglaser/txt/dcdc6.gif
(obere Linie)
?

muat
25.01.2007, 20:47
http://www.geocities.com/franzglaser/txt/dcdc6.gif
(obere Linie)
?

Ja, ich brauche so.

uwegw
26.01.2007, 19:04
Ist es möglich, Pin PD4 oder PD5 zu nutzen? Oder muss es ein anderer Pin sein?

Wie gut kannst du Englisch? Wirf man nen Blick in Datenblatt, Kapitel ´16bit timer/counter 1´. Du brauchst den CTC Mode.




//Benutzt wird PD5 (OC1A)
DDRD|=(1<<PD5); //Pin als Ausgang
TCCR1A|=(1<<COM1A0); //Pin durch den Timer umschalten
TCCR1B|=(1<<WGM12); //CTC mode
TCCR1B|=(1<<CS10); //kein Taktvorteiler
OCR1A=0x2710;
//Diese Befehle am Programmbeginn einmal ausführen, dann läuft der Timer unabhängig vom Hauptprogramm weiter.

muat
26.01.2007, 20:42
Vielen Dank für ihre Antworte.
İch werde es probieren.

muat
26.02.2007, 20:08
Ist es möglich, Pin PD4 oder PD5 zu nutzen? Oder muss es ein anderer Pin sein?

Wie gut kannst du Englisch? Wirf man nen Blick in Datenblatt, Kapitel ´16bit timer/counter 1´. Du brauchst den CTC Mode.




//Benutzt wird PD5 (OC1A)
DDRD|=(1<<PD5); //Pin als Ausgang
TCCR1A|=(1<<COM1A0); //Pin durch den Timer umschalten
TCCR1B|=(1<<WGM12); //CTC mode
TCCR1B|=(1<<CS10); //kein Taktvorteiler
OCR1A=0x2710;
//Diese Befehle am Programmbeginn einmal ausführen, dann läuft der Timer unabhängig vom Hauptprogramm weiter.



İch habe eine Frage über diese Kode.
Wie kann ich "duty cycle" von dieser Signal verandern?

bL1nK
26.02.2007, 20:11
wird das mit 24V am µC nicht ein wenig schwer? :D

ich liebe meinen NPN :P

muat
26.02.2007, 20:18
İch brauche nicht 24V, ich brauche nur ein PWM Signal, 24V ist ein Beispiel.

robocat
26.02.2007, 21:25
hallo muat, here we go:

das programm ist in assembler geschrieben, für den atmega8. ich hatte gerade keinen anderen controller da. ich denke, man muss nicht viel ändern für den atmega32.

es macht ein 800Hz PWM an OC1A bei 16MHz-Takt.


.NOLIST
.INCLUDE <m8def.inc>
.LIST

.def temp = r20

.CSEG
.org 0

; Interupt Vektoren
rjmp init ; Reset Handler
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti ; Timer2 Compare Handler
reti ; Timer2 Overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 CompareA Handler
reti ; Timer1 CompareB Handler
rjmp overflow ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; UDR Empty Handler
reti ; USART TX Complete Handler
reti ; ADC Conversion Complete Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
reti ; Two-wire Serial Interface Handler
reti ; Store Program Memory Ready Handler

init:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge

ldi temp, 2
out DDRB, temp ; Ausgang


ldi temp, (1<<COM1A0)|(1<<COM1A1)|(1<<COM1B1)|(1<<WGM10) ; set PWM mode (phase correct)
out TCCR1A, temp

ldi temp, (1<<CS10)|(1<<CS11)
out TCCR1B, temp

ldi temp, (1<<TOIE1)
out TIMSK, temp

sei ; Generelle Interruptfreigabe

ldi temp, 50 ; <--- hier PWM duty cycle. Achtung! 255 bedeutet 0% duty! kleinerer wert -> grösserer duty-cycle
out OCR1AL, temp


Main: ;----------------------------- Einsprungspunkt Main
nop
rjmp Main

overflow:
ldi temp, 200
out TCNT1L, temp
reti


man braucht den interrupt, um die 800Hz frequenz zu bekommen. vielleicht hilft es dir weiter.

dein deutsch ist gar nicht so schlecht, dafür dass du in der türkei wohnst.

gruesse von der katz

edit: ach so, du wolltest es in c. ist aber nicht schwer zu portieren.

Reeper
26.02.2007, 23:02
Wäre OCR1A nicht 0x270F (9999) anstatt 10000?

OCRnX=(Clk/(2*Prescaler*f))-1

Wobei f=800Hz

Gruß
Stefan

robocat
26.02.2007, 23:18
da weicht mein code sicher noch um einiges mehr von den 800Hz ab, der ist nur PI*daumen (messgerät sagte 49-51Hz bei 1MHz takt). ganz auf die schnelle zamgezimmert.. -.-

was mir selber etwas schleierhaft ist: wieviele pwm stufen ergeben sich eigentlich? die interrupt routine setzt den zähler ja bei überlauf auf 200, ausgang ist dann low. bei comparematch wird er high, zählt bis 255 und dann wieder runter, also 55 stufen? aber, hm, wann findet eigentlich ein überlauf statt, wenn bei 0xFF wieder runtergezählt wird? wäre für erklärungen dankbar. werde das morgen nochmal gründlicher angucken.

gruesse von der katz

muat
28.02.2007, 18:51
Vielen Dank für die Koden und Antworten.
İch probiere die Koden, und es geht, aber ich habe eine Frage.
was muss ich verandern um die Frequenz zu besitimmen?
Diese Kode gibt 480hz mit 16mhz Taktfrequenz.

robocat
28.02.2007, 19:12
2 möglichkeiten:

overflow:
ldi temp, 200 ; <---- diesen wert groesser machen
out TCNT1L, temp
reti
wenn das nicht genuegt, musst du den prescaler ändern:

ldi temp, (1<<CS10)|(1<<CS11)
out TCCR1B, temp
aendern in:

ldi temp, (1<<CS11)
out TCCR1B, temp
danach TCNT1L aendern, bis es passt.

hoffe dass das hilft. du solltest dir das datenblatt ansehen.
(ich auch.. dann wuerde ich nicht mehr um 320Hz danebenliegen) ;)

gruesse

Reeper
28.02.2007, 19:14
Hallo Muat,

was ist denn "Koden" ;-)

Hier mal eine Tabelle (müsste Korrekt sein, wenn nicht, einfach sagen):
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=28175&highlight=
(Link im 1.Beitrag).

Gruß
Stefan

muat
28.02.2007, 19:18
@robocat
ich denke, das ist die Lösüng von meine Problem, ich werde es probieren.

@reeper
İch meinte "code", aber ich weiß nicht genau auf Deutsch. Können Sie mir richtigen Wort sagen?

Reeper
28.02.2007, 19:26
@reeper
İch meinte "code", aber ich weiß nicht genau auf Deutsch. Können Sie mir richtigen Wort sagen?

Achso, alles klar. Code ist allgemein und hier auch üblich.
Wie robocat schon schrieb, steht immens viel im Datenblatt drin.
Dort steht alles über Register und den dazugehörigen Info's (Ansteuerung kann von Atmel zu Atmel untersch. sein). Im Wiki sind auch einige Beiträge mit Codes.
ZB:
https://www.roboternetz.de/wissen/index.php/Timer/Counter_%28Avr%29
(beachte: Fehler:
100.000Hz anstatt 1.000.000Hz
CS20 anstatt CS22)
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

robocat
28.02.2007, 19:30
es gibt kein gescheites deutsches wort, soweit ich weiss, hoechstens programm. ich sage meistens "der code" und programmieren/coden für das verb. man kann "quelltext" sagen für die programmzeilen. (aber keiner sagt "quelltexten" für das schreiben von code) O:)

muat
28.02.2007, 19:40
Vielen Dank für ihre Programierung und Deutsch Unterricht :D

Grüße von Muat, aus der Türkei...

muat
07.03.2007, 18:19
İch habe noch eine Frage, wie kann ich diese PWM signal ein Sinüs Signal machen?