Ακρίτας
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;
}
}
Εδώ φαίνονται επάνω σε μια 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;
}
}