Archiv verlassen und diese Seite im Standarddesign anzeigen : atmega32-PWM-Frequenz
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.
echte PWM mit variabeler Pulslänge, oder eine feste Rechteckfrequenz 800Hz mit gleichlangen High- und Low-Phasen? Welche Taktfrequenz? Wecher Timer kann genutzt werden?
ı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.
Brauchst du sowas:
https://www.roboternetz.de/wiki/uploads/Main/pwm.gif
oder sowas:
http://www.geocities.com/franzglaser/txt/dcdc6.gif
(obere Linie)
?
http://www.geocities.com/franzglaser/txt/dcdc6.gif
(obere Linie)
?
Ja, ich brauche so.
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.
Vielen Dank für ihre Antworte.
İch werde es probieren.
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?
wird das mit 24V am µC nicht ein wenig schwer? :D
ich liebe meinen NPN :P
İch brauche nicht 24V, ich brauche nur ein PWM Signal, 24V ist ein Beispiel.
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.
Wäre OCR1A nicht 0x270F (9999) anstatt 10000?
OCRnX=(Clk/(2*Prescaler*f))-1
Wobei f=800Hz
Gruß
Stefan
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
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.
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
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
@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
İ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
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:)
Vielen Dank für ihre Programierung und Deutsch Unterricht :D
Grüße von Muat, aus der Türkei...
İch habe noch eine Frage, wie kann ich diese PWM signal ein Sinüs Signal machen?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.