Generación de señal analógica senoidal con Arduino y DAC MCP4921
Generación de señal analógica senoidal con Arduino y DAC MCP4921
Objetivos:
Generar una señal analógica senoidal con Arduino y DAC MCP4921
Diagrama en Proteus:

Código en Arduino
#include <LiquidCrystal.h> #include <TimerOne.h> #include <SPI.h> // Remember this line! #include <DAC_MCP49xx.h> #define SS_PIN 10 DAC_MCP49xx dac(DAC_MCP49xx::MCP4921,SS_PIN); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int y; // salida int muestra=0; // numero de muestra int frecuencia_ld; float frecuencia=1; // frecuencia de senal a generar float frecuenciadigital; // frecuencia digital float frecuenciamuestreo=10000;// 10 K Hz int amplitud_dig; float amplitud; float amplitudr; void muestreo(){ y=floor((amplitud*sin(2*3.1416*muestra*frecuenciadigital)) + 2048); // calculo seno digital de 12 bits // calculo sino digital de 12 bits; // calculo sino digital de 12 bits muestra++; // aumenta la muestra dac.output(y); // manda la salida al DAC } void setup(){ lcd.begin(16, 2); Serial.begin(9600); // incializa comunicacions serial Timer1.initialize(100); // Periodo de muestreo 1/10 K = 100 us Timer1.attachInterrupt(muestreo);// Activa la interrupcion y la asocia a ISR_timer dac.setSPIDivider(SPI_CLOCK_DIV16); // Use "port writes", see the manual page. In short, if you use pin 10 for // SS (and pin 7 for LDAC, if used), this is much faster. // Also not strictly required (no setup() code is needed at all). dac.setPortWrite(true); } void loop(){ frecuenciadigital=frecuencia/frecuenciamuestreo; amplitud_dig=analogRead(A1); /// conversión analogica digital amplitud=map(amplitud_dig,0,1024,0,2048); frecuencia_ld=analogRead(A2); frecuencia=map(frecuencia_ld,0,1024,1,1000); lcd.setCursor(0,0); lcd.print("Amp:"); lcd.setCursor(5,0); lcd.print(amplitud); lcd.setCursor(0,1); lcd.print("Frec:"); lcd.setCursor(6,1); lcd.print(frecuencia); }
