www.mikrocontroller.net

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


Autor: unecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nebenbei:
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] =
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...

Autor: unecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: unecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso ganz übersehn, ein Oszi hab ich leider keins.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: unecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: unecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir sonst vllt jemand mal einen simplen code SEINER pwm geben ?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joan P. (joan)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.