Problema pilotaggio 2 moduli AD9833 con Arduino Due
Salve, Ho collegato come segue un ARDUINODUE a due moduli AD9833:
Ho scritto il seguente codice per pilotare i due moduli in modo che la traccia gialla abbia 2Khz mentre la traccia azzurra abbia 1Khz:
Collegando il tutto come nello schema sopra ottengo le tracce allegate.
Non capisco perche invece di visualizzare una sinusoide da 2Khz gialla ed una a 1Khz azzurra ne vedo una piatta ed un segnale da 12Khz circa.
Aiutatemi a capire perché non funziona correttamente.
Ho scritto il seguente codice per pilotare i due moduli in modo che la traccia gialla abbia 2Khz mentre la traccia azzurra abbia 1Khz:
- Codice: Seleziona tutto
#include "Arduino.h"
#include <SPI.h>
#include <MCP4251.h>
#include "Wire.h"
unsigned int value;
const int BUFFER_SIZE = 20;
unsigned int buffer[BUFFER_SIZE]; // application buffer
int FSYNC = 52;
int FSYNC2 = 50;
int FSYNC3 = 48;
int FSYNC4 = 46;
int FSYNC5 = 44;
int FSYNC6 = 42;
int FSYNC7 = 40;
int FSYNC8 = 38;
int FSYNC9 = 36;
int FSYNC10 = 34;
#define cs1 32
#define cs2 30
#define cs3 28
#define cs4 26
#define cs5 24
#define cs6 22
//impostazione valori pot.
#define pot0ResistanceRmax 100000 // These resistance values may vary
#define pot0ResistanceRmin 0
#define pot1ResistanceRmax 100000
#define pot1ResistanceRmin 0
//creazione funzioni per gestione potenziometri 100K
MCP4251 f0(cs1, pot0ResistanceRmax, pot0ResistanceRmin, pot1ResistanceRmax, pot1ResistanceRmin);
MCP4251 f1(cs2, pot0ResistanceRmax, pot0ResistanceRmin, pot1ResistanceRmax, pot1ResistanceRmin);
MCP4251 f2(cs3, pot0ResistanceRmax, pot0ResistanceRmin, pot1ResistanceRmax, pot1ResistanceRmin);
MCP4251 f3(cs4, pot0ResistanceRmax, pot0ResistanceRmin, pot1ResistanceRmax, pot1ResistanceRmin);
MCP4251 f4(cs5, pot0ResistanceRmax, pot0ResistanceRmin, pot1ResistanceRmax, pot1ResistanceRmin);
MCP4251 f5(cs6, pot0ResistanceRmax, pot0ResistanceRmin, pot1ResistanceRmax, pot1ResistanceRmin);
uint16_t wiper0;
uint16_t wiper1;
//variabile lettura freq. di LFO
int a = 0;
int fr5a; //oscillatore LFO da 0 a 100Hz
int SDATA = 11;
int SCLK = 13;
int i;
int k ;
unsigned long freq;
//byte wave=1;
void setup() {
Serial.begin(9600);
while (!Serial)
delay(10); // will pause Zero, Leonardo, etc until serial console open
Serial.println("OK!");
//Application Note AN-1070 from Analog Devices
UpdateRegister(0x2100, FSYNC); UpdateRegister(0x50C7, FSYNC); UpdateRegister(0x4000, FSYNC);
UpdateRegister(0xC000, FSYNC); UpdateRegister(0x2000, FSYNC);
for(k=0;k<41;k++) pinMode(k, OUTPUT);
for (i=0;i<41;i++) digitalWrite(i,HIGH); // put pins 0-13 (FSYNC's) as output HIGH
f0.begin();
f0.DigitalPotTerminalBConnect(0);
f0.DigitalPotTerminalAConnect(0);
f0.DigitalPotWiperConnect(0);
f1.begin();
f1.DigitalPotTerminalBConnect(0);
f1.DigitalPotTerminalAConnect(0);
f1.DigitalPotWiperConnect(0);
f2.begin();
f2.DigitalPotTerminalBConnect(0);
f2.DigitalPotTerminalAConnect(0);
f2.DigitalPotWiperConnect(0);
f3.begin();
f3.DigitalPotTerminalBConnect(0);
f3.DigitalPotTerminalAConnect(0);
f3.DigitalPotWiperConnect(0);
f4.begin();
f4.DigitalPotTerminalBConnect(0);
f4.DigitalPotTerminalAConnect(0);
f4.DigitalPotWiperConnect(0);
f5.begin();
f5.DigitalPotTerminalBConnect(0);
f5.DigitalPotTerminalAConnect(0);
f5.DigitalPotWiperConnect(0);
}
void loop() {
a = analogRead(A0); //leggi posizione potenziometro frequenza massima 100Hz
delay(100);
while(Serial.available() >= 2){
// Legge 2 byte dalla seriale
byte byte1 = Serial.read();
byte byte2 = Serial.read();
value = (byte2 << 8) | byte1;
buffer[i] = value;
i++;
}
//freqa
UpdateFreq(1000, 0x2000, FSYNC); //sin azzurra
UpdateFreq(2000, 0x2000, FSYNC2); //sin gialla
/*UpdateFreq(3000, 0x2000, FSYNC3);
UpdateFreq(4000, 0x2002, FSYNC4);
UpdateFreq(a, 0x2020, FSYNC5); //LFO frequency
//freqb
UpdateFreq(5000, 0x2000, FSYNC6);
UpdateFreq(6000, 0x2000, FSYNC7);
UpdateFreq(7000, 0x2000, FSYNC8);
UpdateFreq(8000, 0x2000, FSYNC9);
UpdateFreq(9000, 0x2000, FSYNC10);
delay(500); // a delay to measure your desired programmed frequencies with a scope
}
void UpdateFreq(unsigned int freq, int form, int sc){
// function to program the frequency into registers - no touch
long FreqReg;
unsigned int MSB, LSB;
FreqReg = (freq * pow(2, 28)) / 25000000; // 25MHz Quarz
if (form == 0x2020) FreqReg = FreqReg << 1;
MSB = (int)((FreqReg & 0xFFFC000) >> 14);
LSB = (int)(FreqReg & 0x3FFF);
LSB |= 0x4000;
MSB |= 0x4000;
UpdateRegister(0x2100, sc); // Control Register, Reset Bit DB8
UpdateRegister(LSB, sc); // Frequency Register 0 LSB
UpdateRegister(MSB, sc); // Frequency Register 0 MSB
UpdateRegister(0xC000, sc); // Phase Register
UpdateRegister(form, sc); // Exit Reset
}
void UpdateRegister(unsigned int data, int sc)
{ // function to program registers - no touch
unsigned int pointer = 0x8000;
digitalWrite(sc, LOW);
for (int i=0; i<16; i++){
if ((data & pointer) > 0) {
digitalWrite(SDATA, HIGH);
}
else {
digitalWrite(SDATA, LOW);
}
digitalWrite(SCLK, LOW);
digitalWrite(SCLK, HIGH);
pointer = pointer >> 1 ;
}
digitalWrite(sc, HIGH);
}
Collegando il tutto come nello schema sopra ottengo le tracce allegate.
Non capisco perche invece di visualizzare una sinusoide da 2Khz gialla ed una a 1Khz azzurra ne vedo una piatta ed un segnale da 12Khz circa.
Aiutatemi a capire perché non funziona correttamente.

