Forum: Analoge Elektronik und Schaltungstechnik pwm gibt nicht volle Spannung aus


von unecht (Gast)


Lesenswert?

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 ?

von Gast (Gast)


Lesenswert?

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?

von Εrnst B. (ernst)


Lesenswert?

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...

von unecht (Gast)


Lesenswert?

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 ?

von unecht (Gast)


Lesenswert?

Achso ganz übersehn, ein Oszi hab ich leider keins.

von Karl H. (kbuchegg)


Lesenswert?

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.

von unecht (Gast)


Lesenswert?

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

von unecht (Gast)


Lesenswert?

Kann mir sonst vllt jemand mal einen simplen code SEINER pwm geben ?

von Gast (Gast)


Lesenswert?

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.

von Joan P. (joan)


Lesenswert?

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
Noch kein Account? Hier anmelden.