vineri, 4 aprilie 2014

Marirea preciziei de masurarea de la 10 la 12biti la placa Arduino

   Placa Arduino are 6 intrari analogice, de fapt sunt 6 convertoare digital-analogice pe 10 biti (tensiunea de referinta este impatita in 210-1=1023 intervale). De obicei, tensiunea de referinta este 5V, deci rezolutia este de 4,89mV. Daca se foloseste referinta interna (cu ATmega328 sau ATmega168), care are valoarea de 1,1V, rezolutia este de 1,075mV.
   Despre acest mod de masurare gasiti multe in articolul Convertor analogic-numeric de pe Wikipedia.
   Am gasit un integrat destul de ieftin, ADC121S021 la pretul de cca. 9lei (2 EURO), care este un convertor digital-analogic pe 12 biti, deci tensiunea de intrare este impartita in 212-1=4095 intervale, rezolutia fiind de 1,22mV cand tensiunea de referinta este de 5V, respectiv 0,69mV cand este utilizata referinta interna de 1,1V, deci de 4 ori fata de cele interne de pe placa Arduino.
   In fisa de catalog (datasheet) se gasesc destule informatii.
   Integratul are 6 pini (in capsula SMD/SOT-23 si mai mica LLP):
iar schema bloc:
- VIN = intrarea analogica intre 0 si tensiunea de alimentare (VA);
- SCLK = intrare digitala: impulsuri tact (ceas)
- SDATA = iesire digitala: se transmit date cand exista impulsuri de ceas;
- CS = selectie integrat.
   Cand pe pinul CS este 1 logic, integratul este blocat, aceasta permite conectarea mai multor convertoare analog-digitale.

   La o cautare mai atenta am dat de MCP3204, care este un convertor analog-digital pe 12biti si 4 canale, respectiv MCP3208 cu 8 canale, ambele la cca. 12lei.
   Pe site-ul german Arduino-Projekte.de am gasit articolul 12-bit A/D-Wandler von Microchip (MCP3208/MCP3204)
in care se gaseste libraria libraria AH_MCP320x.h si un sketch
// http://arduino.alhin.de/arduino_code/MCP3208_ADC_SPI.ino
// SELPIN   10   //Selection Pin (CS)
// DATAOUT  11   //MOSI 
// DATAIN   12   //MISO 
// SPICLOCK 13   //Clock

#include "AH_MCP320x.h"
#include <SPI.h>

int ADCValue = 0;
float time_in;
float time_out;


AH_MCP320x ADC_SPI(10);             //Object definition with D10 as CS, other pins are defined by spi interface (faster mode).
//AH_MCP320x ADC_pin(10,11,12,13);  //Object definition with free definition of communication pins (slower mode).

void setup()
{
  Serial.begin(57600);
}

void loop()
{  
  for(int i=0;i<8;i++)   // i<8 at MCP3208 
  {  
    Serial.print("CH"); 
    Serial.print(i);     
    Serial.print(": ");   
    time_in = micros();  
    ADCValue = ADC_SPI.readCH(i);      //read analog value from IC (SPI mode)
//  ADCValue = ADC_pin.readCH(i);      //read analog value from IC (Pin mode)   
    time_out = micros();
    
    Serial.println(ADCValue);   
    
    Serial.print("Voltage:");
    Serial.print(ADC_SPI.calcVOLT(5.0,ADCValue));     //calculate the input voltage at 5V VREF
//    Serial.print(ADC_pin.calcVOLT(5.0,ADCValue));   //calculate the input voltage
    Serial.println(" V");
    
    Serial.print("Time: ");     
    Serial.print(time_out-time_in);   
    Serial.println(" ms");     
    Serial.println();
  
    delay(10);
  }
  delay (1000);
}
   De asemenea, in articol se prezinta si instructiunile folosite in librarie. 
   Pe site-ul Arduino se gaseste un articol numit MCP3208, care prezinta si acolo integratul, incluzand si un sketch.
   In datasheet (fisa tehnica) sunt prezentate cele 2 integrate MCP3204/3208, schema bloc este:
   Semnificatia pinilor este:
- CH0..CH3 la MCP3204, respectiv CH0..CH7 la MCP3208 sunt intrari analogice;
- VREF - tensiunea de referinta (tensiunea masima corespunzatoare "treptei" 4095);
- CLK - intrare digitala: impulsuri tact (ceas);
- DIN - intrare digitala, selecteaza intrarea;
- DOUT - iesire digitala, transmite datele convertite;
- CS/SHDN - selectie integrat.
   Cand pe pinul CS este 1 logic, integratul este blocat, aceasta permite conectarea mai multor convertoare analog-digitale, cum se vede in imaginea de mai jos, prezentata in articolul SPI communication with external ADC MCP3

21.04.2014
   Pentru placa Raspberry Pi, care nu are deloc intrari analogice, se poate folosi si un MCP3008, care are 8 canale sau MCP3004, care are 4 canale si, ambele, au rezolutie de 10 biti... similara placilor Arduino..
  

2 comentarii:

  1. Va admir pentru munca dvs. si pentru ca incepatorii sa nu inteleaga eronat, as vrea sa faca o precizare in sensul ca placa arduino are intradevar 6 intrari analogice dar in MCU este un singur ADC, la care cele 6 intrari analogice sunt conectate printr-un bloc multiplexor. Precizarea din datasheet "The ADC is connected to an 8-channel Analog Multiplexer which allows eight single-ended voltage inputs constructed from the pins of Port A.".
    Sper ca nu am fost perceput gresit fata de precizarea pe care am facut-o.
    Va multumesc!

    RăspundețiȘtergere
    Răspunsuri
    1. orice observatie bine documentata este binevenita !
      multumesc pentr aprecieri ! (y)

      Ștergere