vineri, 4 aprilie 2014

MCP4921(4922) = convertor digital/analog pe 12 biti

 Erata: din greseala prezentasem aceste convertoare ca analog/digitale.
  
   Cautand un convertor digital-analog la un pret decent, am descoperit perechea MCP4921/4922, care sunt pe 12 biti, deci la iesire tensiunea 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.
   Multe informatii se gasesc in fisa tehnica (datasheet), dar pot fi prea complicate asa ca trecem la partea mai practica...
   Pe site-ul Arduino se gaseste un articol numit SPI library care prezinta modul de conectare al comunicatiei seriale SPI, daa nici asta nu "atrage", asa ca trecem la alte articole..
   Pe un site german am gasit un articol numit 12bit D/A-Wandler von Microchip (MCP4921, MCP4922) in care sunt si poze intuitive:
dar are si o librarii si 2 sketch-uri cu exemple:
   Autorul articolului mentioneaza ca sursa de inspiratie blogul sinneb, unde este articolul MCP4921 12bit DAC voltage controller
iar autorul acestuia recomanda articolul Controlling a Gakken SX-150 synth with Arduino.
   Pe site-ul tronixstuff exista un articol numit Tutorial: Arduino and the SPI bus part II care prezinta pe MP4921:
   Sketch-ul prezentat acolo este:
/*
 Example 36.2 - SPI bus device demo using a Microchip MCP4921 DAC [http://bit.ly/j3TSak]
 http://tronixstuff.com/tutorials > chapter 36 | CC by-sa-nc | John Boxall
*/
 
#include "SPI.h" // necessary library
int del=0; // used for various delays
word outputValue = 0; // a word is a 16-bit number
byte data = 0; // and a byte is an 8-bit number
void setup()
{
  //set pin(s) to input and output
  pinMode(10, OUTPUT);
  SPI.begin(); // wake up the SPI bus.
  SPI.setBitOrder(MSBFIRST);
}
 
void loop()
{
  for (int a=0; a<=4095; a++)
  {
    outputValue = a;
    digitalWrite(10, LOW);
    data = highByte(outputValue);
    data = 0b00001111 & data;
    data = 0b00110000 | data;
    SPI.transfer(data);
    data = lowByte(outputValue);
    SPI.transfer(data);
    digitalWrite(10, HIGH);
    delay(del);
  }
  delay(del+25);
  for (int a=4095; a>=0; --a)
  {
    outputValue = a;
    digitalWrite(10, LOW);
    data = highByte(outputValue);
    data = 0b00001111 & data;
    data = 0b00110000 | data;
    SPI.transfer(data);
    data = lowByte(outputValue);
    SPI.transfer(data);
    digitalWrite(10, HIGH);
    delay(del);
  }
  delay(del+25);
}
   

Un comentariu:

  1. m-am inspirat f.mult din lucrarile dvs.nu pot decat sa va multumesc!frumoasa pasiune mai e si electronica.

    RăspundețiȘtergere