Moin ich hab jetzt ein bisschen mit pwm experimentiert und eigentlich läuft soweit alles (rgb Farbwechsel) aber ein Problem hab ich noch: es wird nicht die max. Spannung also die Versorgungsspannung ausgegeben. Ist das normal oder hab ich nen Fehler im code ? #define F_CPU 4000000UL /* Quarz mit 4 Mhz */ #include <avr/io.h> #include <stdint.h> #include <inttypes.h> #include <util/delay.h> #include <avr/interrupt.h> volatile uint8_t led1 = 125; // Rot volatile uint8_t led2 = 135; // Grün volatile uint8_t led3 = 255; // Blau volatile uint8_t pwmcnt0 = 1; volatile uint8_t farben[25] = {0,135,0,125,0,0,0,0,255,125,135,0,125,0,75,0,135,75,125,75,25,125,135,2 55}; ISR(TIMER0_OVF_vect) { ++pwmcnt0 if(pwmcnt0 <= led1) { PORTA |= (1<<PA0); //LED an }else { PORTA &= ~(1<<PA0); //LED aus } if(pwmcnt0 <= led2) { PORTA |= (1<<PA1); //LED an }else { PORTA &= ~(1<<PA1); //LED aus } if(pwmcnt0 <= led3) { PORTA |= (1<<PA2); //LED an }else { PORTA &= ~(1<<PA2); //LED aus } } int main() { DDRA = 0xFF; //A auf Ausgang DDRB = 0x00; //A auf Eingang PORTB = 0xFF; //PullUp's an TCCR0 = (1<<CS00); //prescaler 1 TIMSK = (1<<TOIE0); //Overflow sei(); //interrupts an while(1) { } return 0; } wenn nun wie im code angegeben die LED für Blau den Wert 255 bekommt sollte die Versorgungsspannung ja kontinuierlich aktiv sein und es sollten bei Vcc 5V auch 5V am Pin anliegen, aber gemessen hab ich nur bisschen mehr als 4V. Hab ich irgendwas falsch gemacht oder ist das so ?
Den Code habe ich mir nicht genau angeschaut, interessant wäre noch die Schaltung dazu. Auf den ersten Blick sieht es aber gut aus. Es kann sein, dass unter Last du Ausgangsspannung etwas einbricht, deswegen wäre die Schaltung interessant. Hast du die Möglichkeit, mit einem Oszi mal auf den Pin zu schauen?
Nebenbei:
1 | volatile uint8_t led1 = 125; // Rot |
2 | volatile uint8_t led2 = 135; // Grün |
3 | volatile uint8_t led3 = 255; // Blau |
4 | volatile uint8_t pwmcnt0 = 1; |
5 | volatile uint8_t farben[25] = |
Jedes dieser "volatile"s ist unnötig, und verlangsamt nur deinen Code. Volatile verbietet dem Compiler, Zugriffe auf eine Variable zu optimieren, weil diese in einem Interrupt verändert werden könnte. Deine Zugriffe finden aber alle INNERHALB einer ISR statt, die ihrerseits NICHT unterbrochen werden kann, d.H. der Compiler kann da nicht viel falschmachen. Gerade "pwmcnt0" würde der Compiler wohl liebend gern in einem Register halten...
Danke euch beiden, den Tipp mit "volatile" werde ich mir merken, allerdings ist in der aktuellen Version (woraus ich den wichtigsten Teil gepostet habe) die Möglichkeit gegeben die LED Werte per Hand zu ändern. Hier brauch ich volatile dann wieder. Zum Schaltplan, im Prinzip mit ganz schnell erklärt: Mikrocontroller - LED dazwischen kein Widerstand oder sonstiges. Sitzt alles auf einem Steckbrett + 4Mhz Quarz. Kann der Einbruch der Spannung vielleicht damit zusammen hängen, dass ich im mom keine Kondensatoren verwende ?
unecht wrote: > Mikrocontroller - LED dazwischen kein Widerstand oder sonstiges. > Steckbrett + 4Mhz Quarz. Kann der Einbruch der Spannung vielleicht damit > zusammen hängen, dass ich im mom keine Kondensatoren verwende ? Möglich. Aber spendier der LED erst mal einen Vorwiderstand. Tust du das nicht, wird der Strom durch die LED nur dadurch begrenzt, dass der µC irgendwann nicht mehr genug Strom liefern kann. Dem µC bleibt dann nichts anderes übrig als in der Spannung einzubrechen.
Hmm geht auch nicht. Habe Vorwiderstände in bezug auf die VCC gewählt, also 5V - Versorgungsspannung der LED / 20mA aber nun kommt noch weniger an. Im Moment ist auf dem Steckbrett zu Testzwecken noch ein Transistor (inklusive Vorwiderstand) welcher über VCC versorgt wird allerdings liefert dieser bei einem LED Wert von 255 (Spannungsversorgung sollte ja theoretisch dauerhaft aktiv sein) auch nur max. knapp über 4 V
Kann mir sonst vllt jemand mal einen simplen code SEINER pwm geben ?
Setze den Portpin einfach mal dauerhaft auf HIGH und miss die Spannung ohne Last. Eventuell hast du dir mit der Aktion schon den AVR beschädigt. Wie hoch ist die (gemessene) Versorgungspannung? Miss die Spannung einmal direkt an den Pins des AVR und einmal am Versorgungs-Drähtchen/Batterieclip etc. Und spendiere dem Aufbau mal ein paar 100nF KerKos, eventuell stören die Spannungsspitzen dein Multimeter. Wenn du dir ein billiges Reichelt-Steckbrett geholt hast, dann schau mal nach ob die Kontakte gut sitzen. Ich habe schon einige Bretter gesehen, die von sich aus nicht gut kontaktierten.
Was für LED sollen denn das sein, die 5V Flussspannung haben?! Und alle die gleiche?! Der arme MC.. für LED nimmt man grundsätzlich (bei konstanter Spannungsquelle) je einen Widerstand in Reihe zur Strombegrenzung, weil die LED aufgrund ihrer steilen Kennlinie im Bereich der Flussspannung nahezu jeden Strom durchlässt, was sie letzten Endes thermisch zerstört. Ohne Vorwiderstand übernimmt deine MCU bis zu ihren "Absolute Maximum Ratings" diesen Part (siehe Datenblatt deines Chips), als Strombegrenzer.. zumindest, so lange wie sie das thermisch durchhält. Hast du mal ein Datenblatt von deiner RGB LED? Damit solltest du dann erstmal die Flussspannungen und Ströme für die LED's raussuchen und berechnen (in Abhängigkeit der Helligkeit in Candela der einzelnen LED's bei jeweils maximalem Strom). Damit kann man sich dann Vorwiderstände suchen (in Abhängigkeit von VCC) und dann erst gehts an den Chip. Flussspannung LED = Uled Strom LED = Iled Vorwiderstand R = (VCC-Uled)/Iled Alles andere ist außerhalb der Spezifikationen und auf Dauer nicht empfehlenswert, da früher oder später was kaputt geht.. Die Helligkeit, bzw Farbzusammensetzung steuert man erst danach mittels PWM von 0..100% für jede einzeln ;-) Grüsse PS: ich persönlich bevorzuge es die LED an VCC zu hängen und mit dem Chip gegen Masse zu ziehen (und damit den Strom einzuschalten), da die Masse bei den Chips im Allgemeinen thermisch besser angekoppelt ist und so meistens mehr aushält...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.