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
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
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 | }
|
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.
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 ...
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?
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;-)
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?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.