Generador de funciones con AD9833

          El AD9833 es un generador de bajo coste de señales sinusoidal, triangular y cuadrada con un rango de uso de 0Hz a 12,5 MHz
          Fácilmente programa con ayuda de un Arduino. La amplitud de las ondas sinusoidal y triangular está limitada a unos 600mV. La rectangular alcanza casi los 5v. La comunicación es SPI.
         
          En el Sketch para Arduino, la entrada de la frecuencia requerida se realiza con un teclado de membrana que se conecta con un PCF8574 para reducir el cableado a I2c

          Conforme vamos tecleando la frecuencia, esta se va generando en la salida. Con el botón * podemos borrar el último digito tecleado y con # borrar todo.

          Con la tecla D pasamos sucesivamente por los tres tipos de onda.

          Finalmente podemos hacer un Sweep. Tecleamos la frecuencia de partida y manteniendo pulsada A o B ira aumentando de 100Hz o 1000Hz hasta que soltemos la tecla. Muy útil para valorar la frecuencia de corte de filtros RC.   
//www.jopapa.me   2023

#include <MD_AD9833.h>
#include <SPI.h>
#include "I2CKeyPad.h"

// Pins for SPI comm with the AD9833 IC
#define DATA  11 ///< SPI Data pin number
#define CLK   13 ///< SPI Clock pin number
#define FSYNC 9 ///< SPI Load pin number (FSYNC in AD9833 usage)

MD_AD9833 AD(FSYNC);  // Hardware SPI
long f;
int wave=0;

const uint8_t KEYPAD_ADDRESS = 0x20;  //Direccion del PCF8574
I2CKeyPad keyPad(KEYPAD_ADDRESS);
uint32_t value = 0;


void setup(void){
  Serial.begin(115000);
  Serial.println(__FILE__);
  Wire.begin();
  Wire.setClock(400000);
  if (keyPad.begin() == false){
    Serial.println("\ERROR communicación con teclado keypad.\n");
    while(1);
  } 
AD.begin();
  AD.setMode(1);   //Onda Sinusoidal
}

void loop(void){
  if (keyPad.isPressed()){
     char c = handleKeyPadValue(value);
    if (value > 12500000) value = 12500000;  //frecuencia máxima.
    Serial.print(value);
    Serial.println("\t");
    delay(300);   //Evita rebotes
  }
  AD.setFrequency(MD_AD9833::CHAN_0, value);
}


// 0..9 Añade numeros -- * Elimina último digito -- # Borra todo -- D forma onda
char handleKeyPadValue(uint32_t &value){
  char v[19] = "123A456B789C*0#DNF";  // N = NoKey, F = Fail
  static uint8_t lastKey = 0;
  uint8_t idx = keyPad.getKey();
  char c = v[idx];
  if (lastKey != c){
    lastKey = c;
    switch (c){
      case '0' ... '9':
        value *= 10;
        value += c - '0';
        lastKey="";      //para permitir repetir numero en entrada (6533)
         break;
      case '*':
        if (value > 0) value /= 10;
        lastKey="";      //para permitir repetir *
        break;
      case '#':
        value = 0;
        break;
      case 'D':     //Tipo de onda
        wave += 1;
        Serial.println(wave);
        if (wave > 3) wave = 0;
        switch (wave) {
          case 0: AD.setMode(1); lastKey="";break;    //Sinusoidal
          case 1: AD.setMode(4); lastKey="";break;    //Triangular
          case 2: AD.setMode(2); lastKey="";break;    //Cuadrada
          case 3: AD.setMode(0); lastKey="";break;    //sin señal
        }   
        break;
      case 'A':       //Hace Sweep desde la frecuencia actual en saltos de 100Hz
        value += 100;     
        lastKey="";      //para permitir repetir tecla
        break;   
      case 'B':       //Hace Sweep desde la frecuencia actual en saltos de 100Hz
        value += 1000;     
        lastKey="";      //para permitir repetir tecla
        break;         
      case 'C':
        // e.g. store value in EEPROM
        break;           
      default:
        break;
    }
  }
  return c;
}



Menu