PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit PWM



Wallaby
03.06.2005, 21:58
Hallo!

Ich versuche gerade eine 3 Kanal PWM Steuerung für einem 12F629 mittels Mikrobasic aufzubauen, stoße dabei aber auf einige Probleme. Ich möchte die PWM über den Timer0 erzeugen und steuere zu Testzwecken LEDs an. Allerdings ist es völlig egal, welche Werte ich einstelle, es leuchtet nur die LED an GPIO2, die anderen glimmen leicht. Der Timer ist über einen 1:32 Teiler an den internen Takt gekoppelt. Ich hoffe jemand von euch kann mir helfen, ich probiere jetzt schon seit Stunden rum, finde den Fehler aber nicht. Ich denke das kleine Programm ist selbsterklärend. Vielen Dank im Voraus!

Das Programm:

program PWM

dim rwert as byte
dim gwert as byte
dim bwert as byte

main:
TRISIO = 0
OPTION_REG = %11010100

start:
rwert = 100
gwert = 50
bwert = 10

pwm:
TMR0 = 0
gpio.0 = 1
gpio.1 = 1
gpio.2 = 1
do
select case TMR0
case rwert
gpio.0 = 0
case gwert
gpio.1 = 0
case bwert
gpio.2 = 0
end select
loop until TMR0 = 255
goto pwm

end.

Arexx-Henk
04.06.2005, 10:53
Hallo,

ich bin da nicht sicher (kenne nur 'C") aber ich glaube hier ist ein gedankenfehler

die programm ausfuhrung und die Timer laufen unabhangig von einander

so wenn dein Program

loop until TMR0 = 255
ausfuhrt steht die Timer zur Zeit auf eine beliebigen (undefinierten) Wert (konnte zufallig mahl ab und zu 255 sein)

Mochte mann etwas geschehen lassen bei einem bestimmenten Timerwert dann sollten interrupts verwendet werden.

Es konnte auch noch so sein dass dein Program doch richtig lauft aber mann muss sicher sein dass die Timer viel langsamer zahlt dann die Zeit wie eine 'loop' daurt.

gruss

Henk

Wallaby
04.06.2005, 11:40
Hallo,

Der Timer läuft langsamer als das Programm. Ich habe auch mal den Teiler vergrößert, dann müsste mehr als ausreichend Zeit für das Überprüfen des Wertes sein, aber selbst dann funktioniert es leider nicht.

Hast du oder irgendjemand vielleicht eine andere Idee, wie ich eine PWM für 3 Kanäle aufbauen könnte? Für einen Kanal ist es ja kein Problem, da geht mein Programm sogar, aber mehrere Kanäle bereiten mir Probleme.

Arexx-Henk
04.06.2005, 11:48
Hallo,

gibt es nicht sowas (wie bei 'C') als 'end case'?

select case TMR0
case rwert
gpio.0 = 0
'end case' <===???
case gwert
gpio.1 = 0
'end case' <===???
case bwert
gpio.2 = 0
'end case' <===???
end select
loop until TMR0 = 255
goto pwm

gruss

Henk

Wallaby
04.06.2005, 17:03
Hallo,

nein, so etwas gibt es leider nicht. Trotzdem vielen Dank für deine Unterstützung. Ich habe hier im Forum vorhin einen Code für BASCOM gefunden und ihn für den PIC übersetzt. Vom Prinzip her läuft das, aber da der PIC nur eine Millionen Zyklen pro Sekunde schafft ist es viel zu langsam.

Wie kann ich denn sowas realisieren? Muss doch irgendwie gehen?

Rage_Empire
28.08.2005, 15:15
Nimm einen Atmel (AtMega8), dann klappts ;-)

stowoda
29.08.2005, 18:12
Machs einfach in Assembler!

ps: wollt auch nur mal was sagen was Dir nicht weiter hilft ;)

30.08.2005, 11:55
Versuch mal di timerabfrage nicht auf "=" sondern auf ">" zu ändern.
Im Moment soll der Ausgang eingeschaltet werden, wenn TMR0=rwert ist.
Du musst dann natürlich jeweils einzelne If-Abfragen verwenden. (Ich denke sowas gibts in Basic auch. Ich programiere normalerweise in 'C'.)

lanpc5
03.01.2006, 07:31
Hallo...
Ich beschäftige mich gerade mit einer RGB-Steuerung für LEDs...
(ist sowas wie eine 3-Kanal-pseudo-PWM... klingt gut, oder?)
Wenn noch interesse besteht.... (ich programmiere allerdings in C)

steep
16.01.2006, 04:41
Hallo...
Ich beschäftige mich gerade mit einer RGB-Steuerung für LEDs...
(ist sowas wie eine 3-Kanal-pseudo-PWM... klingt gut, oder?)
Wenn noch interesse besteht.... (ich programmiere allerdings in C)

was versteht man unter 3-Kanal-pseudo PWM?
Deine PWM-Schaltung würde mich schon interessieren. Was für Frequenzen sind da auf allen 3-Kanälen erreichbar?

lanpc5
16.01.2006, 07:47
Nun ja, pseudo PWM, weil es sich nicht um eine richtige Puls-Weiten-Modulation handelt.

Ich lasse das programm mit allen Steueraufgaben einfach immer wieder durchlaufen und vergleiche am ende einen Zähler mit meinem Vorgabewert für die Farbe. (RGB - Steuerung)
Ist der zähler höher als der Wert, leuchtet die jeweilige LED nicht, bei niedrigerem Wert leuchtet sie.

soweit Wäre es ja eine PWM.
Nun wollte ich aber den Strom besser über die Periode verteilen.
Deshalb wird der Zähler nicht um eins erhöht, sondern immer um 12 vor jeder einzelnen Farbe, und am schluss nochmal um 1, damit bei 256 durchläufen auch alle werte je farbe genau einmal erreicht werden.

also:

Anfang:
.
.
.
Zähler=Zähler+12;
Vergleich mit Rot; -> Leuchtet oder nicht
Zähler=Zähler+12;
Vergleich mit Grün; -> Leuchtet oder nicht
Zähler=Zähler+12;
Vergleich mit Blau; -> Leuchtet oder nicht
Zähler++;

goto Anfang

Die Frequenzen habe ich nicht genau bestimmt.
Da ich viele Abfragen und so weiter im Programm habe (ca 450 anweisungen im HEX-File), waren für einen Flimmerfreien Betrieb die 4MHz, die ich anfangs genutzt habe zu wenig. (hat leicht im unteren Helligkeits-Viertel geflimmert)
Deshalb bin ich auf ein 20MHz quarz umgestiegen und da flimmert nix mehr.

Aber wie gesagt, genaue frequenzen...
mal durchrechnen...
Bei einer Helligkeit von 1 (genau 1/256 der Periode an) siht das wohl so aus:
f=20000000/4 (interner Takt) für eine anweisung.
bei 450 Anweisungen wären das dann je Durchlauf:
5000000/450 = 11111.11111 HZ.
Jetzt braucht man 256 Durchläufe für eine Periode...
11111.11111/256 = 43.403 HZ

beträgt nun die Helligkeit 2/256 hat man dann fast die doppelte Frequenz.
Bei 3/256 fast die dreifache...
Bei höheren helligkeiten verteilen sich dann die ON-Zeiten immer gleichmäßiger, jedoch nicht exakt gleichmäßig.
Ich hänge mal ein EXCEL-Tabellchen dran, das meine PWM etwas verdeutlicht.

kalledom
16.01.2006, 13:35
Mit einem PIC 16F877 und einem Quarz mit 4,9152 MHz (wegen 9600 Baud) schaffe ich 8 PWM-Ausgänge mit 100 Hz und Takt-/Pausenverhältnis 0...100%.
Die Software war eigentlich als Flackerlicht für 8 LED-Reihen gedacht, sie kann aber noch wesentlich mehr und ist nicht nur für LED's.
Ich werde in den nächsten Tagen Schaltplan und Software aufbereiten und als Download bereit stellen; bitte Geduld. Die Platine ist schon mal unter: http://www.domnick-elektronik.de/aktuell.htm zu sehen.

kalledom
16.01.2006, 13:48
Ach ja, das Prinzip der 8 PWM-Ausgänge:
Timer 2 löst alle 0,1 ms einen Interrupt aus. Dort werden 8 Zähler von 0...100 (%) bis auf 0 decrementiert, bei 0 wird der jeweilige Ausgang auf Low gesetzt, bei <> 0 auf High.
Nach 10 ms (= 100 Hz) werden die Zähler je nach Modus mit 0...100 (%) neu gesetzt.
Das Programm ist in Assembler geschrieben, da hier Geschwindigkeit gefragt ist und keine Warteschleifen.

lanpc5
16.01.2006, 14:24
@ Kalledom:
PWM ist sicher eine feine Sache.
Ich hatte anfangs vor die internen PWM-Kanäle zweier hintereinander geschalteter PIC16F876 zu nutzen.

Da ich jedoch 70 Ultrahelle LEDs (20xGrün 9000mcd, 30xRot 5000mcd, 30xBlau 4500-6000mcd) mit 20-30mA je Stück (je nach Spannung und Impulsdauer immerhin 1,4 bis 2,1 Ampere) flimmerfrei ansteuern möchte habe ich mir eben überlegt wie man die Ströme besser verteilen könnte.

Darüber gibt es auch auf anderen Seiten und in anderen Artikeln schon reichlich Text.
Habe mir das beste zusammengesucht und eine programmierbare automatische Farbwechselsteuerung gebastelt, die mit einem 14V 1,5A Netzteil auskommt.

MFG
Stefan

kalledom
16.01.2006, 14:37
@lanpc5
Hallo Stefan,
was sind die Gründe, weshalb Du keinen PIC genommen hast ? Mit einem Ausgang einen 'dicken' FET anzusteuern ist doch sicher kein Problem.
Wie steuerst Du den Strom / die Leistung in Deiner Farbwechselsteuerung ?
Kannst Du den Schaltplan Deiner Steuerung irgendwie zeigen ?
Ab welcher Frequenz ist PWM für Dich 'flimmerfrei' ?

lanpc5
16.01.2006, 15:01
@Kalledom:

Ich habe ja einen PIC genommen, eben so nen 16F876.
Die ausgänge wollte ich erst jeweils auf nen FET geben, da fielen mir aber noch 2 ULN2803 in die Hände. =D>
da diese je Kanal 500mA schalten können reicht das mit nem draufgeklebten Alu-Blech aus.
Die Probleme bei der echten PWM gab es eher wegen meinem Netzteil.
Beim Dimmen der Farben pulsierten die im unteren Bereich (bis so 10%) weil die Spannung des Trafos schwankte.
Nen größeren Kondensator als 1000uF wollte ich auch nicht verbauen, aus Platzgründen.
Die Schaltung ist nicht weiter kompliziert...
3 Taster auf Eingänge von PortA mit pullups (10KOhm) und nen ULN2803 an PortB.
da hat man 3 Farben und noch Pins für Status- und Taktanzeige.
2 Taster für schneller bzw. langsamer und einer um die Programme durchzuschalten.
ich komme denk ich bis so 600 instruktionen ohne Interrupte und so aus.
Es würde sicherlich noch eleganter gehen, aber ich bin noch ganz frisch auf dem Gebiet...
=P~

steep
16.01.2006, 15:30
Aber wie gesagt, genaue frequenzen...
mal durchrechnen...
Bei einer Helligkeit von 1 (genau 1/256 der Periode an) siht das wohl so aus:
f=20000000/4 (interner Takt) für eine anweisung.
bei 450 Anweisungen wären das dann je Durchlauf:
5000000/450 = 11111.11111 HZ.
Jetzt braucht man 256 Durchläufe für eine Periode...
11111.11111/256 = 43.403 HZ

beträgt nun die Helligkeit 2/256 hat man dann fast die doppelte Frequenz.
Bei 3/256 fast die dreifache...
Bei höheren helligkeiten verteilen sich dann die ON-Zeiten immer gleichmäßiger, jedoch nicht exakt gleichmäßig.
Ich hänge mal ein EXCEL-Tabellchen dran, das meine PWM etwas verdeutlicht.

Ich verstehe, bei Deiner Schaltung ändert sich also die Frequenz.
Im unternen Bereich dürfte aber bei 43Hz ein starkes flimmern auftreten. Flimmerfrei für das menschliche Auge wird es erst ab 200Hz da die LED's keine merkliche Nachleuchtdauer haben. Wenn es noch für Foto oder Filmaufnahmen verwendbar sein sollte dann müssen es so um die 5'000Hz oder höher sein.

kalledom
16.01.2006, 15:46
@lanpc5
irgendwie ist mir ein Posting von Dir 'durch die Lappen gegangen'.
Du kannst PIC Assembler-Beispiele, bei denen auch ein 1 ms-Interrupt alles 'abarbeitet' unter http://www.domnick-elektronik.de/picasm.htm 'abkupfern'.
Das 8-kanalige PWM- / FlackerLicht-Listing muß ich erst 'aufbereiten'; das dauert einige Tage.
Wenn für das menschliche Auge erst 200 Hz flimmerfrei sind, kann der Timer-Int halbiert und die Quarz-Frequenz verdoppelt werden.

lanpc5
16.01.2006, 16:46
Wie gesagt, ich bin noch nicht so vertraut mit PIC und drumherum.
Das ist mein erstes Projekt.

wegen der Frequenzen... da mein PIC ja nur die Wandbeleuchtung mit verschiedenen Farbfolgrprogrammen steuern soll und auf 3 Taster reagieren soll, ist meine Variante schon ganz gut.
Und wie anhand meiner oben geposteten EXCEL-TABELLE zu sehen ist, ist schon bei 5/256 der vollen Helligkeit eine ausreichend hohe Frequenz gegeben (bei dieser Helligkeit ist in den LEDs gerade einmal ein leuchten zu sehen, an der Wand sieht man erst so ab 15 bis 20/256 , also ab ca 6% Leuchtkraft.)
Werte darunter sind nur für schönere Farben, quasi als Ergänzung für schöneres blau, oder gelberes gelb...

Mein nächstes Projekt wird sich mit PWM für Lüfter, analoger Temperaturmessung, Kontrolle der Fließgeschwindigkeit meines Wassers im PC drehen... mal sehen, vielleicht komme ich ja auch noch auf den Geschmack von echter PWM O:)

In meinem ersten Projekt ging es aber wie schon erwähnt um eine gute RGB-Steuerung mit gleichmäßigerer Stromverteilung...
das habe ich geschafft, glaube ich... :-k

kalledom
26.01.2006, 16:47
Hallo,
ich habe mein Versprechen eingelöst, das Flackerlicht / 8 PWM-Ausgänge mit PIC 16F877 ist ab sofort unter: http://www.domnick-elektronik.de/picpwm.htm mit Schaltplan als PDF-Datei abrufbar.