Samstag, 14. September 2013

Raspberry Pi - Mach mir das Autoradio! (Teil 1)

1. Übersicht  


Autoradio?! Warum will man sich selber ein Autoradio bauen, wenn man diese doch in allen Auführungen kaufen kann?

Die Idee ist eine modulare Plattform zu haben, welche nach und nach beliebig erweitert werden kann. Die Basis bilden der Raspberry Pi und der von diesem gesteuerte FM-Tuner Si4703. Normalerweise hat ein Autoradio z.B. an der Front ein Display eingelassen. Dieses Konzept erlaubt mir aber auch ein Smartphone oder Tablet als Display zu nutzen. Unterstützung für GPS, Bluetooth, WiFi, etc. lassen sich vergleichsweise einfach nachrüsten. Der RPi kann auch auf beliebige Arten online gehen, womit sich dann unter anderem Verkehrs- und Wetterdaten abrufen lassen. Interessant ist auch die Anbindung des Fahrzeugdiagnosesystems (OBD). Desweiteren ist auch eine Musiksammlung, gespeichert auf einem internen Massenspeicher, fest eingeplant. Diese soll sich mit einem passenden Endgerät (Smartphone, Laptop, etc.) synchronisieren lassen.

Raspberry Pi Rev.2 (www.raspberrypi.org)
Okay, Autoradio schön und gut, jedoch wie darf man sich den Aufbau vorstellen?

Zunächst einmal braucht man ein Gehäuse, in diesem Fall ein leeres ISO 7736 Gehäuse ohne Frontabdeckung, jedoch mit rückseitiger Anschlussleiste. Das Herzstück ist ein Raspberry Pi (Modell B, 512 MB) mit Raspbian "Wheezy" an dem das FM-Tuner Board Si4703 von SparkFun (Silicon Labs) angeschlossen ist.

FM-Tuner Board Si4703 (www.sparkfun.com)

Einen DC/DC-Wandler um aus der 12V Boardspannung 3.3V und 5V für Tuner und RPi zu erzeugen. Weiters wird auch ein Leistungsverstärker für das Audiosignal vom Tuner zu den Lautsprechern benötigt. Die Frontabdeckung wird wohl eine besondere Herausforderung werden, da ich diese mittels 3D-Druck erstellen möchte.

Der erste Schwerpunkt wird die Ansteuerung des FM-Tuners sein.

2. Ansteuerung des FM-Tuners



Laut Datenblatt kann man mit dem Chip via 2-Wire und 3-Wire kommunizieren. Wir verwenden 2-Wire, was im Prinzip I²C ist.

Unter Raspbian muss man zunächst das I²C-Subsystem zum laufen bringen. Dafür wird zunächst folgender Befehl ausgeführt:
sudo nano /etc/modules
Anschließend fügt man folgende zwei Zeilen hinzu:
i2c-bcm2708
i2c-dev
Damit werden beide Module beim Booten automatisch geladen.
sudo modprobe i2c-bcm2708
sudo modprobe i2c-dev
sudo apt-get install i2c-tools
Nun werden die Module sofort geladen und der wichtige Befehl i2cdetect installiert.

Wenn man sich ein wenig mit I²C beschäftigt fliegen einem ein paar weitere Begriffe wie 2-Wire/TWI und SMBus um die Ohren. I²C, TWI (Two Wire Interface) und SMBus (Service Message Bus) sind 2-Draht-Protokolle, welche untereinander weitgehend, für Taktfrequenzen bis 100 kHz, kompatibel sind.

Der FM-Tuner muss zuerst auf 2-Wire initialisiert werden, damit wir mit ihm sprechen können. Dies lässt sich einfach via GPIO bit-banging realisieren, und müssen dabei auch nicht schnell sein. Die Installation von wiringPi wird hier beschrieben.
/* i2c-init.c */
#include <wiringPi.h>

int main() {
    int resetPin = 23; // GPIO23
    int sdaPin = 0; // GPIO0

    /* Setup GPIO access in BCM mode */
    wiringPiSetupGpio();

    /* Set pins as output */
    pinMode(resetPin, OUTPUT);
    pinMode(sdaPin, OUTPUT);

    /* A low SDA indicates a 2-wire interface */
    digitalWrite(sdaPin, LOW);
    /* Put chip into reset */
    digitalWrite(resetPin, LOW); 
    /* 1ms delay to allow pins to settle */ 
    delay(1);
    /* Bring chip out of reset with SDIO set low
    and SEN pulled high (with pull-up resistor) */
    digitalWrite(resetPin, HIGH); 

    return 0;
}
Die Datei i2c-init.c wird nun kompiliert und ausgeführt:
gcc -o i2c-init i2c-init.c -lwiringPi
sudo ./i2c-init
Die Ausgabe von i2cdetect muss nun wie folgt aussehen:
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: 10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --  
Der Wert 0x10 stellt die Adresse des FM-Tuners dar und kann nicht geändert werden. Wir können ab jetzt auf die Register zugreifen, also den Chip steuern.

Ich habe dafür die Arduino Bibliothek von SparkFun für den RPi portiert, siehe hier.
Lässt man das Testprogramm "Radio" laufen, so sollte man in ausgezeichneter Qualität den Radiosender FM4 (104,0 Mhz) empfangen können =)

Welche 2-Wire-Funktionen der Chip wirklich unterstützt verrät uns folgender Befehl:
$ i2cdetect -F -y 1
Functionalities implemented by /dev/i2c-1:
I2C                              yes
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               yes
SMBus Block Write                yes
SMBus Block Read                 no
SMBus Block Process Call         no
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes
Dies ist nur interessant, falls man selber Funktionen zum Zugriff auf die Register schreiben möchte.

to be continued ...

Mittwoch, 7. September 2011

Doing the bridge!

In der Leistungselektronik dient eine H-Brücke zur Erzeugung einer Rechteckwechselspannung für, meist, induktive Verbraucher, wie Motoren, Transformatoren et cetera. Ich werde euch im folgenden nun eine diskret aufgebaute Ansteuerung vorstellen.



Es handelt sich hier um eine Brücke aus vier N-Kanal MOSFETs, welche je mit derselben Treiberstufe angesteuert werden, wobei für die High-Side wieder das Bootstrapping Anwendung findet.

Erklärung der Treiberstufe (an M1)
Die Stufe wird mit einem Tastverhältnis von 50% bei 50kHz angesteuert, desweiteren ist sie low-active d.h. bei 0V schaltet M1 durch, bei 5V dagegen sperrt dieser. 

Die Gegentaktstufe (totem pole) bestehend aus Q2 und Q3 kann nicht mit den 5V des PWM-Signals angesteuert werden, daher wird Q1 als Levelshifter davorgeschaltet. R2 dient, wenn Q1 sperrt, als Basisstrombegrenzung für Q2 und zum anderen, der viel wichtigere Teil, als Strombegrenzung wenn Q1 leitet. Da Q1 nicht einfach nur eingeschaltet wird, sondern in die Sättigung getrieben wird, ist ein schnelles Ausschalten nicht ohne weiteres möglich. In Sättigung sind in der Basiszone von Q1 überschüssige Ladungsträger vorhanden, welche diesen leitend halten, obwohl der PWM-Pegel bereits auf 0V liegt. Es musst also zuerst eine parasitäre Kapazität entladen werden, damit Q1 sperrt. C1 ist ein sogenannter "Speed-Up"-Kondensator (lädt sich auf die an R1 abfallende Spannung auf), welcher bei Pegelwechsel diese Ladungsträger in sehr kurzer Zeit aus der Basiszone "heraussaugt". Die Gegentaktstufe gerät nicht in Sättigung, daher ist keine Beschaltung notwendig! Wenn Q1 sperrt, so wird Q2 durch R2 leitend und zieht aus C1 den benötigten Ladestrom. Wenn Q1 dagegen sperrt, so sperrt auch Q2 und Q3 wird leitend, welcher das Gate fast auf Massepotential zieht. Da beim Entladevorgang das Gate (durch parasitäre Induktivitäten) negativ gegenüber Masse werden kann bzw. wird, dient D1 als Spannungsbegrenzung.

Die Treiberstufe, obwohl nicht krass optimiert, zeigt in LTSpice eine beachtliche Performance. M1 ist nach 30ns voll durchgesteuert und sperrt vollständig nach 70ns.

Anmerkung
Es müssen immer die diagonal angeordneten Transistorpärchen gleichzeitig angesteuert werden. Desweiteren muss eine Todzeit (dead time, wenige Nanosekunden) beim Päarchenwechsel eingehalten werden, um Querschlüsse zu vermeiden. Diese würden die Transistoren in kurzer Zeit zerstören!

Donnerstag, 1. September 2011

SolarChargerUSB - ein kleines Sommerprojekt!

Ich hatte schon länger vor mein kleines 5W@12V Solarpanel mit einem DC-DC Converter für USB auszurüsten. Ich hatte mir in den Kopf gesetzt, dass ich dem angeschlossenen Gerät, sofern es dies unterstützt, mitteilen kann wieviel Strom es maximal beziehen darf. Die USB-  sowie die Battery Charging- Specification erlauben und beschreiben dies im Detail. Dafür wird jedoch zwingend ein µC oder Controller-Chip benötigt der hardwareseitig USB unterstüzt, was dem bestreben, dieses Projekt günstig aufzubauen, im Wege stand.
Die BCS definiert verschiedene Anschlussklassen, je nachdem was der USB-Anschluss kann oder können muss.
Eine sehr einfache Klasse nennt sich "Dedicated Charging Port" (DCP) oder einfacher: USB-Steckdose ;-)

Zuerst ein bisschen prototyping um mich zu vergewissern ob alles so funktioniert wie gedacht.


Dreh und Angelpunkt dieser Schaltung ist der SimpleSwitcher-IC LM2675-5 von National. Der Linearregler links im Bild setzt den ON-Anschluss auf high. Es sind nur bis zu 6V erlaubt, d.h. ON mit Vin verbinden ist eine schlechte Idee. Der Chip legt dann nämlich die Eingangsspannung, wenn > 6V, voll auf den Ausgang! Das Prototyping bot mir auch die Gelegenheit endlich meine Breakout-Platine für SO8-Chips zu testen. Die rechte Seite stellt nur die Standardbeschaltung laut Datenblatt dar und die LED leuchtet wenn der Chip arbeitet. (Die Diode hat sich hinter der Spule versteckt)

it's time to get serious ... ;D


Der Teil im strichlierten Bereich dient zum Einschalten von IC1 wenn Vin bei ~10V ist.
Der 200Ω-Widerstand verbindet D+ mit D-, somit wird die Schaltung zum DCP.
Ein interessanter Aspekt dieser Schaltung ist, dass sie sich automatisch ein- und ausschaltet, je nachdem ob Vin genügend hoch ist.



Endlich mal wieder SMD-Bauteile löten ;-)

Dienstag, 30. August 2011

Des Teufels Kaffee oder Bootstrapping für Anfänger! [Teil 2]

Fortsetzung zu Des Teufels Kaffee oder Bootstrapping für Anfänger!
Aus der Simulation, mit LTSpice, dieser Schaltung ergaben sich folgende Spannungsverläufe. Alle Spannungen sind auf Masse bezogen!


Da C1 ausreichend dimensioniert wurde, bricht die Spannung nicht sichtbar ein. Zu sehen an der Oberkante der Pulse. Zu beachten ist, dass die Spannug fast 2x V+ erreicht! Der Grund ist die Serienschaltung von V+ und der Spannung an C1 wenn M2 sperrt und M1 leitet.

Montag, 29. August 2011

Des Teufels Kaffee oder Bootstrapping für Anfänger!

Man könnte sich ja den Aufwand sparen und gleich für die High-Side einen P-Kanal (MOS)FET verwenden, jedoch haben diese gegenüber den N-Kanal FETs eine geringere Leitfähigkeit (Elektronen- vs. Löcherleitung), desweiteren sollten beide Transistoren komplementär sein.

Wenn sich ein N-Kanal FET im High-Side-Zweig befindet, so "schwimmt" sein Source-Potential unweigerlich (floating source) d.h. Source kann jeden Wert zwischen Masse und der Versorgungsspannung (V+) annehmen. Im schlimmsten Fall liegt das Source-Potential auf V+, da aber zum Einschalten eine höhere Spannung an Gate gegenüber Source (Schwellspannung) benötigt wird, lässt sich der FET nicht einschalten (z.B. > 15V bei V+ = 10V und Gate-Source-Spannung > 5V).

Eine einfache Abhhilfe, für eine Halbbrücke, stellt das sogenannte Bootstrapping dar.

Schaltungserklärung
Die PWM ist 5V mit Tastverhältnis von 50% (duty cycle), V+ ist viel größer als 5V, desweiteren ist die Schwellspannung beider N-Kanal FETs bei 5V.

ON-Zeit (PWM)
M2 leitet, M1 wird gesperrt. Dadurch besteht eine niederohmige Verbindung von V+ -> D1 -> C1 -> M2 -> Masse. C1 lädt sich somit in diesem Zeitfenster auf annähernd V+ auf. Da Q3 ebenfalls leitet, liegen die Basen der Gegentaktstufe (totem pole) bestehend aus Q2 und Q1 auf Masse, womit das Gate von M1 vorwiegend über Q1 entladen wird. R1 und R2 dienen der Strombegrenzung!

OFF-Zeit (PWM)
M2 sperrt, M1 wird aufgeladen. C1 ist fast auf V+ aufgeladen, und durch das Sperren von M2 wird sein negativer/unterer Anschluss auf Source von M1 gezogen. Man sieht, C1 stellt eine unabhängige Spannungsquelle für M1 dar, welche bezogen auf Source rund V+ liefert, jedoch gegen Masse ca. 2x V+. Zum Schalten ist nur der Bezug auf Source relevant! D1 verhindert das Kurschliessen der Spannung an C1 und V+ (2x V+ -> V+). Da nun Q3 sperrt, wird Q2 über R1 von selber leitend und lädt das Gate von M1 auf.

Anmerkung
Der HS-Zweig wird während der OFF-Zeit ausschließlich mit der in C1 gespeicherten Energie betrieben! C1 muss daher ausreichend dimensioniert sein.

Die hier dargestellte Schaltung soll nur zum Verständnis dienen und ist keineswegs komplett oder unter realen Bedingungen voll funktionstüchtig!

Samstag, 20. August 2011

"Hello World"

Ich bin ein 23-jähriger Infromationselektronik-Student und werde euch hier in unregelmäßigen Abständen über meine Projekte, über Konzepte oder Allerweltsdinge die mir durch den Kopf schwirren berichten. Mal schaun wie's wird! ;)