La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

A/D con Raspberry MCP300X MCP320X.

Presentazioni simili


Presentazione sul tema: "A/D con Raspberry MCP300X MCP320X."— Transcript della presentazione:

1 A/D con Raspberry MCP300X MCP320X

2 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 è MCP3008 oppure MCP3208 I convertitori MCP300x e MCP320X sono dotati di x canali; nel nostro caso ci sono 8 canali MCP300X è un convertitore a 10 bit; MCP320X è un convertitore a 12 bit La comunicazione tra Raspberry e l’integrato MCP3Y0X 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

3 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: CE0 (Chip Enable numero 0). Quando attivo, seleziona la prima periferica. E' associato al file /dev/spidev0.0 Pin 26: CE1 (Chip Enable numero 1). Quando attivo, seleziona la seconda periferica. E' associato al file /dev/spidev0.1

4 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

5 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.

6 SPI

7 SPI

8 Pin

9 Mcp3208 su Raspberry La piedinatura di MCP3208 e quella di MCP3008
è la stessa

10 Mcp3208 su Raspberry

11 MCP3004 ed MCP3008 MCP3208 è un convertitore A/D a 12 bit e 8 canali
MCP3008 è un convertitore meno recente a 10 bit e 8 canali. MCP3004 è 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 MCP3008 o 3004 a 10 bit

12 MCP3204/MCP3208 Per il convertitore MCP300x è previsto uno shift dei bit diverso da quello del convertitore MCP320X; lo si può notare dal confronto tra questo schema e quello precedente Schema di conversione per MCP3008 o 3004 a 10 bit

13 MCP3008

14 MCP3204

15 MCP3208

16 MCP320X Liv 0 Liv 1 Liv 2 Liv 3 --------------------------------
bit0 bit 1 bit 2 bit 3 bit 4091 bit 4092 bit 4093 bit 4094 bit 4095 3.3 V L’integrato MCP3208 è 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= V

17 MCP300X Liv 0 Liv 1 2 3 ……………………………………………………………………………………………… Liv 1019 Liv 1020 Liv 1021 Liv 1022 Liv 1023 3.3 V L’integrato MCP3008 è 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= V

18 Es: acquisizione di temperatura e luminosità con MCP3008

19 Codice per acquisire i dati
import spidev import time import os #apertura del bus SPI spi = spidev.SpiDev() spi.open(0,0) #open(bus, device) def ReadChannel(channel): #channel deve avere valore #tra 0 e 7   adc = spi.xfer2([1,(8+channel)<<4,0])   data = ((adc[1]&15) << 8) + adc[2]   return data def ConvertVolts(data,places):   volts = (data * 3.3) / float(1023)   volts = round(volts,places)   return volts  def ConvertTemp(data,places):    temp = ((data * 330)/float(1023)) #LM35   temp = round(temp,places)   return temp light_channel = 0 temp_channel  = 1  delay = 5 while True: light_level = ReadChannel(light_channel) light_volts = ConvertVolts(light_level,2) temp_level = ReadChannel(temp_channel) temp_volts = ConvertVolts(temp_level,2) temp = ConvertTemp(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 MCP3008 viene collegato GPIO7 di Raspberry open(0,1) il pin 10 di MCP3008 viene collegato su GPIO8 di Raspberry

20 Xfer2 oppure xfer Le due funzioni sono molto simili
Sintassi: xfer2([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

21 Xfer2 MCP300X ed MCP320X inviano sempre tre byte a Raspberry e ricevono tre byte Il codice di invio byte è il seguente: xfer2([1,(8+channel)<<4,0]) Il primo byte, quello di inizio è sempre 0x01 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=> se channel è uno, il risultato sarà 8+1=9 ->9<<4=> Il terzo byte è sempre 0x00 I byte inviati saranno: 1 2 3 4 5 6 7 8 ch0 ch1 Byte I: seleziona l’inizio di una trama di informazioni sul canale Byte III: è un byte nullo, si può anche non esprimerlo Byte II: invia il canale da l quale leggere; il bit 2, 3, 4 danno queste informazioni

22 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]

23 OUT 1 2 3 4 5 6 7 8 ch0 ch1 out adc[1]&11 adc[2]

24 CS, MOSI, MISO CS MOSI MISO canale D2 D1 D0 1 2 3 4 5 6 7 1 S D2 D1 D0
1 S D2 D1 D0 x ? B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 Dati inviati dal master MOSI Dati inviati dallo slave MISO canale D2 D1 D0 1 2 3 4 5 6 7

25 Installare la libreria Spi
Per poter installare la libreria SpiDev, è necessario eseguire i seguenti passi: sudo apt-get install python-dev (?) mkdir python-spi (creo uno sottodirectory) cd python-spi (entro nella sottodirectory) wget (scarico setup.py da github) wget (scarico spidev_module.c da github) sudo python setup.py install (installazione finale)

26 Configurare Raspberry

27 Configurare Raspberry

28 Metodi Spi bits_per_word Descrizione Proprietà che dà o setta i bit per parola. Range: 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]) Description: Scrive I byte sul device SPI Xfer2 Syntax: xfer2([values]) Description: Esegue una transazione SPI. .


Scaricare ppt "A/D con Raspberry MCP300X MCP320X."

Presentazioni simili


Annunci Google