PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Stromversorgung beim AVR



Jacob2
21.07.2009, 13:14
#include <avr/io.h>

int main( void )
{
DDRB = 0xFF;

while( 1 )
{
PORTB = 0xFF;
}
return 0;
}

Dieses Programm funzt bei mir nicht so wie es soll. Über einen Transistor hab ich eine Glühbirne angeschlossen und statt dass die an ist blinkt die! Was kann da sein? Hab auch schon mehrere ATmega8s ausprobiert! Auch wenn die Zuweisung an PORTB nicht in der Schleife steht passiert dasselbe. Könnt ihr mir helfen?

Spessi
21.07.2009, 13:26
Der Code sollte soweit eigentlich passen, nur dass man eigentlich die Endlosschleife ans Ende packt, also:
DDRB = ...;
PORTB = ...;
while(1);

In welcher Frequenz blinkt sie denn ungefähr?

Jacob2
21.07.2009, 14:41
Die Lampe blinkt ca. 2 mal die Sekunde.
Mit der while(1)-Schleife am Ende hab ichs auch schon ausprobiert, hab aber gedacht das dann die Schleife vielleicht wegoptimiert wird, und der Controller immer resettet. Aber geändert hat sich nix.
Ich dachte erst es liegt an irgendwelchen PWM-Einstellungen, da ich auf dem Controller vorher etwas mit PWM ausprobiert hatte, aber auch mit einem anderen fabrikneuen ATmega8 wars dasselbe.

Ich denke das es an irgenwie soetwas wie einem andauerndem Reset liegt, aber eigentlich ist Reset brav mit 4k7 gegen Vcc gelegt. Ich verstehs einfach nicht! Bei einem so einfachen Code! Und die Schaltung hat auch schonmal funktioniert!

askazo
21.07.2009, 15:01
Kann es sein, dass Deine Spannungsquelle nicht genug Strom für die Lampe liefern kann?

Das hört sich nämlich nach folgendem Ablauf an:

- Controller läuft los
- Port wird eingeschaltet
- Transistor schaltet durch
- Strom fließt durch Lampe
- Spannung bricht durch zu hohen Stromfluss zusammen
- Controller geht durch mangelnde Spannung aus
- Transistor sperrt - es fließt kein Strom mehr
- Spannung erholt sich wieder
- das ganze geht von vorne los...

Gruß,
askazo

021aet04
21.07.2009, 15:04
Entferne einmal den Befehl return. Du konntest den Befehl Portb vor die while Schleife setzten und in der while Schleife nichts.

McJenso
21.07.2009, 15:23
Hallo,



da ich auf dem Controller vorher etwas mit PWM ausprobiert hatte


Wie sicher bist du dir, dass du die richtigen hex-Datei flasht?

:twisted:

Gruß

Jens

Jacob2
21.07.2009, 15:33
Hm... Auf askazo's Idee hin hab ich mal nachgemessen scheint wohl so dass der Basiswiderstand zu klein war. hatte 470 genommen mit der annahme das sei schon ok. jetzt gehts auf jeden fall. (mit 4X470 Ohm )

Jacob2
22.07.2009, 10:23
So, jetzt hab ich das nochmal auf einer Lochrasterplatine aufgebaut und jetzt gibts wieder ein Problem: die Spannung bricht wieder ein!
http://www.bilder-hochladen.net/files/thumbs/7cln-4.gif (http://www.bilder-hochladen.net/files/7cln-4-gif.html)
So ist der Schaltplan jetzt, die LED's sollen Glühbirnen sein, die mit PWM angesteuert werden. Wenn der Gesamtstrom auf ca. 9 bis 11mA angestiegen ist scheint irgendwie der Controller neuzustarten bzw. die 5V-Spannung bricht wahrscheinlich ein. Da der Einbruch aber nicht mit dem Multimeter messbar ist (zu träge), kann ich mir nicht ganz sicher sein.
Am Eingang liegen ca. 16V~.

Die Stromquelle kanns nicht sein, wenn ich die Glühbirnchen einfach so anschließe gehen da nämlich locker 50mA durch.

Was kann da sein?

[Edit]: Sorry, ist eigentlich eher was für den Elektronikbereich, aber ich wollte nicht nochmal einen neuen Beitrag zum ähnlichen Thema aufmachen!

021aet04
22.07.2009, 11:16
Schließe einmal die Lapen ab und hänge normale dioden dran. Für was ist der Widerstand vom Spg Regler zu PC6 (R1)?

Hubert.G
22.07.2009, 11:31
Mach einmal den 1µ Elko etwas größer, die beiden Kondensatoren gehören direkt zum Spannungsregler, zusätzlich noch ein Kondensator 100n direkt an VCC des µC.
PC6 ist der Reset des Mega8.
Nicht vergessen auch AVCC zu versorgen, sonst funktioniert PORTC nicht.

Jacob2
22.07.2009, 11:50
Hi,
der Widerstand ist, wie schon gesagt, der Pullup für Reset.
Also ich habe jetzt einen 10µF Elko rein. Die Glühbirne glomm dann auch schön auf. Aber leider ist mir der Elko dann mit einem Ohrenbetäubenden Knall um die Ohren geflogen!!! Was ist da falsch? Der Elko war eigentlich neu!
Passiert sowas bei zu hoher Spannung? Ich muss zugeben, ich habe nämlich nicht draufgeguckt wieviel der verträgt 8-[ aber selbst 16V müssten noch ok gewesen sein...
In meinen Ohren fiept es noch ein bisschen :wink:

021aet04
22.07.2009, 12:02
Es gibt 3 öglichkeiten, warum ein Elko explodiert.
1. Hohe Frequenz, wie in Schaltnetzteilen. => Hast du nicht
2. Zu hohe Spannung. Sollte er aber etwas aushalten.
3. Falsch gepolt oder Wechselspannung. Wechselspannung scheidet aus, da Gleichrichter vorhanden ist.

PS: Richt gut oder? :cheesy:

Edit: Einen Punkt habe ich vergessen, der trifft in deinem Fall aber auch nicht zu. Wenn ein Elko (speziell die größeren z.b. 400V) länger nicht verwendet wurde (über Jahre) kann er auch explodieren. Ein Beispiel sind Frequenzumrichter, die im Lager aufbewahrt werden. Wenn ich einen in der Firma verwende, schließe ich ihn in an einem Regeltrafo an und erhöhe langsam die Spannung

Jacob2
22.07.2009, 12:09
Ja! :cheesy:
Aber 10µF sind doch grundsätzlich ok oder?

021aet04
22.07.2009, 12:15
Hängt von der Leistung ab. Die Lampen haben einen höheren Einschaltstrom. Wenn du einen größeren hast (oder mehrere) versuche einen Anderen (mehrere) anschließen

Hubert.G
22.07.2009, 12:50
Also 47µ oder auch 100µ wären besser.
Du hast geschrieben das du 16V~ hast, das wären dann etwa 22V=, da kann dir ein Elko mit 16V schon um die Ohren fliegen. Ich tippe aber eher auf verkehrt gepolt. Du solltest da einen mit min. 25V verwenden.
Ich sehe nicht wieviel Strom deine Lampen brauchen, aber die 4k7 in der Basis könnte etwas hoch sein, ich würde da max. 2k2 nehmen.
Was sind das genau für Lampen? Daten?

Jacob2
22.07.2009, 13:08
Die Daten hab ich leider nicht, da nichts draufsteht. Da sie aber für die Modellbahn gedacht sind, kann man schonmal auf ca. 16V~ tippen. Strom liegt glaub ich so in der Größenordnung von 50mA.

Ich hab jetzt einen zweiten 10µF eingebaut (extra auf Polarität geachtet usw.) und jetzt geht es. Ich würde es daher auch bei den 10µF belassen.

Letzte Frage aber noch: Die Birnen flackern jetzt etwas und ich würde das PWM Signal gerne mit Kondensatoren etwas glätten. Wie groß müssen die sein, damit die nicht zu wenig Kapazität haben aber auch nicht zu "langsam" sind?

Was die Basiswiderstände angeht: es scheint mir hell genug, also lasse ich es so: "don't touch a running system!"

021aet04
22.07.2009, 13:52
Ich würde die PWM Frequenz einfach erhöhen. Dann sollte nichts mehr flackern. Wenn du das Signal glättest erwärmen sich die Transistoren.

Hubert.G
22.07.2009, 14:02
Ich weiss nicht welche PWM-Frequenz du verwendest, aber schon bei 100Hz sollte da nichts flackern. Wenn doch, dann hat das andere Gründe, eher noch zu kleiner Elko.
Man rechnet für durchschnittliche Siebung 1000µ je A Stromverbrauch, das würde für dich umgerechnet nur 10mA sein. Lampen sind Kaltleiter, das heisst der Widerstand ist beim Einschalten sehr gering, da kann leicht der doppelte Strom fließen. Wenn eine schon leuchtet und die andere schaltet ein, wird die Spannung schwanken.

Jacob2
22.07.2009, 14:45
Leider ist die Frequenz aber schon so hoch wie es geht (ATmega8 ohne Quarz --> 1MHz & Vorteiler=0). Und auf ein Quarz o.ä. wollte ich eigentlich verzichten. Aber eigentlich dürfte bei der Frequenz nix mehr flackern!

markusj
22.07.2009, 16:15
Du bekommst nen ATMega 8 ohne Vorteiler auch auf 8Mhz ...
Und wenn du die PWM-Auflösung reduzierst, steigt die Frequenz ebenfalls (8-Bit => 1Mhz/256, 4-Bit => 1Mhz/16)

mfG
Markus

oberallgeier
22.07.2009, 17:15
Kann es sein, dass ...
- Spannung bricht durch zu hohen Stromfluss zusammen
- Controller geht durch mangelnde Spannung aus ...Solche Problemchen hatten mich eine Weile genervt. Heute nicht mehr. Ich mache zu Beginn meiner Programme immer, gleich nach Initialisierung der Ports und noch bevor irgendwelche Interrupts gesetzt oder Variablen definiert werden, eine Blinkschleife, siehe den folgenden Code, ziemlich weit unten, ab "for(i=0; i<10; i++)" :


// ================================================== ===============================
// ===== Subroutinen ================================================== ===========
// ================================================== ===============================
/*### Programm pausieren lassen !! Der Pausenwert ist nur experimentell !*/

void waitms(uint16_t ms)
{
for(; ms>0; ms--)
{
// uint16_t __c = 4000;
uint16_t __c = 4913; // für m168/20MHz ohne IRS
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}
// ================================================== ===============================
// ===== ENDE Subroutinen ================================================== ===
// ================================================== ===============================


// ================================================== ===============================
// === HAUPTProgramm ================================================== ============
// Initialisierungen, LED1 kurzblinken als Signal für Programmstart

int main(void)
{
uint16_t i;

// Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
DDRB = 0b10011111; // siehe aktuell oben oder Fortschritt/R2D2
PORTB = 0b01100000; // und Port/Pull Ups (1) aktivieren
// DDRB = 0b00011111; // siehe aktuell oben oder Fortschritt/R2D2
// PORTB = 0b11100000; // und Port/Pull Ups (1) aktivieren

DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
PORTC = 0b00000111; // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
//
DDRD = 0b11110000; // -> siehe unter DDRB, sowie PD2,3 extInt
PORTD = 0b00001111; // Pull Ups aktivieren
// Encoder_1 = ExtINT0 = PortD2, Encoder_2 = PortD3

. . . . . . . . . . . .

for(i=0; i<10; i++) // LED auf PD1 blinken lassen
// ###>>> bevor Interrupts erlaubt sind, um ungewollte
// Resets u.ä. besser erkennen zu können
{
PORTD |= (1<<PD1); // LED auf PD1 schalten EIN, HELL
waitms(20); // ... damit man kurze resets besser erkennt
PORTD &= ~(1<<PD1); // LED auf PD1 schalten AUS, Dunkel
waitms(80);
}

PORTD |= (1<<PD1); // LED auf PD1 schalten EIN, HELL
waitms ( 2000);

// ================================================== ==============================
// Testabschnitt(e).
// ================================================== ==============================Dieses typische Blinken kostet kaum Programmplatz und zeigt mir an, dass ein Reset da war . . . . .

Jacob2
22.07.2009, 19:29
Also, das Flimmern hat aufgehört als ich den Kondensator (oben C1) durch einen 100µF Kondensator ersetzt habe.
Vielen Dank allen, die mir geholfen haben, obwohl das eigentliche problem nix mit der Kategorie hier zu tun hatte :wink: