Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Analog/Digital Wandler mit SPI
Raspberry Pi
Aufbau
2
Serial Peripheral Interface
Analog-Digital Wandlung
Die Aufgabe
Die Lösung
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Serial Peripheral Interface
3 06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
Serial Peripheral Interface - Theorie
4
SPI ist ein Bus-System mit einem „lockeren“ Standard für
einen synchronen seriellen Datenbus entwickelt von
Motorola
Hohe Taktfrequenzen möglich (MHz-Bereich)
Master-Slave-Prinzip
Ein oder mehrere Slave-Geräte, nur ein Master
4-Leitung Seriell Bus
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
SPI Leitungen
5
SCLK: Serial Clock
MOSI: Master Output, Slave Input
MISO: Master Input, Slave Output
SS: Slave Select
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
SPI Leitungen
6
Daisy-Chain
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Drei unabhängige Slaves
SPI Betrieb
7
Der SPI-Bus kann mit einem einzigen Master-Gerät und einem
oder mehreren Slave-Geräten arbeiten.
Wenn ein einzelnes Slave-Gerät verwendet wird, kann der SS-
Pin auf logisch Null festgesetzt werden, solange der Slave es
erlaubt.
Mit mehreren Slave-Geräten, benötigt man unabhängige SS-
Signale für jedes Gerät.
Die meisten Slave-Geräte haben Tri-State-Ausgänge, damit ihr
MISO Signal hochohmig wird, wenn das Gerät nicht aktiv ist.
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
SPI Datenübertragung
8
Um die Übertragung zu starten, setzt das Master-Gerät die
Taktfrequenz fest.
Der Master überträgt eine logische Null über die CS-Leitung,
um eine Slave auszuwählen.
In jedem Taktzyklus, passiert eine Full-Duplex-Übertragung.
Eine Datenübertragung kann eine beliebige Anzahl von
Taktzyklen haben, solange es Daten zu übertragen gibt. Wenn
es keine Daten mehr gibt, stoppt der Master die Umschaltung
des Taktes.
Datenübertragungen bestehen oft aus 8-Bit-Wörter, aber
andere Wortgröße sind auch üblich.
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
SPI Datenübertragung
9
Datenübertragungen umfassen normalerweise zwei
Schieberegister einer gegebene Wörtergroße, eines in dem
Master und eines in dem Slave. Sie sind in einem Ring
verbunden. Daten werden üblicherweise mit dem MSB zuerst
verschoben.
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
SPI Betriebsmodi
10
CPOL: Clock Polarity
CPHA: Clock Phase
Bei CPOL = 0 ist der Basiswert des Taktes ist Null.
Für CPHA = 0 werden die Daten bei steigender Flanke des Taktes erfasst und die Daten werden auf eine fallende Flanke propagiert.
Für CPHA = 1 werden die Daten auf fallende Flanke des Taktes erfasst und die Daten werden bei einer steigenden Flanke propagiert.
Bei CPOL = 1 ist der Basiswert des Taktes ist Eins.
Für CPHA = 0 werden die Daten auf fallende Flanke des Taktes erfasst und die Daten werden bei einer steigenden Flanke propagiert.
Für CPHA = 1 werden die Daten bei steigender Flanke des Taktes erfasst und die Daten werden auf eine fallende Flanke propagiert.
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
SPI Betriebsmodi
11 06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
Mode CPOL CPHA
0 0 0
1 0 1
2 1 0
3 1 1
Vor- und Nachteile
12
Vorteile
Full duplex.
Höheren Durchsatz als I2C oder SMBus.
Flexibilität
Nicht auf 8-Bit-Worte beschränkt.
Willkürliche Auswahl der Nachrichtengröße, Inhalt und Zweck.
Einfache Hardware Zusammenschaltung.
Typischerweise geringere Leistungsanforderungen als I2C oder SMBus durch weniger Schaltkreis.
Slaves verwenden den Takt des Masters.
Slaves brauchen keine Adressierung.
Transceivers werden nicht benötigt.
Maximal ein eindeutiges Bus-Signal pro Gerät (Chip select).
Signale sind einseitig, einfache galvanische Trennung
Nachteile
Benötigt mehr Pins als I2C.
Keine Hardware Datenflusssteuerung von dem Slave.
Keine Hardware Slave Acknowledgment.
Unterstützt nur ein Master-Gerät.
Keine Fehlerprüfung Protokoll definiert.
Ohne einen formalen Standard.
Nur kurze Distanzen, viel weniger als RS-232, RS-485 oder CAN-Bus Protokolle.
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
Analog-Digital-Wandlung
13 Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Analog-Digital-Wandlung
Allgemeines
14
Themen:
Die Theorie
Die Verfahren
Der MCP3008
Die Funktionalität
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Analog-Digital-Wandlung – Die Theorie
15
Analoges Signal wird abgetastet, wobei die Abtastfrequenz
über die Genauigkeit entscheidet
Also: Je größer die Abtastfrequenz im Bezug auf das Eingangssignal,
um so genauer kann das Signal reproduziert werden (?)
Nicht ganz: Die Bitrate entscheidet dabei über die Höhe des
Dynamikbereiches
Nyquist-Shannon-Abtasttheorem: Abtastfrequenz >= 2x Frequenz des
Eingangssignal
Der Vorgang der Digitalisierung eines Werte wird
Quantisierung genannt
Das Ergebnis sind einheitslose Digitalwerte, die mit Hilfe eines
Referenzwertes gedeutet werden können (s. MCP3008)
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Analog-Digital-Wandlung - Verfahren
16 Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Flash-Wandler:
Hohe Abtastrate bis über 1000 Msps
Geringe Auflösung bis etwas über 10 Bit
Pipeleine-Wandler:
Etwas geringere Abtastrate als Flash-Wandler
Höhere Auflösung bis etwas 14 Bit
Slope-Wandler
Abtastraten nur im Ksps Bereich
Auflösungen bis 17 Bit
Sigma-Delta-Wandler
Abtastraten unter 10 Msps
Höchste Datenauflösung bis 20 Bit
SAR-Wandler
Geringe Abtastrate bis zu 1 Msps
Hohe Auflösung bis zu 17 Bit
Analog-Digital-Wandlung - Verfahren
17
Parallelumsetzer (Flash-Wandler)
Viele Comparatoren und entsprechend viele Spannungsteiler. Ein Eingang der Comparatoren hat die Uin der andere die entsprechende Abteilung von UREF
Pipeline-Wandler
Mehrstufiger A/D Wandler, bestehend aus mehreren Parallelumsetzern, was höhere Auflösungen ermöglicht bei ähnlich hohen Abtastraten
Slope-Verfahren
Uin wird mit einem Sägezahnverglichen, dieser Start bei 0 V und steigt an bis er gleich Uin ist. Im Hintergrund läuft ein Zähler, der beim Erreichen von Uin, den Spannungswert weiter gibt und dann für den nächsten Wert resetet wird
Sigma-Delta-Wandler
Im einfachsten Fall steht 1 für steigende Spannung und 0 für fallende Spannung, was die Analog-Kurve in einem Zickzack-Muster nachstellt
SAR-Verfahren
Später genauer Erklärt
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Analog-Digital-Wandlung – MCP3008
18
10 Bit Auflösung:
210 Bitkombinationen = 1024
Pins:
VDD Spannungsversorgung (3,3 V)
VREF Referenzspannung (3,3 V)
AGND Analoge Masse
CLK Serial Clock
DOUT Serial Data-Out (vom MCP3008)
DIN Serial Data-In (vom Raspberry Pi)
! CS/SHDN Chip-Select, Low-Aktiv / Shutdown Input
DGND Digitale Masse
CHX Analoger Eingang X, Channel X
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Analog-Digital-Wandlung – MCP3008
19
Durch die Referenzspannung und die Anzahl der
Bitkombinationen lässt sich der Spannungssprung von einem
zum nächsten Bitwert berechnen
U = UREF / 1024 = 3,3 V / 1024 = 0,003223 V = 3,2 mV
Als Beispiel: wir empfangen am Raspberry Pi einen Wert von 42, d.h.
am analogen Eingang liegt eine Spannung von U = 42 * 3,2 mV =
0,1344 V an.
Info zum Fotowiderstand: Je stärker die Beleuchtung um so
geringer der elektrische Wiederstand
Der MCP3008 kann bis zu eine Umwandelrate von 200ksps
arbeiten (sps = samples per second)
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Analog-Digital-Wandlung - Funktionalität
20
DAC = Digital Analog Wandler
SAR = Successive Approximation Register
Ablauf:
Über das Sample-and-Hold Glied wird Uin geholt
Im Comparator wird die analoge Eingangsspannung mit VREF/2 verglichen – Im ersten Durchlauf wird das MSB auf 1 (Uin > UREFVergleich) oder auf 0 (Uin < UREFVergleich) gesetzt
Darauf hin wird VREFVergleich halbiert und im DAC zum Comparator zurückgegeben für den nächsten Vergleich. Je nach Ausgang des Vergleiches wird VREFVergleich/2 vom vorherigen UREFVergleich abgezogen oder zuaddiert – Ist Uin > UREFVergleich wird das nächste Bit auf 1 gesetzt. Dies geschieht solange bis das LSB erreicht ist
Die Anzahl der gesetzten Bits ist gleich der Auflösung (hier 10 Bit)
Zum Schluss wird ein neues Uin aus der Sample-and-Hold Schaltung geholt
Pro Bit wird ein Taktzyklus gebraucht
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Analog-Digital-Wandlung - Funktionalität
21 Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
MCP3008 und SPI
22
Zu Beginn muss der !CS Pin von HIGH auf LOW gezogen
werden um Kommunikation zu initialisieren
Die erste Clock wo DIN HIGH ist während !CS auf LOW
gezogen ist stellt den Start dar
Als nächstes folgt das SGL/!DIFF Bit welches bestimmt in
welchem Mode die Eingänge Betrieben werden (1 = single
ended, 0 = differential)
Danach wird über D2, D1, D0 der Channel angewählt (Bei uns
single-ended CH0 = 1 0 0 0)
Nun ist DIN Don‘t Care. Bei der nächsten fallenden Falke wird
DOUT LOW ausgeben. Die nächsten 10 Bit sind die Daten (MSB
first)
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
MCP3008 – SPI Mode 0
23 Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
MCP3008 mit Microcontrollern
24
Da viele Microcontroller in Byte Schritten arbeiten (8 Bit)
pausiert die Clock alle 8 Takte
So ist zu beachten, dass bei dem 10 Bit Wert die ersten zwei
Bits noch im vorherigen Datenblock liegen
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Die Aufgabe
25 Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Die Aufgabe
26
Bestimmen Sie die am Fotowiderstand abfallenden
Spannungen. Nutzen Sie hierfür den MCP3008 A/D Converter
und lesen Sie diesen über seine SPI Schnittstelle aus.
Das zu schreibende Programm soll in C (wenn möglich)
objektbasiert programmiert werden und ohne die Nutzung der
wiringPi Bibliothek arbeiten.
Optional: Wenn um den Fotowiderstand herzu zu dunkel wird
soll eine LED auf dem Testboard eingeschaltet werden.
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
SPI Einstellungen
27
sudo nano /etc/modprobe.d/raspi-blacklist.conf
blacklist spi-bcm2708 -> #blacklist spi-bcm2708
sudo reboot
ls /dev/spidev*
/dev/spidev0.0 /dev/spidev0.1
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
SPI Einstellungen
28
Includes:
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
SPI Einstellungen
29
spidev.h
struct spi_ioc_transfer {
__u64 tx_buf; /* Zeiger zu ein Buffer */
__u64 rx_buf; /* Zeiger zu ein Buffer */
__u32 len; /* Länge von tx und rx Buffers */
__u32 speed_hz; /* Übertragungsfrequenz */
__u16 delay_usecs; /* Verzögerung nach die letzte
Bitübertragung */
__u8 bits_per_word; /* Bits pro Wort */
__u8 cs_change;
__u32 pad;
};
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
SPI Einstellungen
30
spidev.h Makros für ioctl():
SPI_IOC_WR_MODE
SPI_IOC_WR_BITS_PER_WORD
SPI_IOC_WR_MAX_SPEED_HZ
SPI_IOC_MESSAGE(N)
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
SPI Einstellungen
31
Spi Initialisierung:
static uint8_t mode = 0; // CPOL = 0, CPHA = 0
static uint8_t bpw = 8; // 8 bits per word
static uint32_t speed = 1000000; // Up to 1MHz clock frequency
static uint16_t delay = 0; // No delay after last bit transfer
fd = open("/dev/spidev0.0", O_RDWR); // Device 0, CS0
ioctl (fd, SPI_IOC_WR_MODE, &mode);
ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &bpw);
ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
SPI Einstellungen
32
Übertragung: Full- oder Halb-Duplex
Halb-Duplex: read() and write() Befehle.
Full-Duplex: ioctl() Befehl.
Full-Duplex:
struct spi_ioc_transfer tr;
ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Aufbau
33
Raspberry Pi Pins MCP3008
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Aufbau
34 Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Hilfestellungen
35
uint8_t spiData[3];
spiData[0] = 1; //start bit
spiData[1] = 0x80; //single-ended, channel 0 of the MCP3008
spiData[2] = 0; //"don't care bits"
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
GPIO Steuerung
36
Beispiel für GPIO15:
Initialisierung:
Export GPIO:
– fd = open("/sys/class/gpio/export", O_WRONLY);
– write(fd, "15", sizeof("15"));
– close(fd);
GPIO als Ausgang:
– fd = open("/sys/class/gpio/gpio15/direction", O_WRONLY);
– write(fd, “out", sizeof(“out"));
– close(fd);
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
GPIO Steuerung
37
Beispiel für GPIO15:
Steuerung:
GPIO schalten:
– fd = open("/sys/class/gpio/gpio15/value", O_WRONLY);
– write(fd, “1", sizeof(“1")); // “1”: Auf, “0”: Aus
– close(fd);
Am Ende:
Unexport GPIO:
– fd = open("/sys/class/gpio/unexport", O_WRONLY);
– write(fd, "15", sizeof("15"));
– close(fd);
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
GPIO Steuerung
38
myPins.h und myPins.c:
typedef struct pin_struct{
PinClass *class;
int pinNumber;
int pinMode;
} PinInstance;
Konstruktor:
//pinNumber: GPIO number
//pinMode: INPUT or OUTPUT
Pin newPin(int pinNumber, int pinMode);
typedef struct pin_class{
int (*init)(Pin aPin);
int (*remove)(Pin aPin);
int (*set)(Pin aPin, int pinState);
} PinClass;
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
GPIO Steuerung
39
Benutzung:
Pin led = newPin(15, OUTPUT); //GPIO 15, Ausgang
if(led->class->init(led) < 0){
//Fehlerhandlungsroutine
}
led->class->set(led, ON); //LED auf
led->class->set(led, OFF); //LED aus
led->class->remove(led);
06.01.2014 Jose Gutierrez & Ole Gebert | Embedded Software
Unsere Lösung
40 Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Unsere Lösung
41
Klassen:
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Unsere Lösung
42
Signale:
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Quellen
43
Foliendesign:
https://wiki.fh-
muenster.de/verwaltung/styleguide/lib/exe/fetch.php?media=fh_ppt_m
aster.pptx
Bilder:
http://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Zeroorder
hold.signal.svg/500px-Zeroorderhold.signal.svg.png
http://commons.wikimedia.org/wiki/File:Tel%C3%A9fono_de_cordel_(1
882).jpg
http://ww1.microchip.com/downloads/en/DeviceDoc/21295d.pdf
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014
Quellen
44
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
http://hertaville.com/2013/07/24/interfacing-an-spi-adc-mcp3008-chip-to-the-raspberry-pi-using-c/
https://www.kernel.org/doc/Documentation/spi/spidev
http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/spi/spidev.h
http://www.brianhensley.net/2012/07/getting-spi-working-on-raspberry-pi.html
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/Documentation/spi/spidev_test.c
http://armbedded.eu/node/318
http://kerneldox.com/kdox-linux/d9/dee/spidev_8h.html
http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/spi/spidev.c
https://projects.drogon.net/understanding-spi-on-the-raspberry-pi/
Jose Gutierrez & Ole Gebert | Embedded Software 06.01.2014