Forum: Mikrocontroller und Digitale Elektronik Wieder einmal ne Rolladensteuerung und Probleme


von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Hallo Forum,
ich versuche zur Zeit eine Rolladensteuerung für das Haus meiner Eltern 
umzusetzen.
Später soll ein größerer PIC 18F zum Einsatz kommen, derzeit probiere 
ich mit dem Launchpad MSP430 von TI.
Ich habe mir für die Porterweiterungen den MCP23S17 von Microchip 
ausgesucht. Ich habe nun einen Testaufbau mit diversen Tastern und LEDs 
und mit zwei Transistorausgängen.
An der Stelle liegt momentan der Hase im Pfeffer, da ich das erste mal 
mit Transistoren arbeite. Ich möchte ein Omron Relais ansteuern, dass 
12V/~18mA benötigt, der Controller, bzw. MCP liefert 3,3V. Ich verwende 
den BC547B mit einem Basisvorwiderstand von 1,1k. Nun hab ich mehrere 
Phänomene, die ich nicht richtig erklären kann.
Ich habe den Transistor in Emitterschaltung aufgebaut, das Relais 
bekommt die 12V und ist Richtung Masse mit dem Kollektor des Transistors 
verbunden. Der Transistor schaltet definitiv durch, wenn der 
entsprechende Ausgang high wird und die 18mA fließen. Allerdings fließen 
im Low Zustand auch immer 4mA.
Das Relais ist dadurch immer leicht angezogen und kippt nicht richtig 
beim ansteuern.
Nun meine Frage:
Ist der MCP nicht wirklich auf GND, wenn der Ausgang abgesteuert ist? 
Ich kann keine Spannung messen, hab aber kein Oszi, vll geht es zu 
schnell für das Messgerät. Abhilfe wäre vermutlich ein 1MOhm Widerstand 
von Basis zu GND, aber damit bekämpfe ich ja nicht die Ursache.
Kann ich über die Wahl des Basisvorwiderstandes an der Stelle was 
ändern, theoretisch ja nich viel, außer dass das Relais vll. besser 
kippt. Aber ist auch stress für das Bauteil ständig unter mechanischer 
Spannung zu sein... .

Der Aufbau ist zur Zeit auf Lochraster und alles was mit EMV zu tun hat, 
hab ich garantiert nicht beachtet, ist es an der Stelle wichtig?
Die Versorgung des Launchpads und die 12V für die Relais kommen von dem 
selben Schaltnetzteil. Die Relaismasse ist extra auf das Netzteil 
geführt.
Eine Freilaufdiode hab ich auch an einem Relais, allerdings ist das eine 
größere Gleichrichterdiode, die etwa 10cm vom Relais weg ist. Spielt das 
eine Rolle?
Ein anderes Phänomen was ich hatte, funktioniert jetzt aber, ist, das 
ich den MCP nicht initialisiert bekomme, ohne vorher irgendetwas aus dem 
Launchpad heraus zu schreiben. Ich muss also nach der Initialisierung 
des SPI auf dem Launchpad immer irgendetwas raus schreiben, um danach 
Daten auf den MCP schreiben zu können. Gibts ähnliche Erfahrungen mit 
dem Launchpad? Ich hab in den Errata etwas gefunden, was das Problem 
nicht zu lösen scheint.

Das soll erst mal reichen an der Stelle, für Fragen, Antworten, Ideen 
und Lösungen bin ich dankbar.

Hendrik

von Anja (Gast)


Lesenswert?

Icke Muster schrieb:
> Eine Freilaufdiode hab ich auch an einem Relais, allerdings ist das eine
> größere Gleichrichterdiode, die etwa 10cm vom Relais weg ist. Spielt das
> eine Rolle?

Icke Muster schrieb:
> Der Transistor schaltet definitiv durch, wenn der
> entsprechende Ausgang high wird und die 18mA fließen. Allerdings fließen
> im Low Zustand auch immer 4mA.

Für mich klingt das ganze so als ob entweder auf das falsche Register 
geschrieben wird (PORT-Richtungsregister anstelle Datenregister) oder 
durch den Freilaufstrom der Baustein in den Reset-Zustand kommmt.

Auf jeden Fall scheint der Pull-up des MCP nach dem abschalten aktiv zu 
sein und der Port-Pin auf Input zu stehen.

Frage: was passiert wenn das Relais durch eine LED (+ Vorwiderstand) 
oder einen Widerstand ersetzt wird?

Gruß Anja

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Hallo Anja, sorry, das hab ich vergessen zu sagen, also ich hab sechs 
Ausgänge mit LEDs, die arbeiten wie erwartet, wenn ich den 
entsprechenden Taster für eine LED drücke. Ich kann den Transistor auch 
mit dem Durchgangsprüfer prüfen, das funktioniert, er schaltet durch 
wenn ich den Taster drücke. Die Freilaufdiode ist nur bei einem 
installiert, beide zeigen aber dasselbe Verhalten. Die Diode ist in 
Sperrrichtung parallel zum Relais angeschlossen.
Ich werde heute Abend mal versuchen die Pullup Register auszulesen, ob 
da was nicht sauber geschrieben wird. Ich setze das entsprechende 
Register sogar explizit auf 0. Aber wenn ich den Pin als Ausgang 
konfiguriere, dann sollte normalerweise das Pullup Register ignoriert 
werden, oder?
Was passiert denn dann deiner Meinung, wenn der Pullup aktiv ist? Dann 
müsste ich den Strom messen, der über die 100kOhm fließt, oder? Vll. ist 
der tatsächlich zu klein für mein Messgerät. Leider hab ich kein Relais 
mit, aber das ist ein Ansatz.
Wie auch immer denke ich, es ist trotzdem eine gute Idee noch 1MOhm von 
der Basis gegen GND zu schalten, oder?
Anbei mal noch der Code.
Danke für deine Hilfe.
1
#include "spi.h"
2
#include "MCP23017_SPI.h"
3
unsigned char stateA, stateB;
4
char reverseBits(char b);
5
/*switches led with button on pullup resistor on pin 2 of Bank B*/
6
int main( void )
7
{
8
    stateA = 0;
9
    stateB = 0;
10
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
11
    BCSCTL1 = CALBC1_1MHZ; // Set range
12
    DCOCTL = CALDCO_1MHZ; // SMCLK = DCO = 1MHz
13
14
    P1DIR |= BIT0;            /*pin1 for LED*/
15
16
    spi_init();
17
18
    spi_write8(0xFF);          /*kill rubbish in buffer*/
19
20
    //        //adress to zero
21
    //        spi_cs_assert();
22
    //        spi_write8(BIT6);          /*write to chip --> + chip address 0 + BIT6 (constant)*/
23
    //        spi_write8(IOCONA_0);        /*write to pullup register B*/
24
    //        spi_write8(0x00);          /*pullup pin 2 Bank B*/
25
    //        spi_cs_deassert();
26
27
28
29
    /*init MCP IODIR*/
30
    spi_cs_assert();
31
    spi_write8(BIT6);          /*write to chip --> + chip address 0 + BIT6 (constant)*/
32
    spi_write8(IODIRA_0);        /*write to port direction register A*/
33
    spi_write8(0xFF);          /*all ports input bank A*/
34
    spi_write8(0x00);          /*all ports output bank B*/
35
    spi_cs_deassert();
36
37
    /*pullup on must be initialized after IODIR is set*/
38
    spi_cs_assert();
39
    spi_write8(BIT6);          /*write to chip --> + chip address 0 + BIT6 (constant)*/
40
    spi_write8(GPPUA_0);        /*write to pullup register B*/
41
    spi_write8(0xFF);          /*pullup pin 2 Bank B*/
42
    spi_write8(0x00);
43
    spi_cs_deassert();
44
    /*switch led*/
45
46
    for(;;)
47
    {
48
        P1OUT ^= BIT0;            /*indicate loop*/
49
        spi_cs_assert();
50
        spi_write8(0x41);          /*read from chip --> + chip address + BIT6 (constant)*/
51
        spi_write8(GPIOA_0);
52
        stateA = spi_write8(0x00);      /*dummy evtl. 0x00 probieren*/
53
        spi_cs_deassert();
54
55
        stateA =  reverseBits(stateA);
56
        spi_cs_assert();          /*switch led*/
57
        spi_write8(BIT6);          /*write to chip --> + chip address 1 + BIT6 (constant) BIT0 + BIT1 + BIT6*/
58
        spi_write8(GPIOB_0);        /*write to port direction register A*/
59
        spi_write8(~stateA);          /*write 1 to bank B pin 6*/
60
        spi_cs_deassert();
61
    }
62
63
}/*main*/
64
//
65
// Reverse the order of bits within a byte.
66
// Returns: The reversed byte value.
67
//
68
char reverseBits(char v)
69
{
70
    // swap odd and even bits
71
v = ((v >> 1) & 0x55) | ((v & 0x55) << 1);
72
// swap consecutive pairs
73
v = ((v >> 2) & 0x33) | ((v & 0x33) << 2);
74
// swap nibbles ... 
75
v = ((v >> 4) & 0x0F) | ((v & 0x0F) << 4);
76
77
    return(v);
78
}

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Ich habe gerade noch einmal die Pullup Register ausgelesen. Es ist alles 
so wie erwartet. Register A hat die Pullups an und B aus, so wie sie 
vorher auch konfiguriert werden.

von HildeK (Gast)


Lesenswert?

Icke Muster schrieb:
> Ist der MCP nicht wirklich auf GND, wenn der Ausgang abgesteuert ist?
Muss er nicht unbedingt sein. Wenn ich die Schaltung richtig verstanden 
habe (warum keine Skizze?) und er mit Push-Pull betrieben wird, dann 
sollte er aber auf <100mV gehen.

> Abhilfe wäre vermutlich ein 1MOhm Widerstand
> von Basis zu GND, aber damit bekämpfe ich ja nicht die Ursache.
Das wäre aber schon die richtige Lösung - nur statt 1Meg wäre 1k 
richtig. Die Ursache könnte schon der nicht ausreichende LOW-Pegel sein.

Welchen Transistor hast du denn eingebaut? Falls das Relais mit dem 
Transistor schon einmal ohne Freilaufdiode (1N4148 wäre hier ok.) 
betrieben hast, dann solltest du den auch mal austauschen. Dann könnte 
er nämlich schon hinüber sein ...

von Icke M. (Firma: my-solution) (hendi)


Angehängte Dateien:

Lesenswert?

Ich hab nun noch Mal über die Sache nachgedacht. Mit nicht ausreichendem 
Low Pegel vom MCP meinst du die 100mV? Welche Kenngröße ist das? Ich 
dachte der leakage current und die output low voltage, sind die Größen, 
die es zu beachten gilt.
Mit den Dioden kannst du Recht haben, ich habe es zuerst ohne Diode 
probiert. Allerdings war auch schon der erste Schaltvorgang nicht 
erfolgreich. Welcher Wert des Transistors sagt denn was über diese 
Spannungsfestigkeit aus. Also ich meine welche Größe könnte 
überschritten worden sein um ihn durch die Spule zu zerstören?
Ich werde wenn ich wieder zu Hause bin mal mit neuen Transistoren und 
gleich mit den Dioden was ausprobieren. Da ich den von dir genannten Typ 
noch nicht habe, habe ich eine einfache Gleichrichterdiode verwendet, 
sollte kein Problem sein, oder?
Was ich halt komisch finde ist, dass ich im Ruhezustand keinen Strom zur 
Basis des Transistors messe. Das spricht für Zerstörung, also dass er 
nicht mehr richtig sperrt. Naja, anbei mal das Schaltbild, statt den 
dort gezeichneten Dioden sind wie gesagt dicke schwarze 
Gleichrichterdioden im Testaufbau.
Spielt es mit Diode eigentlich eine große Rolle, wenn der Transistor zu 
sehr in Sättigung geht? Der Vorwiderstand ist ja doch etwas klein 
gewählt.
Ich werde im Layout später noch Platz für einen zusätzlichen Widerstand 
auf GND einplanen. Wieso an der Stelle eigentlich 1k? Da rechne ich 3,3 
mA aus, die ich verschwende. Die 4mA die ungewollt fließen sind im 
Kollektorkreis gemessen. Bei einer Stromverstärkung von 20 sind das ca. 
200µA die zur Basis fließen, oder versteh ich das falsch? Also so 16k 
gegen GND? Ich muss doch theoretisch nur den Strom, der zur ungewollten 
Durchsteuerung führt ableiten, oder?

von Jörn P. (jonnyp)


Lesenswert?

Die max. Spannung eines Transistors ist in Ube angegeben. Um es gleich 
zu sagen, ein 12V Kammrelais ohne Freilaufdiode kann locker eine 
Spannung von 120V generieren. Ein 40V Transistor schaltet ein Relais 
dann nur einmal ein, beim Ausschalten ist er dann schon über den Jordan. 
Auch sollte die Freilaufdiode möglichst direkt an der Spule sein. Wenn 
sie ein paar Lichtjahre entfernt ist, ist sie für die Katz.

Bei der Berechnung mußt du mit der Leistung anfangen, die gebraucht 
wird.
Ein Relais hat einen höheren Anzugstrom und einen Haltestrom.
Wenn man mal von 100mA ausgeht und einer Verstärkung von 50, dann 
brauchts einen Basisstrom von 2 mA. Damit liegt dann der Basiswiderstand 
fest. Damit die Basis nicht in der Luft hängt wenn der µC entfernt ist, 
sollte es noch einen Basis-Emitter Widerstand geben. Die Basisspannung 
zum Durchschalten muss mindestens bei ca. 0,7V über dem Emitter liegen. 
Damit der Transistor auch "satt" durchschaltet rechnen wir mal mit ca 
2V. Damit liegt, über den Daumen gepeilt,  bei 3,3V der Basiswiderstand 
bei so 1k2 und der Widerstand zwischen Basis und Emitter bei ca. 4k7. Na 
dann mal an den Taschenrechner;-)

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Dazu noch eine Frage, woher kommen die 4k7? Wenn ich die 0,7V UBE 
annehme, dann komme ich auf ca. 150µA ist das richtig? Wenn ja, woher 
nimmst du diesen Wert?

von Jörn P. (jonnyp)


Lesenswert?

Um den Basiswiderstand zu finden für 2 mA brauchts 3,3V - 0,7VUBbe / 2mA 
= 1300R. Gibt es so nicht von der Stange, also entweder 1200R oder 
1500R.
(ich hatte 1500R geschätzt)
Denk dir mal den Transistor weg und sieh das Ganze mal in Zeitlupe. Die 
2 Widerstände hängen hintereinander zwischen 3,3V und gnd. Den "oberen" 
haben wir jetzt (1500). Am "unteren" zwischen Basis und Emitter sollen 
ca. 2V abfallen. Ergibt eine Diff. von 3,3V-2V=1,3V. 1,3V / 1500R = 
0,866mA.
Um mit diesen mA einen Spannungsabfall von 2V zu erhalten:
2V / 0,866mA = 2307R (hier hatte ich 4k7 geschätzt, wäre in der Tat ein 
wenig hoch gewesen)
Jetzt mal zur slowmo: Wenn also der strom vom µC durch die Widerstände 
rauscht ist der Transistor vorläufig noch gesperrt. Über dem 
BE-Widerstand baut sich eine Spannung auf, die ohne Transistor ca. 2V 
erreichen würde. Bei ca. 0,7 Volt wird aber die B-E Stecke des 
Transistors shon leitend und schaltet durch. Ich weiss nicht, wie ich es 
dir anders erklären soll. Wenn du es genau willst, musst du die 
errechneten Widerstandswerte durch reale Werte ersetzen und damit 
nochmals nachrechnen. Wichtig ist imho das man die BE-Spannung nicht zu 
niedrig ansetzt und so einen Punkt erwischt, wo der Transistor gerade 
eben anfängt durchzusteuern.

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Haste doch ganz gut erklärt ;). Grundsätzlich ist mir das Ohmsche Gesetz 
vertraut. Auch ein Spannungsteiler sagt mir was. Aber wie gesagt, das 
ist mein erster Transistor, deswegen sind nicht alle Sachen gleich 
schlüssig.
Was ich nicht verstehe ist wo die 2V her kommen. Also warum brauche ich 
einen Spannungsabfall von 2V? Ich habe hier in dem Artikel: 
http://www.mikrocontroller.net/articles/Basiswiderstand dass man 50k - 
1M nutzen soll, um die Basis im Falle eines Resets (--> undefinierter 
Pegel) auf GND zu ziehen. Dass ist ja aber weit von dem entfernt, was du 
z.B. vorschlägst und weiter oben wurde auch schon ein ähnlicher Wert 
genannt. Daher meine Verwirrung. Das ist ja auch irgendwie einleuchtend, 
dadurch wird nicht soviel Strom verbraten. Auch ist der höhere 
Spannungsabfall am Widerstand nicht schlimm, weil im Schaltmoment der 
Spannungsabfall des Transistors zählt und der Strom dort durch 
geht.Damit gint es dann ein definiertes SIgnal an der Basis, wenn nicht 
geschalten wird. Sehe ich da was falsch?
Also danke für alle Erklärungen, ich denke am Ende des Threads werd ich 
es kapiert haben.

von Jörn P. (jonnyp)


Lesenswert?

Die 2V sind einfach ein Erfahrungswert. Die meisten Transistoren steuern 
mit 0,6V auf. Klar kannst du den Wert nehmen. Exemplarsteuerungen bei 
Transistoren und Toleranzwerte der Widerstände können einem aber schon 
den Tag versauen, wenn der Schalttransistor dann gerade eben aufmacht 
und das Relais nicht anzieht, sondern nur langsam gegart wird.Für eine 
Schaltfunktion ist das nix. Hier muss dann schon etwas "satter" 
angesteuert werden. Für mich ist es da einfach "mal eben schnell" einen 
Darlington zu probieren, der ja doppelte BE-Spannung hat (ca.1,4V);-)

Icke Muster schrieb:
> http://www.mikrocontroller.net/articles/Basiswiderstand dass man 50k -
> 1M nutzen soll, um die Basis im Falle eines Resets (--> undefinierter
> Pegel) auf GND zu ziehen. Dass ist ja aber weit von dem entfernt, was du
> z.B. vorschlägst und weiter oben wurde auch schon ein ähnlicher Wert
> genannt. Daher meine Verwirrung. Das ist ja auch irgendwie einleuchtend,
> dadurch wird nicht soviel Strom verbraten. Auch ist der höhere
> Spannungsabfall am Widerstand nicht schlimm, weil im Schaltmoment der
> Spannungsabfall des Transistors zählt und der Strom dort durch
> geht.

Ein Widerstand von 1M als Basecatcher geht imho schon in Richtung kein 
Widerstand. Im Fall von Reset oder entferntem µC hängt die Basisleitung 
dann einfach in der Luft und dient als "Antenne" und je höher der 
Widerstand um so schlechter können Störungen abgeleitet werden.
Aber ich sag dir hier ja nicht, wie du es machen sollst, sondern wie ich 
es machen würde.
Ich nutze auch nie die volle Leistung eines Transistors, sei es die 
Verstärkung oder der Kollektorstrom wie es im Datenblatt angegeben ist, 
das hat mir schon viel Ärger erspart.

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

So, danke erst mal soweit für die Hilfe. Ich hab ne Menge durch diesen 
Thread gelernt. Die Auflösung trau ich mich gar nicht zu nennen. Ich hab 
in irgendeinem meiner zahlreichen Versuche den Transistor gedreht... . 
Ich hab mich nur ganz kurz dafür gehasst ;). Naja auf jeden Fall ging es 
danach mit dem Code und der Beschaltung, vll. hilft es jemandem, der 
ähnliches mit dem Launchpad machen will. Ich bin an der 2kB Grenze 
gescheitert und versuche nun einen Potyo ICD2 mit meinem PIC 18f97j60 
sprechen zu lassen.
Naja, nochmal danke, nun weiß ich wie man Relais richtig ansteuert und 
worauf zu achten ist.

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.