Управление DDS AD9834
- Войдите на сайт для отправки комментариев
Ср, 28/01/2015 - 14:44
Здравствуйте, Господа!
Возникла проблема с Subj. DDS никак не реагирует на команды. Подскажите, пожалуйста, в чем проблема?
Вот код:
#define SCLK 8
#define FSYNC 9
#define DATA 10
#define pulse(pin) {digitalWrite(pin, LOW); digitalWrite(pin, HIGH); }
int stp=10000;
unsigned long currentTime;
unsigned long loopTime;
const int pina=2;
const int pinb=3;
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
double frq=7050000;
void tfr_word(word data)
{
digitalWrite(FSYNC, LOW);
for (int i=0; i<16; i++) {
bool value=data & 0x8000;
digitalWrite(DATA, value);
data <<=1;
data &=0xFFFF;
pulse(SCLK);
}
digitalWrite(FSYNC, HIGH);
}
void sendFrequency(double frequency) {
int32_t freq = frequency * 5.36870912; // note 50 MHz clock on 9834
word regLo=freq&0x3FFF;
word regHi=freq>>14;
regLo |=0x4000;
regHi |=0x4000;
tfr_word(0x2100);
tfr_word(regLo);
tfr_word(regHi);
tfr_word(0xC000);
tfr_word(0x2000);
}
void setup() {
pinMode(FSYNC, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(pina, INPUT);
pinMode(pinb, INPUT);
currentTime = millis();
loopTime = currentTime;
digitalWrite(FSYNC, HIGH);
digitalWrite(SCLK, HIGH);
sendFrequency(frq);
}
void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){
encoder_A = digitalRead(pina);
encoder_B = digitalRead(pinb);
if((!encoder_A) && (encoder_A_prev)){
if(encoder_B) {
if(frq + stp <= 7200000) frq += stp;
}
else {
if(frq - stp >= 7000000) frq -= stp;
}
sendFrequency(frq);
}
encoder_A_prev = encoder_A;
loopTime = currentTime;
}
}
Оказалась дохлая микруха. Код рабочий.