PDA

Επιστροφή στο Forum : BFO με το AD9833



Ακρίτας
06-05-17, 22:41
Ένα πολύ χρήσιμο module (http://www.ebay.com/itm/152364443598?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT) για όπου χρειαζόμαστε μια σταθερή, συγκεκριμένης τιμής συχνότητα, όπως ένα BFO, μέχρι τους 12 MHz. Μπορεί να μας δώσει ημίτονο ή τρίγωνο ή τετράγωνο παλμό (όχι συγχρόνως). Φυσικά χρειάζεται και ένα μικροελεγκτή για τη λειτουργία του, δηλαδή κάποιο αρντουνοειδές (για εμάς τους τεμπέληδες). Συνδυασμένο με ένα Pro Mini αποτελούν ένα πολύ συμμαζεμένο και οικονομικό σύνολο, της τάξης των 6Ε, που μπορεί να μπει ακόμα και σε μια ήδη υπάρχουσα συσκευή αν απαιτείται.

Εδώ φαίνονται επάνω σε μια bb.

69690

Ένα ημίτονο στους 1843.2 KHz.

69691

Και ένα τρίγωνο στους 110 KHz.

69692

Στο διαδίκτυο βρήκα δυο - τρεις κώδικες για αρντουίνο που όμως είναι πολύ μπερδεμένοι γιατί περιλαμβάνουν LCD, encoders και λοιπά. Ο παρακάτω κώδικας είναι απλούστερος και δεν χρησιμοποιεί κάποια ιδιαίτερη βιβλιοθήκη. Η συχνότητα και η κυματομορφή της εξόδου ορίζονται μέσα στον κώδικα άπαξ.


/*
AD9833 simple frequency BFO.
Most of the code is based on "AD9833 Waveform Module vwlowen.co.uk".
Thanks to creators.
By Akritas.
*/

#include <SPI.h>

const int SINE = 0x2000;
const int SQUARE = 0x2028;
const int TRIANGLE = 0x2002;

const float refFreq = 25000000.0; // this may be changed a little
long BFO_FREQ = 1843200; // set BFO frequency here

int FSYNC = 10; //connected to FSYNC
//int SPI_CLK = 13; connected to SCLK
//int SPI_MOSI = 11; connected to SDATA

void setup()
{
//SPI.setClockDivider(SPI_CLOCK_DIV2);
//SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE2);
SPI.begin();
delay(50);
digitalWrite(FSYNC,HIGH);
AD9833_reset;
setFrequency(BFO_FREQ);
SPI.end;
}

void WriteRegister(int dat)
{
digitalWrite(FSYNC, LOW);
delayMicroseconds(10);
SPI.transfer(highByte(dat));
SPI.transfer(lowByte(dat));
digitalWrite(FSYNC, HIGH);
}

void AD9833_reset()
{
WriteRegister(0x100);
delay(10);
}

void setFrequency(long frequency)
{
long FreqWord = (frequency * pow(2, 28)) / refFreq;
int MSB = (int)((FreqWord & 0xFFFC000) >> 14);
int LSB = (int)(FreqWord & 0x3FFF);

LSB |= 0x4000;
MSB |= 0x4000;

WriteRegister(0x2100);
WriteRegister(LSB);
WriteRegister(MSB);
WriteRegister(0xC000);
WriteRegister(SINE); // may be SQUARE or TRIANGLE
}

void loop()
{

}


Ο παρακάτω κώδικας κάνει στην ουσία το ίδιο πράγμα αλλά είναι επεκτάσιμος στην περίπτωση που θέλουμε να βάλουμε για παράδειγμα δυο ή περισσότερες συχνότητες που θα επιλέγονται με κάποιο μπουτόν (πχ. USB - LSB).


/*
AD9833 simple frequency BFO.
Most of the code is based on "AD9833 Waveform Module vwlowen.co.uk".
Thanks to creators.
By Akritas.
*/

#include <SPI.h>

const int SINE = 0x2000;
const int SQUARE = 0x2028;
const int TRIANGLE = 0x2002;

const float refFreq = 25000000.0; // this may be changed a little
long BFO_FREQ = 1843200; // set BFO frequency here

int FSYNC = 10; //connected to FSYNC
//int SPI_CLK = 13; connected to SCLK
//int SPI_MOSI = 11; connected to SDATA

boolean SET_FREQ = true;

void setup()
{
//SPI.setClockDivider(SPI_CLOCK_DIV2);
//SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE2);
SPI.begin();
delay(50);
digitalWrite(FSYNC,HIGH);

AD9833_reset;

//SPI.end;
}

void WriteRegister(int dat)
{
digitalWrite(FSYNC, LOW);
delayMicroseconds(10);
SPI.transfer(highByte(dat));
SPI.transfer(lowByte(dat));
digitalWrite(FSYNC, HIGH);
}

void AD9833_reset()
{
WriteRegister(0x100);
delay(10);
}

void setFrequency(long frequency)
{
long FreqWord = (frequency * pow(2, 28)) / refFreq;
int MSB = (int)((FreqWord & 0xFFFC000) >> 14);
int LSB = (int)(FreqWord & 0x3FFF);

LSB |= 0x4000;
MSB |= 0x4000;

WriteRegister(0x2100);
WriteRegister(LSB);
WriteRegister(MSB);
WriteRegister(0xC000);
WriteRegister(SINE); // may be SQUARE or TRIANGLE
}

void loop()
{
if (SET_FREQ)
{
setFrequency(BFO_FREQ);
SET_FREQ = false;
}
}

SeAfasia
06-05-17, 23:37
έχει πιό κάτω;Με κάποιο 602;
Μου άρεσε το εξής σημείο:"δηλαδή κάποιο αρντουνοειδές (για εμάς τους τεμπέληδες)"...

Ακρίτας
07-05-17, 00:49
έχει πιό κάτω;Με κάποιο 602;
Μου άρεσε το εξής σημείο:"δηλαδή κάποιο αρντουνοειδές (για εμάς τους τεμπέληδες)"...

Ε...ναί. Βαρέθηκα να παιδεύομαι με τα διάφορα VFO, VCO, VXO...
Προορίζεται για εκείνο το SSB που έχει στοιχειώσει.