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.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)







