AD con Raspberry MCP 300 X MCP 320
A/D con Raspberry MCP 300 X MCP 320 X
A/D • La scheda Raspberry non è dotata di convertitore analogico digitale. • Per poter acquisire grandezze analogiche tramite Raspberry è necessario collegare un convertitore A/D esterno • Il convertitore preso in considerazione è MCP 3008 oppure MCP 3208 • I convertitori MCP 300 x e MCP 320 X sono dotati di x canali; nel nostro caso ci sono 8 canali • MCP 300 X è un convertitore a 10 bit; MCP 320 X è un convertitore a 12 bit • La comunicazione tra Raspberry e l’integrato MCP 3 Y 0 X avviene attraverso il bus SPI Serial Peripheral Interface Bus • La comunicazione SPI è utilizzata per piccole distanze ed è full duplex ed è stato sviluppato dalla Motorola. • Utilizza una architettura master-slave con un solo master e più slave
Pin di Raspberry per la comunicazione SPI • Pin 19: MOSI (Master Output Slave Input) - uscita dei dati dal Raspberry Pi verso la periferica • Pin 21: MISO (Master Input, Slave output) - usato dalla periferica per trasmettere dati al Raspberry Pi • Pin 23: SCLK - clock, generato dal Raspberry Pi • CS: Chip Select – Pin 24: CE 0 (Chip Enable numero 0). Quando attivo, seleziona la prima periferica. E' associato al file /dev/spidev 0. 0 – Pin 26: CE 1 (Chip Enable numero 1). Quando attivo, seleziona la seconda periferica. E' associato al file /dev/spidev 0. 1
SPI • La comunicazione SPI è abbastanza veloce, può raggiungere 10 Mbps • La lettura e la scrittura di un dato avviene sul fronte di salita o di discesa del clock. Ciò rende immune dal rumore. • Si possono collegare più slave
SPI • Un dispositivo SPI possiede due bit di configurazione detti CPOL Clock POLarity e CPHA Clock PHAse. • CPOL determina lo stato idle del segnale di sincronismo • CPOL=0 - segnale di clock è considerato idle quando è a livello logico basso. • CPHA determina su quale fronte del segnale di clock vengono letti i dati • CPHA=0 i dati in uscita dal Master vengono letti in corrispondenza del fronte di discesa e i dati in uscita dagli Slave vengono letti in corrispondenza del fronte di salita del segnale di clock.
SPI
SPI
Pin
Mcp 3208 su Raspberry La piedinatura di MCP 3208 e quella di MCP 3008 è la stessa
Mcp 3208 su Raspberry
MCP 3004 ed MCP 3008 • • MCP 3208 è un convertitore A/D a 12 bit e 8 canali MCP 3008 è un convertitore meno recente a 10 bit e 8 canali. MCP 3004 è un convertitore a 4 canali e a 10 bit Per aumentare il numero di canali, si possono collegare più device in parallelo Schema di conversione per MCP 3008 o 3004 a 10 bit
MCP 3204/MCP 3208 Per il convertitore MCP 300 x è previsto uno shift dei bit diverso da quello del convertitore MCP 320 X; lo si può notare dal confronto tra questo schema e quello precedente Schema di conversione per MCP 3008 o 3004 a 10 bit
MCP 3008
MCP 3204
MCP 3208
MCP 320 X bit 0 Liv bit Liv 0 11 bit Liv 22 bit Liv 33 ---------------- Liv bit bit bit ----------------Liv Liv 4091 4092 4093 4094 4095 4091 3. 3 V L’integrato MCP 3208 è a 12 bit, è quindi formato da 212=4096 livelli. La tensione di riferimento 3. 3 V viene diviso per 4095 livelli; la risoluzione è quindi 3. 3 V/4095=0. 000806 V
MCP 300 X Liv 0 Liv 1 Liv 2 Liv 3 ……………………………………………… Liv 1019 Liv 1020 3. 3 V • L’integrato MCP 3008 è a 12 bit, è quindi formato da 210=1024 livelli. • La tensione di riferimento 3. 3 V viene diviso per 1024 livelli; • La risoluzione è quindi 3. 3 V/1023=0. 003226 V Liv 1021 Liv 1022 Liv 1023
Es: acquisizione di temperatura e luminosità con MCP 3008
Codice per acquisire i dati import spidev import time import os #apertura del bus SPI spi = spidev. Spi. Dev() spi. open(0, 0) #open(bus, device) def Read. Channel(channel): #channel deve avere valore #tra 0 e 7 adc = spi. xfer 2([1, (8+channel)<<4, 0]) data = ((adc[1]&15) << 8) + adc[2] return data def Convert. Volts(data, places): volts = (data * 3. 3) / float(1023) volts = round(volts, places) return volts def Convert. Temp(data, places): temp = ((data * 330)/float(1023)) #LM 35 temp = round(temp, places) return temp light_channel = 0 temp_channel = 1 delay = 5 while True: light_level = Read. Channel(light_channel) light_volts = Convert. Volts(light_level, 2) temp_level = Read. Channel(temp_channel) temp_volts = Convert. Volts(temp_level, 2) temp = Convert. Temp(temp_level, 2) print "----------------------" print("Light: {} ({}V)". format(light_level, light_volts)) print("Temp : {} ({}V) {} deg C". format(temp_level, temp_volts, temp)) time. sleep(delay) open(0, 0) il pin 10 di MCP 3008 viene collegato GPIO 7 di Raspberry open(0, 1) il pin 10 di MCP 3008 viene collegato su GPIO 8 di Raspberry
Xfer 2 oppure xfer • Le due funzioni sono molto simili • Sintassi: xfer 2([elenco dati in byte da inviare da Raspberry al master]) • I dati vengono inviati dal pin MOSI • Lo slave invia dei dati sul pin MISO
Xfer 2 • • MCP 300 X ed MCP 320 X inviano sempre tre byte a Raspberry e ricevono tre byte Il codice di invio byte è il seguente: – xfer 2([1, (8+channel)<<4, 0]) – Il primo byte, quello di inizio è sempre 0 x 01 – Il secondo byte è quello di impostazione dell’integrato, sposta a sinistra di 4 bit il risultato di 8+channel; • se channel è zero, il risultato sarà 8+0=8 ->8<<4=>10000000 • se channel è uno, il risultato sarà 8+1=9 ->9<<4=> 10010000 – Il terzo byte è sempre 0 x 00 • I byte inviati saranno: 1 2 3 4 5 6 7 8 ch 0 0 0 0 1 1 0 0 0 0 ch 1 0 0 0 0 1 1 0 0 0 0 Byte I: seleziona l’inizio di una trama di informazioni sul canale Byte II: invia il canale da l quale leggere; il bit 2, 3, 4 danno queste informazioni Byte III: è un byte nullo, si può anche non esprimerlo
Lettura dall’AC/DC • I dati restituiti dal convertitore vengono chiamati data • La sintassi è a seguente: data = ((adc[1]&3) << 8) + adc[2] Del byte adc[1] vengono presi in considerazione gli ultimi due bit tramite l’operazione logica AND con 11; questi due bit vengono traslati a sinistra di 8 bit per fare spazio all’intero byte adc[2]
OUT 1 2 3 4 5 6 7 8 ch 0 0 0 0 1 1 0 0 0 0 ch 1 0 0 0 0 1 1 0 0 0 0 out adc[1]&11 adc[2]
CS, MOSI, MISO CS MOSI 0 0 0 0 1 S D 2 D 1 D 0 0 0 x x x x ? ? ? B 1 1 B 1 0 B 9 B 8 B 7 B 6 B 5 B 4 B 3 B 2 B 1 B 0 MISO canale D 2 D 1 D 0 0 0 1 2 0 1 0 3 0 1 1 4 1 0 0 5 1 0 1 6 1 1 0 7 1 1 1 Dati inviati dal master Dati inviati dallo slave
Installare la libreria Spi Per poter installare la libreria Spi. Dev, è necessario eseguire i seguenti passi: – sudo apt-get install python-dev (? ) – mkdir python-spi (creo uno sottodirectory) – cd python-spi (entro nella sottodirectory) – wget https: //raw. github. com/doceme/pyspidev/master/setup. py (scarico setup. py da github) – wget https: //raw. github. com/doceme/pyspidev/master/spidev_module. c (scarico spidev_module. c da github) – sudo python setup. py install (installazione finale)
Configurare Raspberry
Configurare Raspberry
Metodi Spi bits_per_word Descrizione Proprietà che dà o setta i bit per parola. Range: 8. . 16 close Syntax: close() Returns: None Description: Disconnette l’oggetto dall’interfaccia. cshigh Descrizione: Proprietà che setta se CS è attivo alto. max_speed_hz Description: Proprietà che dà o setta la massima velocità in Hz su un bus open Syntax: open(bus, device) Description: Connette l’oggetto allo specifico device open(X, Y) può aprire /dev/spidev-X. Y readbytes Syntax: read(len) Returns: [values] Description: Legge la lunghezza dei byte dal device SPI writebytes Syntax: write([values]) Returns: None Description: Scrive I byte sul device SPI Xfer 2 Syntax: xfer 2([values]) Returns: [values] Description: Esegue una transazione SPI. .
- Slides: 28