Seiten: [1] 2 3 4
|
 |
|
Autor
|
Thema: Atmel und 4 PWMs (Gelesen 27321 mal)
|
philipp.ni
Dremelfreund

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 100

Ich liebe dieses Forum!
|
hoi. ich will mir ne lüftersteuerung basierend auf nem atmega16 bauen. dabei sollen 4 kanäle per PWM angesteuert werden. der chip hat diese 4 PWMs, aber ich werd aus den Datenblättern net schlau (google gibt garnichts her), wie ich die richtig einstell. ich verwende assembler, darum bringen mir die topics hier auch nix, da die alle in basic gemacht sind. Hat da jemand ne ahnung wie ich die ansteuer, oder ist es besser das irgentwie extern zu realisieren?!
cu philipp
|
|
|
Gespeichert
|
|
|
|
|
philipp.ni
Dremelfreund

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 100

Ich liebe dieses Forum!
|
ok, thx. aber wie stell ich die timer ein? du hast das doch schonmal gemacht, oder? haste nen beispiel-code für mich? ich find einfach nix dazu  die sekündliche abfrage der temperatursensoren werde ich wohl mit nem 555er und normalem interrupt machen 
edit: auserdem hat der mega16 - wie ich gerade bemerkt habe nur 3 timer (2x8bit 1x16bit). der einzige der 4 timer hätte wäre der 162er und der ist a) 2€ teurer und b) hat er keine ad-wandler die ich ja zur temperaturbestimmung brauche...
|
|
« Letzte Änderung: Februar 7, 2005, 19:01:18 von philipp.ni »
|
Gespeichert
|
|
|
|
|
philipp.ni
Dremelfreund

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 100

Ich liebe dieses Forum!
|
damit wir uns richtig verstehen: also muss ich den timer so einstellen, dass er alle 1/100 sek. jumpt und dann dort vllt. anhand eines runterzählenden registers die pwms setzt?! und dann nochmal die frage, WIE setze ich den timer?
|
|
|
Gespeichert
|
|
|
|
|
Freak5
Dremelfreund

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 139

|
Kann man die Spannung aus dem PWM nicht mit einer Spule soweit glätten, dass immer eine Grundspannung vorhanden ist, mit der der Lüfter auch seine Elektronik laufen lassen kann?
|
|
|
Gespeichert
|
|
|
|
b0nze
Gast
|
Du könntest einfach nen Kondi hinten ran hauen, wobei du dann aber ne normale Spannung hättest.
Kommt ganz drauf an, warum du die PWM überhaupt einsetzt (Keine Verluste/ Niedrige Drehzahlen).
Zur PWM-Frequenz (bei Software): CPU-Takt / (TimerTakt*Auflösung)
b0nze
|
|
|
Gespeichert
|
|
|
|
philipp.ni
Dremelfreund

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 100

Ich liebe dieses Forum!
|
die pwm setze ich ein um die lüfter zu steuern wobei mir das steuern wichtiger ist als die verluste... also 5-10% wären mir am ende au egal. ich sollte wohl noch sagen, dass das mein erstes projekt mit mikrocontrolern ist, und ich daher auch noch recht unbeholfen mit den datenblättern bin - mein englisch ist auch nicht das beste (9. Klasse gymnasium eben). das mit dem kondi bringt mich auf eine idee - ich könnte (um eine digitale frequenz zu kriegen) einfach nen 555er auf nen interrupt legen - dann hab ich meine frequenz und das problem mit den timern hab ich auch nicht mehr. wie ich das aus den datenblättern braucht man ja eh nen externen zeitgeber... die sache mit dem register runterzählen gefällt mir von mal zu mal besser - bei 50% Fan hab ich dann bei 20khz frequenz 100steps an und danach 100steps aus. damit ist auch ganz einfach rechenbar (ich hab das einstellen in 10%-schritten geplant) 
wenn ihr nen guten grund dagegen wisst bin ich natürlich immer offen 
thx und cu philipp
|
|
|
Gespeichert
|
|
|
|
b0nze
Gast
|
wie ich das aus den datenblättern braucht man ja eh nen externen zeitgeber...
Zeitgeber ist nen schlechtes Wort Du brauchst ne Taktquelle, mit der der Mikrocontroller arbeitet, einen Quarz mit xMhz. Das braucht man aber immer mit nem MC, höchstens du hast einen der AVR-Mega-Typen oder Tiny, die haben einen eingebauten RC-Oszillator. Der Timer selbst ist einfach nen Ding, dass dir alle xxxTakte nen Interrupt auslöst.
Für ne SoftwarePWM hast du einen Zähler. Der Zähler wird in jedem Interrupt heruntergezählt. Dann hast du deine Werte der Kanäle. Ich machs so: Pins auf 0 und den Zähler auf das Max laden (PWM-Auflösung) Bei jeder ISR (Interrupt Service Routine) den Zähler eins runterzählen und schauen, ob einer der Werte gleich ist wie der Zähler, wenn ja, dann setze den Pin. ... gleiche gleiche gleiche gleiche bis du bei Zähler=0 bist, dann wieder oben anfangen.
Alternativ könnteste nen DA Wandler nehmen... TDA8444 (8 Kanäle).
Um die Lüfter ansteuern zu können brauchste aber noch ne Endstufe. Entweder machste ne analoge Spannung aus der PWM und modifizierst etwas ne NoDrop oder direkt an nen MosFet (gut sind High-Side-Switches, dazu kann Olaf berichten)
b0nze
|
|
|
Gespeichert
|
|
|
|
philipp.ni
Dremelfreund

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 100

Ich liebe dieses Forum!
|
ich verwende nen mega16, werde aber trotzdem n externes Quarz verwenden.
Ich hab jetzt was sehr gutes über timer timer gefunden. ich nehm nen takt von 16MHz und dann erstmal nen prescaler von 8 (TCCR0 auf 0x02) dann müssen es genau 100 schritte bis zum interrupt sein. nur, wie sag ich dem timer wann der counter overflowed ist? Einfach TCNT0 auf 0x64 (dez.: 100) setzen? zu der Endstufe: vertragen die lüfter keine PWM oder wie? ich dachte da einfach an nen transistor, der die 5V vom µC in die 12V für den lüfter umwandelt.
|
|
« Letzte Änderung: Februar 9, 2005, 11:27:54 von philipp.ni »
|
Gespeichert
|
|
|
|
b0nze
Gast
|
Such dir erstmal ne Frequenz aus, mit der der Timer anspringen soll. Besser noch Takte. Du musst ja zwischendrin noch Taster etc. abfragen. Da kommt natürlich die Frage auf, ob du mit Assembler oder C programmierst. Olaf und ich haben in Assembler programmiert und das ist um Massen schneller als C in solchen Sachen. Die ISR muss möglichst kurz sein und das andre sollte natürlich auch nicht lange dauern.
Der Timer hat einmal die Überlauf (Overflow) und einmal die Compare Match Funktion. Für das würde ich der Einfachheitshalber einfach den Compare Match nehmen (CTC = Clear Timer on Compare Match). Da schreibste nen Wert ins OC-Register (OCR0, OCR1AH:L etc.) und dann den richtigen Modus in den Control-Registern einstelllen und dann zählt der Timer mit dem Prescaler immer bis zu dem Wert hoch und löst den IRQ aus und resettet sich. Mit Overflow müsstest du halt immer in jeder ISR einen Preload machen, und zwar bei den 8bittern 256-[gewünschter Wert], damit er nur noch x-Schritte hochzählen muss.
wenn du ne 10%-Auflösung hast, dann sind das ja 10 Schritte. Ich denke 20 wären OK. 16Mhz / 8 = 2Mhz, 2Mhz / 100Hz = 20kHz, 20kHz / 20 Schritte = 1000;
Für nen 8-Bit-Timer brauchste also nen höheren Prescaler.
Für die Ansteuerung kannste auch ne PWM nehmen. Da sind solche HighSideSwitches (teure MosFets) sehr gut. Olaf beim Werkeln
b0nze
|
|
|
Gespeichert
|
|
|
|
philipp.ni
Dremelfreund

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 100

Ich liebe dieses Forum!
|
ich programmier wie oben schon erwähnt in assembler.
was sind die 1000? ich dachte das so: 16Mhz / 8 = 2Mhz, 2Mhz / 100 = 20khz, 20khz / 200 Schritte = 100
d.h. ich nehm die gespeicherte %-zahl mal 2 dann hab ich die possition ab der der port auf 1 geschalten werden muss. dann zähl ich bei jedem interrupt den software-counter runter ("dec fancount") und wenn fancount == fanswitch schalt ich auf 1. damit hab ich theoretisch ne auflößung von 0.5% aber die frage ist ja immer wie ichs dem user präsentier. wenn ich bei jedem erhöhen +10 und bei jedem erniedrigen -10 rechne sinds wieder 5% schritte. ich denke, das ist die einfachste möglichkeit. wenn ich nen prescaler von 256 nehm darf ich bei 10% Fan bei 25.6 umschalten
|
|
|
Gespeichert
|
|
|
|
b0nze
Gast
|
Warum willst du unbedingt auf 0,5%? (5 ProMille ) Olaf hat halt sein Lämpchen und da hatter halt 200 genommen. Aber nen Lüfter da denke ich sind 25-30 Maximal drin...
Wenn man dann mit 20 statt 200 rechnet, ist der Wert, der in das OC-Register geschrieben wird nämlich zu groß für nen 8-bit.
Aber is nur ne Kleinigkeit.
b0nze
|
|
|
Gespeichert
|
|
|
|
philipp.ni
Dremelfreund

Karma: +0/-0
Offline
Geschlecht: 
Beiträge: 100

Ich liebe dieses Forum!
|
wie gesagt ist es mit nem prescaler von 8 später leichter zu rechnen als mit 256 oder 1024 o.ä. was spricht denn gegen 200?
noch was: sind die 5V vom pc-netzteil stabiel genug, oder soll ich 12V und nen 7805er nehmen?
|
|
|
Gespeichert
|
|
|
|
Seiten: [1] 2 3 4
|
|
|
|
|