PDA

Επιστροφή στο Forum : 0-10MHz Direct Digital Synthesis (DDS) Γεννήτρια συναρτήσεων



manolena
21-09-13, 19:21
Καλησπέρα σας.

Σε αυτό το θέμα παρουσιάζεται μια κατασκευή που έρχεται να ολοκληρώσει ένα project που τρέχει (Ψηφιακά ελεγχόμενο τροφοδοτικό εργαστηρίου 0-40V, 0-5A) (http://www.hlektronika.gr/forum/showthread.php?t=69254) .

Θα ήθελα να πω πριν την ανάλυση, πως μιας και δεν είναι ολοκληρωμένη κατασκευή, οι διαχειριστές αν κρίνουν οτι αυτό δεν είναι σωστό,
μπορούν να μεταφέρουν το θέμα σε άλλη κατηγορία.

Στο τροφοδοτικό που βρίσκεται στην κατασκευή λοιπόν, έχει προβλεφθεί να υπάρχει και μια τέτοια γεννήτρια συναρτήσεων για να καλύψει
περισσότερες ανάγκες. Και μιας που η Αμερική έχει ήδη ανακαλυφθεί, δεν θα ήταν έξυπνο να κάτσει κάποιος να κατασκευάσει απο την αρχή
ένα τέτοιο κύκλωμα, με φίλτρα και υπολογισμούς. Παρήγγειλα λοιπόν αυτό εδώ το υπέροχο πλακετάκι:

http://www.ebay.com/itm/AD9850-DDS-Signal-Generator-Module-0-40MHz-New-/270864751254?

...το οποίο είναι μια ψηφιακή γεννήτρια σύνθεσης σήματος 0-40MHz. Το κύκλωμα που χρησιμοποιεί είναι το AD9850 (http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf)της Analog Devices
και έχει ενσωματωμένο low-pass φίλτρο στους 70MHz, με δύο εξόδους για τετράγωνο και ημίτονο.

Αποφάσισα να το σχεδιάσω με έναν ATmega328 και με ένα υποτυπώδες πληκτρολόγιο με 5 κουμπιά, ενώ τώρα θα προσθέσω και έναν rotary
encoder για μικρορυθμίσεις. Επειδή δεν υπάρχει ακόμα η πλακέτα του DDS αλλά και η μαμά-πλακέτα, ανέπτυξα το μεγαλύτερο μέρος
του κώδικα σε έναν Arduino Mega 1280 με μια οθόνη και κουμπιά πλοήγησης της Nuelectronics. Ήταν πάρα πολύ βολικό όλο αυτό γιατί
οι υποδομές είναι ακριβώς ίδιες με την τελική κατασκευή.

Εξαιρετική βοήθεια μου παρείχαν οι παρακάτω σελίδες:

http://arduino.alhin.de/index.php?n=7
http://tobyrobb.com/wordpress/?p=577

...στις οποίες έχουν γίνει πολύ καλές προσεγγίσεις στο θέμα.
Μερικές φωτογραφίες απο την πειραματική (προ τελικής υλοποίησης) κατασκευή:

manolena
21-09-13, 19:33
Το κύκλωμα σχεδιάστηκε ώστε να δέχεται εντολές για τις ρυθμίσεις του απο ένα αναλογικό πληκτρολόγιο των 5 κουμπιών,
με βέλη πλοήγησης (πάνω-κάτω, δεξιά-αριστερά και ένα κουμπί για μενού). Στον κώδικα υπάρχει η πρόβλεψη για επιλογή
κλίμακας αύξησης ή μείωσης συχνότητας σε βήματα των 1, 10, 100 Hz, 1, 10, 100KHz και του 1MHz. Με τα κουμπιά πάνω-κάτω
ρυθμίζεται σε αυτά τα βήματα η συχνότητα και μπορεί να κάνει αυτή τη ρύθμιση και σε γρήγορο βήμα με συνεχή πίεση του κουμπιού.

Πρόσθεσα και ένα κύκλωμα επιλογικής μεταγωγής της εξόδου απο ημίτονο σε τετράγωνο και αντίστροφα με ένα 74HCT4066 (http://www.nxp.com/documents/data_sheet/74HC_HCT4066.pdf) με
χαμηλή Ron αλλά επειδή υποπτεύομαι θορύβους και διάφορα τέτοια, έβαλα και χειροκίνητη επιλογή με jumper.
Εδώ υπάρχει ένα video με τη λειτουργία του πρωτοτύπου, χωρίς την παραγωγή σήματος, αλλά μόνο με τα λειτουργικά της πλοήγησης
και αρχικής λειτουργίας:

http://www.youtube.com/watch?v=j4on92QhETI&feature=youtu.be


http://www.youtube.com/watch?v=j4on92QhETI&feature=youtu.be

manolena
21-09-13, 19:42
Στον κώδικα πρόσθεσα και μερικές λειτουργίες, όπως για παράδειγμα την ειδοποίηση που εμφανίζεται στην οθόνη όταν προσπαθεί
κάποιος να ρυθμίσει συχνότητα εξόδου μεγαλύτερη απο τους 40MHz ή μικρότερη απο τα 0Hz. Επίσης, στο μενού επιλογής κυματομορφής
εξόδου, εμφανίζεται ένα γραφικό ημιτόνου ή τετραγώνου, ανάλογα με την περίπτωση.

Ο παρακάτω κώδικας, εννοείται πως είναι σε πολύ beta μορφή (!) και έχει πολλές ελλείψεις ακόμα:



#include <stdio.h>
#include <dds.h>
#include <LiquidCrystal.h>
#include <WString.h>


#define data_pin 12
#define load_pin A5
#define clock_pin A4
#define clock_hz 120000000LL




#define RESET 13
#define data_pin 12
#define load_pin A5
#define clock_pin A4
#define clock_hz 120000000LL
#define calibrationValue -0.0400000 // this is a value we change to calibrate our particular chip more accurately
#define buttonPin A0
#define SINE_output 21
#define SQUARE_output 20


// chip, data_pin, load_pin, clock_pin, clock_hz
//dds ddschip(DDS9850, data_pin, load_pin, clock_pin, clock_hz); // set my dds up with 120mhz onboard crystal
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


// some variables to use in our program
long toFrequency = 8000000;
long currentFrequency;
long maxFrequency = 40000000;
long minFrequency = 0;
int incrementNumber = 6;
int maxprogramnumber = 2; // dont forget to increase the menu numbers here!!
int programnumber = 1;
boolean menu_flag1 = 0;
boolean menu_flag2 = 1;
void booting();
void menu();


byte sine_1[8] = {
B00011,
B00100,
B00100,
B01000,
B01000,
B10000,
B10000,
B10000
};
byte sine_2[8] = {
B11000,
B00100,
B00100,
B00010,
B00010,
B00001,
B00001,
B00001
};
byte sine_3[8] = {
B10000,
B10000,
B10000,
B01000,
B01000,
B00100,
B00100,
B00011
};
byte sine_4[8] = {
B00001,
B00001,
B00001,
B00010,
B00010,
B00100,
B00100,
B11000
};
byte square_1[8] = {
B11111,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000
};
byte square_2[8] = {
B11111,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001
};
byte square_3[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B11111
};
byte square_4[8] = {
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B11111
};
void setup()
{
//Serial.begin(9600);
lcd.createChar(0, sine_1); delay(10);
lcd.createChar(1, sine_2); delay(10);
lcd.createChar(2, sine_3); delay(10);
lcd.createChar(3, sine_4); delay(10);
lcd.createChar(4, square_1); delay(10);
lcd.createChar(5, square_2); delay(10);
lcd.createChar(6, square_3); delay(10);
lcd.createChar(7, square_4); delay(10);
// set up the LCD"s number of columns and rows:
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
booting();
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" 0-40MHz DDS "); //Print a little message
lcd.setCursor(0, 1);
lcd.print(" MANOS MAR V1.0 ");
delay(5000);
// setup pins
pinMode(RESET, OUTPUT);
pinMode(data_pin, OUTPUT);
pinMode(load_pin, OUTPUT);
pinMode(clock_pin, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
pinMode(SINE_output, OUTPUT);
pinMode(SQUARE_output, OUTPUT);
digitalWrite(SINE_output, HIGH);
digitalWrite(SQUARE_output, LOW);


//ddschip.calibrate(calibrationValue); // this is a value we change to calibrate our particular chip more accurately
//ddschip.setfrequency(toFrequency);
lcd.clear();
}


void loop()
{
if(toFrequency > maxFrequency)
{
(toFrequency = maxFrequency);
lcd.clear();
lcd.print(" ERROR: Maximum ");
lcd.setCursor(0, 1);
lcd.print(" Freq. achieved ");
delay(2000);
}
if(toFrequency < minFrequency)
{
(toFrequency = minFrequency);
lcd.clear();
lcd.print(" ERROR: Minimum ");
lcd.setCursor(0, 1);
lcd.print(" Freq. achieved ");
delay(2000);
}
//ddschip.setfrequency(toFrequency);
currentFrequency = toFrequency;

switch(incrementNumber)
{
case 0:
//Serial.println("STEP: 1Hz");//"increment amount is 1hz"
lcd.setCursor(0, 0);
lcd.print("STEP: x1Hz");
break;

case 1:
//Serial.println("STEP: 10Hz");//"increment amount is 10hz"
lcd.setCursor(0, 0);
lcd.print("STEP: x10Hz");
break;

case 2:
//Serial.println("STEP: x100Hz");
lcd.setCursor(0, 0);
lcd.print("STEP: x100Hz");
break;

case 3:
//Serial.println("STEP: x1KHz");
lcd.setCursor(0, 0);
lcd.print("STEP: x1KHz");
break;

case 4:
//Serial.println("STEP: x10KHz");
lcd.setCursor(0, 0);
lcd.print("STEP: x10KHz");
break;

case 5:
//Serial.println("STEP: x100KHz");
lcd.setCursor(0, 0);
lcd.print("STEP: x100KHz");
break;

case 6:
//Serial.println("STEP: x1MHz");
lcd.setCursor(0, 0);
lcd.print("STEP: x1MHz");
break;

default:
//Serial.println("STEP: x100Hz");
lcd.setCursor(0, 0);
lcd.print("STEP: x100Hz");
break;
}

lcd.setCursor(0, 1);
lcd.print("Fo = "); //Print to lcd
lcd.setCursor(5, 1);
lcd.print(currentFrequency);
lcd.print(" Hz ");

//Serial.println(incrementNumber); // temporary for debuggin delete me

//Serial.print("Current Frequency is set to :");
//Serial.println(currentFrequency);

while((analogRead(buttonPin))>=1000)
{

}
delay(5);
if(analogRead(buttonPin)>=100 && analogRead(buttonPin)<=200)
{
// we have pushed up
upFrequency();
delay(300);
}


if(analogRead(buttonPin)>=200 && analogRead(buttonPin)<=400)
{
// we have pushed down
downFrequency();
delay(300);
}

if((analogRead(buttonPin))<=50)
{
// we have pushed right
incrementNumber++;
delay(300);
}

if(analogRead(buttonPin)>=400 && analogRead(buttonPin)<=600)
{
// we have pushed left
incrementNumber--;
delay(300);
}

if(analogRead(buttonPin)>=650 && analogRead(buttonPin)<=1000)
{
programnumber++;
menu();
delay(300);
}


if(incrementNumber > 6)
{
incrementNumber = 0;
} // this is where the menu goes around and around
if(incrementNumber < 0)
{
incrementNumber = 6;
}

if(programnumber > 1)
{
programnumber = 0;
} // this is where the menu goes around and around
if(programnumber < 0)
{
programnumber = 1;
}

delay(100);
lcd.clear();

}


void upFrequency()
{
//Serial.println("Going UP Frequency");
switch(incrementNumber)
{
case 0:
toFrequency = (toFrequency + 1);
break;

case 1:
toFrequency = (toFrequency + 10);
break;

case 2:
toFrequency = (toFrequency + 100);
break;

case 3:
toFrequency = (toFrequency + 1000);
break;

case 4:
toFrequency = (toFrequency + 10000);
break;

case 5:
toFrequency = (toFrequency + 100000);
break;
case 6:
toFrequency = (toFrequency + 1000000);
break;

default:
toFrequency = (toFrequency + 10);
break;
}
}


void downFrequency()
{
//Serial.println("Going DOWN Frequency");
switch(incrementNumber)
{


case 0:
toFrequency = (toFrequency - 1);
break;

case 1:
toFrequency = (toFrequency - 10);
break;

case 2:
toFrequency = (toFrequency - 100);
break;

case 3:
toFrequency = (toFrequency - 1000);
break;

case 4:
toFrequency = (toFrequency - 10000);
break;

case 5:
toFrequency = (toFrequency - 100000);
break;

case 6:
toFrequency = (toFrequency - 1000000);
break;

default:
toFrequency = (toFrequency - 10);
break;
}
}


void menu()
{
while((analogRead(buttonPin))>=1000)
{

}
delay(5);
switch(programnumber)
{
case 1:
lcd.clear();
lcd.print("OUTPUT: ");
lcd.write(8);
lcd.write(1);
lcd.setCursor(0,1);
lcd.print("SINE ");
lcd.write(2); lcd.write(3);
digitalWrite(SINE_output, HIGH);
digitalWrite(SQUARE_output, LOW);
menu_flag1 = 1;
menu_flag2 = 0;
delay(2000);
break;

case 2:
lcd.clear();
lcd.print("OUTPUT: ");
lcd.write(4);
lcd.write(5);
lcd.setCursor(0,1);
lcd.print("SQUARE ");
lcd.write(6); lcd.write(7);
digitalWrite(SINE_output, LOW);
digitalWrite(SQUARE_output, HIGH);
menu_flag1 = 0;
menu_flag2 = 1;
delay(2000);
break;

default:
menu_flag1 = 1;
menu_flag2 = 1;
break;
}

}


void booting()
{
int i;
int cur = 7;

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Booting ");
for(i=4; i>0; i--)
{
lcd.setCursor(cur, 0);
cur++;
lcd.print(".");
delay(400);
if(cur==10) continue;
}
cur = 7;
lcd.setCursor(cur, 0);
lcd.print(" ");
for(i=4; i>0; i--)
{
lcd.setCursor(cur, 0);
cur++;
lcd.print(".");
delay(400);
if(cur==10) continue;
}
}

spiroscfu
21-09-13, 21:00
duracell έχεις ρε παιδί μου :razz:

συγχαρητήρια Μάνο έχεις μεγάλη δημιουργικότητα, επίσης στο λινκ που έδωσες αναφέρει
DA produced the benchmark pin (PIN12) leads for easy adjustment to do the magnitude of the output waveform Application
Comparator reference input voltage generated by the variable resistor, the resistor can be adjusted duty cycle square wave of different

υπάρχει και η δυνατότητα να ελέγξεις μέσω software ενίσχυση και duty cycle,
σχετικά με τον ηλεκτρονικό διακόπτη εγώ θα προτιμούσα δυο ξεχωριστές εξόδους

manolena
21-09-13, 21:05
46114

Αυτό είναι το σχηματικό. Είναι η πρώτη έκδοση βέβαια, αλλά είναι και πολύ κοντά στο τελικό. Πρέπει να εξετάσω σοβαρά το ενδεχόμενο να αντικαταστήσω το 4066 με κάποια MOSFET ίσως πολύ χαμηλού Ron. Και βέβαια, υπάρχει πάντα και η πρόταση του Σπύρου για ξεχωριστές εξόδους σήματος.

46116

Και αυτό είναι ένα προσχέδιο πλακέτας. Έχουν χρησιμοποιηθεί εξαρτήματα μικτής τεχνολογίας στήριξης (through hole και SMD).

tasosmos
21-09-13, 21:38
Χαρα στο κουραγιο σου... Εγω τελευταια βαριεμαι να ξαναδω και τα παλια σχεδια, οχι να ασχοληθω με καινουρια εκτος δουλειας...

Μια πρωτη προταση ειναι να αλλαξεις αμεσα το LM358 με καποιον καλυτερο τελεστικο video ή γενικοτερα wide BW, δεν προκειται να δεις εξοδο της προκοπης στα 40MHz με το LM358.
Επισης σημαντικο ειναι να γινει μια αναδιαμορφωση του pcb στα σημεια που εχεις υψηλες συχνοτητες, θα προτεινα να χρησιμοποιησεις και PCB mount BNC αντι για headers.
Τελος τα + regulators ισως ζεσταινονται οποτε καλο ειναι να προβλεψεις για το ενδεχομενο τοποθετησης μιας μικρης ψυκτρουλας σε αυτα.

manolena
22-09-13, 11:13
46117

H αρχική οθόνη παρουσιάζει την εξ' ορισμού συχνότητα εξόδου στα 8MHz και το βήμα αλλαγής στο 1MHz. Αυτές οι δύο επιλογές μπορούν να ρυθμιστούν στον κώδικα σε άλλες της αρεσκείας μας.

46120

Στο μενού επιλογής της κυματομορφής εξόδου, σκέφτηκα να "παίξω" λίγο φτιάχνοντας γραφικά ένα εικονίδιο για κάθε επιλογή. Έτσι χρησιμοποίησα τις 8 κενές θέσεις χαρακτήρων χρήστη της οθόνης και έφτιαξα εικονίδια που συνθέτω ανα 4 για να δείξω γραφικά την
κυματομορφή. Πολύ χρήσιμο το spreadsheet του Excel για αυτή τη δουλειά. Σε καρέ των 5x8, όπου μαύρο χρώμα=1, άσπρο=0. Έτσι,
για το γραφικό του ημιτόνου χρειάστηκαν 4 bytes με μορφή:



byte sine_1[8] = {
B00011,
B00100,
B00100,
B01000,
B01000,
B10000,
B10000,
B10000
};
byte sine_2[8] = {
B11000,
B00100,
B00100,
B00010,
B00010,
B00001,
B00001,
B00001
};
byte sine_3[8] = {
B10000,
B10000,
B10000,
B01000,
B01000,
B00100,
B00100,
B00011
};
byte sine_4[8] = {
B00001,
B00001,
B00001,
B00010,
B00010,
B00100,
B00100,
B11000
};

46122

Όπως φαίνεται, ένας 28πινος μ/ε (ATmega328) είναι υπεραρκετός για να εξυπηρετήσει το module καθώς και τα χειριστήρια της κατασκευής.
Απλή και φθηνή λύση.
Οι πιο κάτω φωτογραφίες δείχνουν άλλο ένα τμήμα του σχεδίου στην περιοχή του DDS module καθώς και την πλακέτα σε τρισδιάστατη view.
(Χρειάζεται επανασχεδιασμό, είναι τουλάχιστον παιδική η προσέγγιση αυτή. Οι συχνότητες είναι μεγάλες και χρειάζεται να υπολογιστούν πολύ
καλύτερα οι διαδρομές των σημάτων).

SV1EDG
22-09-13, 13:15
Ολοκληρωμένη εργασία.Με το σχεδιακι της,τον κωδικά της,την πλακέτα της.Και την περιγραφή της.Μπράβο.

manolena
22-09-13, 13:19
Ολοκληρωμένη εργασία.Με το σχεδιακι της,τον κωδικά της,την πλακέτα της.Και την περιγραφή της.Μπράβο.

Μάριε, δεν την τέλειωσα ακόμα, απλά έχω την εξής τακτική: νομίζω πως παρουσιάζοντας μια κατασκευή στα βήματά της και όχι στο τέλος, μπορεί να ωφεληθούν και άλλοι, εκτός απο μένα που μπορώ να συγκεντρώνω και γνώμες άλλων πιο έμπειρων παιδιών εδώ μέσα. Νομίζω οτι είναι καλύτερα έτσι.

spiroscfu
22-09-13, 15:41
Μια πρωτη προταση ειναι να αλλαξεις αμεσα το LM358 με καποιον καλυτερο τελεστικο video ή γενικοτερα wide BW, δεν προκειται να δεις εξοδο της προκοπης στα 40MHz με το LM358.


καλά δεν θα φταίει μόνο ο τ.ε. για αυτό, νομίζω πως μέχρι καμιά δεκαριά Mhz στο ημίτονο και 1 (ίσως και λιγότερο) στο τετράγωνο θα τα βγάζει,
από εκεί και επάνω θα ανεβαίνει η παραμόρφωση αισθητά (άνετα αναγνωρίσιμη από το μάτι στον παλμογράφο).


Μάνο ποιο πάνω που είπα "μέσω software" εννοούσα στον atmel και επιπλέον ένα διπλό ψηφιακό ποτενσιόμετρο,

υγ.
το dc offset νομίζω πως δεν θα είναι λειτουργικό όπως το έχεις

manolena
22-09-13, 15:51
καλά δεν θα φταίει μόνο ο τ.ε. για αυτό, νομίζω πως μέχρι καμιά δεκαριά Mhz στο ημίτονο και 1 (ίσως και λιγότερο) στο τετράγωνο θα τα βγάζει,
από εκεί και επάνω θα ανεβαίνει η παραμόρφωση αισθητά (άνετα αναγνωρίσιμη από το μάτι στον παλμογράφο).


Μάνο ποιο πάνω που είπα "μέσω software" εννοούσα στον atmel και επιπλέον ένα διπλό ψηφιακό ποτενσιόμετρο,

υγ.
το dc offset νομίζω πως δεν θα είναι λειτουργικό όπως το έχεις

Σπύρο, κοίταξε αυτό εδώ:
http://www.electronics-lab.com/projects/test/013/Schematic.png

Στην διαμόρφωση του σήματος κατά πλάτος και απόκλιση, έχει το ίδιο κύκλωμα. Απο ό,τι είδα και διάβασα, έχει καλή λειτουργία.

spiroscfu
22-09-13, 16:23
νομίζω πως στην αρντική είσοδο θα έρχεται ένα σήμα με τιμές από 0V (ίσως και λίγο πάνω από αυτά) με 5V (ίσως και λίγο κάτω από αυτά),
και ο τ.ε. είναι σε αναστρέφων συνδεσμολογία με σημείο αναφοράς την μην αναστρέφων είσοδο, με ο/5V σε αυτήν θα αλλάξουμε το dc offset ??


υγ.
νομίζω πως αν θέλεις να έχεις και καθαρό εναλλασσόμενο (χωρίς dc offset), θα πρέπει στην μην αναστρέφων να δώσεις και αρνητική τιμή.

manolena
22-09-13, 16:50
νομίζω πως στην αρντική είσοδο θα έρχεται ένα σήμα με τιμές από 0V (ίσως και λίγο πάνω από αυτά) με 5V (ίσως και λίγο κάτω από αυτά),
και ο τ.ε. είναι σε αναστρέφων συνδεσμολογία με σημείο αναφοράς την μην αναστρέφων είσοδο, με ο/5V σε αυτήν θα αλλάξουμε το dc offset ??


υγ.
νομίζω πως αν θέλεις να έχεις και καθαρό εναλλασσόμενο (χωρίς dc offset), θα πρέπει στην μην αναστρέφων να δώσεις και αρνητική τιμή.

Σπύρο, το τρέχω στο LTSpice όπως είναι στην αναστρέφουσα είσοδο (-ΙΝ) και με τα δεδομένα στοιχεία (τροφοδοσία rails του τελεστικού -12 και +12V) έχει μια χαρά offset απο -5V ως +10V, πάντα με πλάτος 5V. Επισυνάπτω το μοντέλο εξομοίωσης και φωτογραφίες.

4612646127

spiroscfu
22-09-13, 17:00
Σωστά Μάνο συγνώμη, το dc offset της dds θα είναι Vcc/2 άρα με 0-5V στην μη αναστρέφων θα είναι μια χαρά.

αν δεν σου κάνει απόλυτα δες και αυτά
4613046131

mtzag
10-11-13, 00:25
Αγορασα και εγω αυτη την πλακετα για μια φτηνη γενητρια συχνοτητων.
Ωραιες οι ιδεες για 1602 οθονη και encoder για να βαζεις τη συχνοτητα.
Το πλατος της τασης πως το ρυθμιζεις σε αυτη την πλακετα ?
Πως παει το project ? Εχεις καταληξει ?

Σε τι αλλη χρηση θα μπορουσε να μπει ?

manolena
10-11-13, 10:09
Το πλάτος ρυθμίζεται απο έναν (μισό) LM358, ενώ απο τον άλλο μισό ρυθμίζεται το offset. Κάνω αυτό τον καιρό κάποιες δοκιμές για
πρόσθεση και ενός flip-flop για παραγωγή και τετραγώνου που θα βγαίνει στην έξοδο με μεταγωγή απο το software, αλλά χρειάζεται
διάβασμα στο θέμα των διακοπτών του σήματος. Υπολόγιζα το 4066 αλλά έχει μεγάλο Ron... Ίσως η προσθήκη μικρών MOSFETs με χαμηλό
Ron βελτιώσει την εισαγωγή παραμόρφωσης.

Το project είναι σε αναμονή πλακέτας λόγω στάσης πληρωμών (!)... Μόλις βρεθούν τα "πακέτα" θα προχωρήσει... Αναμονή και δόξα τω Θεώ...

Μπορείς να φτιάξεις έναν ωραίο VFO με αυτά τα πραγματάκια, υπάρχουν πολλές ανάλογες καταχωρήσεις στο Δίκτυο για τέτοια
projects.

mtzag
10-11-13, 17:33
mosfet κανουνε υπαρχουνε και με 10mohm Ron εγω εχω κατι p channel με 15mohm
Στο θεμα του φις εξοδου αυτο τις κεραιας τηλεορασης κανει η υπαρχει κατι καλυτερο ?

Στο κυκλωμα που εχεις κανει σε ποιο λογισμικο το εχεις φτιαξει ? τις βιβλιοθηκες του AD9850 και της 1602 lcd τις εχεις ?
Καλυτερα ειναι να ειναι σχεδον ολα smd για ευκολια κατασκευης (ευκολια κολληματος και οχι τρυπηματα)

manolena
10-11-13, 20:46
Υπάρχουν ειδικοί κονέκτορες BNC για panel (στερέωση με παξιμάδι και κολλητά τα ομοαξονικά). Το καλύτερο βέβαια είναι να μπούν απ' ευθείας κολλητά BNC πλακέτας (90° γωνία), αλλά πρέπει να σχεδιαστεί η πλακέτα έτσι ώστε να πηγαίνει απο πίσω).

Τα σχέδια (σχηματικό και PCB) είναι φτιαγμένα σε Altium DXP, όπως και τα εξαρτήματα της οθόνης και του AD9850 που τις φτιάχνεις εσύ.

Τα υλικά είναι και SMD και through hole γιατί αυτά έτσι κι αλλιώς υπάρχουν και δεν είναι καιροί για πολυτέλειες. Γίνονται κάποιοι μικροί
συμβιβασμοί, αλλά το αποτέλεσμα δεν διαφέρει και πολύ.

mtzag
10-11-13, 22:07
Στο diptrace θελω να το βγαλω μηπως εχεις την βιλιοθηκη της 1602 και ad9850 για eagle ή diptrace ?

Με smd ειναι ποιο οικονομικα τα εξαρτηματα γιατι τα παιρνεις απο ανακυκλωση απο παλιες πλακετες και θερμο αερα.
Ετσι εχω φτιαξει μεγαλη συλογη εξαρτηματων (αντιστασεις-πυκνωτες-κρυσταλους-mosfets-transistors κτλπ)
Αμα εχεις το avr transistortester μπορεις να βρισκεις τι ειναι το καθε εξαρτημα και να μην αγοραζεις σχεδον τιποτα για κατασκευες.

manolena
10-11-13, 22:48
Δουλεύω μόνο το Altium. Δεν μπορώ να σε βοηθήσω.

Η ανακύκλωση είναι καλή σε τέτοια περίπτωση, αλλά δεν θα κάτσω να παίξω τα νεύρα μου αν κάτι δεν πάει καλά
για 0,005€ ενός πυκνωτή ή ενός transistor SMD όταν μάλιστα πρόκειται για μια σχεδίαση που μου τρώει πολύ χρόνο
και κόπο.

mtzag
11-11-13, 12:38
μπορεις να ανεβασεις τις βιβλιοθηκες αυτες ? γινετε να γινουνε μετατροπη για το diptrace απο οτι ειδα.

manolena
11-11-13, 20:39
Οι βιβλιοθήκες σε zip-αρισμένο αρχείο απο Altium. Σημείωση, το footprint του AD9850 δεν είναι σωστό, θέλει έλεγχο και διόρθωση.

mtzag
04-12-13, 03:14
Μια πρωτη προταση ειναι να αλλαξεις αμεσα το LM358 με καποιον καλυτερο τελεστικο video ή γενικοτερα wide BW, δεν προκειται να δεις εξοδο της προκοπης στα 40MHz με το LM358.
Επισης σημαντικο ειναι να γινει μια αναδιαμορφωση του pcb στα σημεια που εχεις υψηλες συχνοτητες, θα προτεινα να χρησιμοποιησεις και PCB mount BNC αντι για headers.
Τελος τα + regulators ισως ζεσταινονται οποτε καλο ειναι να προβλεψεις για το ενδεχομενο τοποθετησης μιας μικρης ψυκτρουλας σε αυτα.

Μπορεις να προτεινεις ενα τσιπακι με μεγαλο bw απο το ebay φτηνο?

SRF
04-12-13, 12:04
AD8052

http://www.analog.com/en/audiovideo-products/video-ampsbuffersfilters/ad8052/products/product.html

manolena
21-08-16, 23:17
Ξανα-ζέσταμα μπαγιάτικου φαγητού:

Αναβάθμιση της γεννήτριας με το AD9850 που έχει να κάνει με τα εξής:



Αλλαγή οθόνης απο 2x16 χαρακτήρων σε TFT 2.4" SPI
Χειριστικά αντι μπουτόν, με δύο rotary encoders για θέση κλίμακας συχνότητας και μεταβολή συχνότητας.
Έλεγχος μέσω arduino Nano ή Micro PRO
Buzzer για το acknowledge του κλίκ των encoders.


66301663026630366304

To AD9850 λέει οτι πάει στα 40, αλλά επειδή τεζάρει, το κόβω στα 10MHz για να δίνει σήμα της προκοπής. Άρα ο τίτλος γίνεται:

0-10MHz Direct Digital Synthesis (DDS) Γεννήτρια συναρτήσεων (http://www.hlektronika.gr/forum/showthread.php?t=72185&p=629590#post629590)

Fire Doger
21-08-16, 23:27
Έχεις δοκιμάσει αν μπορεί να πάρει arbitrary waveforms? Είχα διαβάσει ότι σε μερικά ADχχ έγραφαν στην rom διαφορετικές τιμές (ή κάτι παρόμοιο έχει καιρό)

moutoulos
21-08-16, 23:46
Άρα ο τίτλος γίνεται:
0-10MHz Direct Digital Synthesis (DDS) Γεννήτρια συναρτήσεων (http://www.hlektronika.gr/forum/showthread.php?t=72185&p=629590#post629590)

Νταν :001_rolleyes:
Δεν ξέρω αν έμμεσα εννοούσες να τον αλλάξω ... εγώ πάντως το έκανα :biggrin:.

manolena
21-08-16, 23:50
Νταν :001_rolleyes:
Δεν ξέρω αν έμμεσα εννοούσες να τον αλλάξω ... εγώ πάντως το έκανα :biggrin:.

Μια χαρούλα έκανες!!!

manolena
21-08-16, 23:54
Έχεις δοκιμάσει αν μπορεί να πάρει arbitrary waveforms? Είχα διαβάσει ότι σε μερικά ADχχ έγραφαν στην rom διαφορετικές τιμές (ή κάτι παρόμοιο έχει καιρό)

Όχι Στέφανε, δεν το έχω κοιτάξει αυτό. Αλλά το να φτιάχνεις δικές σου κυματομορφές απο τα περιεχόμενα της μνήμης του AD9850 όπως ένα τέτοιο μοντουλάκι, μου φαίνεται ζόρικο.

(Αν δεν κάνω λάθος, αυτό δεν εννοείς; )

Fire Doger
22-08-16, 00:15
Ε ρε να μην βρίσκεις κάτι όταν το θες...:001_tt2:
Αν θυμάμαι καλά πρέπει να έπαιζε με τις τιμές του ημίτονου αλλάζοντας φάση συνέχεια οπότε ναι ακούγετε λίγο ζόρικο και είχε χαμηλές ταχύτητες δεν άξιζε τον κόπο, καλύτερα το κιτ με το R2R.
Τώρα βρήκα κάτι άλλο ενδιαφέρον με το AD9834 (http://www.ebay.com/itm/AD9834-DDS-Signal-Generator-Module-Sine-Triangle-Square-Wave-Digital-Programmabl-/121908187875?hash=item1c624b52e3:g:WxkAAOSwFNZW0rC K) στο hackaday (http://hackaday.com/2014/08/09/an-open-source-1mhz-abritrary-waveform-generator-with-an-awesome-ui/) που φτάνει το 1Mhz

Και αυτά εδώ (http://www.ebay.com/itm/24MHz-Dual-Channel-Arbitrary-Waveform-DDS-Function-Signal-Generator-Kit-FY3224S-/401168805486?hash=item5d67862e6e:g:t3cAAOSwV0RXq91 w) βγάζουν arbitrary δεν αξίζει τον κόπο να παιδευτείς

manolena
22-08-16, 00:31
...Τώρα βρήκα κάτι άλλο ενδιαφέρον με το AD9834 (http://www.ebay.com/itm/AD9834-DDS-Signal-Generator-Module-Sine-Triangle-Square-Wave-Digital-Programmabl-/121908187875?hash=item1c624b52e3:g:WxkAAOSwFNZW0rC K) στο hackaday (http://hackaday.com/2014/08/09/an-open-source-1mhz-abritrary-waveform-generator-with-an-awesome-ui/) που φτάνει το 1Mhz...

A, καλά, δεν βλέπω να ασχολούμαι παραπέρα... Άσε που είναι στα γαλλικά κι εγώ τα oui mama δεν τα μπορώ...


...Και αυτά εδώ (http://www.ebay.com/itm/24MHz-Dual-Channel-Arbitrary-Waveform-DDS-Function-Signal-Generator-Kit-FY3224S-/401168805486?hash=item5d67862e6e:g:t3cAAOSwV0RXq91 w) βγάζουν arbitrary δεν αξίζει τον κόπο να παιδευτείς...

Α, ρε και να σε έβλεπε κανας Κυριάκος με δαύτο... Θα σε έψελνε κανα δυο μήνες...

Fire Doger
22-08-16, 00:44
Α, ρε και να σε έβλεπε κανας Κυριάκος με δαύτο... Θα σε έψελνε κανα δυο μήνες...
χαχαχα δεν τον πρόλαβα εγώ:saad:
Όταν υπάρχουν οι απαιτήσεις για καλύτερο εξοπλισμό συνήθως υπάρχουν και τα χρήματα, αν αγοράζεις πολύ καλό εξοπλισμό για κάτι που δεν σου χρειάζεται το θεωρώ μεγάλη βλακεία, καλύτερα να τα ξοδέψεις σε κάτι ακόμα καλύτερο που σου χρειάζεται και θα κάνει απόσβεση.

Μέχρι και ο dave είχε πει πως για να μετρήσεις 2 μπαταρίες δεν χρειάζεται fluke, ένα 10$ από ebay αρκεί.:001_tt2:

SProg
22-08-16, 07:21
Μονο που ο Dave εχει Fluke :D

Fire Doger
22-08-16, 07:34
Μονο που ο Dave εχει Fluke :D
Και τώρα διαφημίζει αυτά που πουλάει:001_tt2: Δεν μετράει, εδώ είχε βγάλει thumbs up τον θερμό αέρα με το ανεμιστηράκι....

SeAfasia
22-08-16, 07:52
Μάνο ας μου επιτραπεί να ανεβάσω και αυτό το link με ίδια κατασκευή που περιέχει και τον κώδικα ανοικτό:
AD9850 DDS (http://www.ad7c.com/2013/07/ad9850-daughter-board-for-the-arduino-by-wb4chk/)

manolena
22-08-16, 08:18
Μία χαρά, είναι ακόμα μια παραλλαγή από όλες αυτές που έχουν αναπτύξει κυρίως RF-τζηδες για τα VFO τους. Κι εγώ μία τέτοια πήρα και την πείραξα λίγο, ας είναι καλά οι άνθρωποι...

misterno
22-08-16, 08:34
Νταν :001_rolleyes:
Δεν ξέρω αν έμμεσα εννοούσες να τον αλλάξω ... εγώ πάντως το έκανα :biggrin:.
Κι είμαι που λες αραχτός στον ακάλυπτο και πίνω το φραπεδάκι μου με τις 29 ζάχαρες και τσααααακ...
Αλλάζει ο τίτλος από 40 σε 10ΜΗΖ.
Και κλάαααμα η κυρία ρε παιδί μου!
Πλάκα πλάκα εγώ παρήγγειλα αυτό (http://www.aliexpress.com/item/DIY-DDS-Function-Signal-Generator-Module-Sine-Square-Sawtooth-Tri-angle-Wave-Kit/32640589774.html?spm=2114.13010608.0.90.sicj4K) από τον Αλή.

p.gabr
22-08-16, 08:45
Καλημέρα

Μοιας και βλέπω ότι το "κωλοβαρατε" να θέσω μια ερώτηση .
Μανο είναι εφικτό αντί για ψηφιακό counter να μπει rotary binary switch με αριθμιτη ώστε να πάρω βήματα 1 Μηζ 1-15 μηζ
Δεν μιλάω για το συγκεκριμένο κύκλωμα κάποιο παραπλήσιο η arduino

Edit
Περιστοφικος 4 bit με αριθμιση

https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcS4M0DGg0k3AR6EO80qM0uLYRJgmGG6H EURFEoUeutm8Mg8FT-qUghttps://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRoct3rPBm-HoW_XR5U9W0bdvSRXvWJH6Qg58wbXGZr9IXG8HFD

Fire Doger
22-08-16, 08:59
Κι είμαι που λες αραχτός στον ακάλυπτο και πίνω το φραπεδάκι μου με τις 29 ζάχαρες και τσααααακ...
Αλλάζει ο τίτλος από 40 σε 10ΜΗΖ.
Και κλάαααμα η κυρία ρε παιδί μου!
Πλάκα πλάκα εγώ παρήγγειλα αυτό (http://www.aliexpress.com/item/DIY-DDS-Function-Signal-Generator-Module-Sine-Square-Sawtooth-Tri-angle-Wave-Kit/32640589774.html?spm=2114.13010608.0.90.sicj4K) από τον Αλή.
:lool::lool: Προβλέπω και εξέγερση κατά τις εξουσίας σε λίγο:lool:

Μην περιμένεις πολλά πολλά από δαύτο, το ίδιο είχε βάλει ο καθηγητής σαν εργασία στην σχολή.
Το θετικό είναι πως έχει τα πλεονεκτήματα του arbitrary που συζητάμε παραπάνω γιατί ουσιαστικά έχει ένα πίνακα τιμών στην μνήμη για κάθε κυμματομορφή και απλώς μεταφέρει σειριακά τις τιμές του πίνακα στις εξόδους. Αλλάζοντας τις τιμές του πίνακα αλλάζεις την κυμματομορφή στην έξοδο.

Αυτό (http://www.electronics-lab.com/project/dds-function-generator/) πρέπει να αντέγραψαν αλλά δεν είμαι και σίγουρος, έχει και σχηματικό και κώδικα

manolena
22-08-16, 11:08
Καλημέρα

Μοιας και βλέπω ότι το "κωλοβαρατε" να θέσω μια ερώτηση .
Μανο είναι εφικτό αντί για ψηφιακό counter να μπει rotary binary switch με αριθμιτη ώστε να πάρω βήματα 1 Μηζ 1-15 μηζ
Δεν μιλάω για το συγκεκριμένο κύκλωμα κάποιο παραπλήσιο η arduino

Edit
Περιστοφικος 4 bit με αριθμιση

https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcS4M0DGg0k3AR6EO80qM0uLYRJgmGG6H EURFEoUeutm8Mg8FT-qUghttps://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRoct3rPBm-HoW_XR5U9W0bdvSRXvWJH6Qg58wbXGZr9IXG8HFD

Για VFO είναι Παναγιώτη; Εννοώ πώς χρειάζεσαι επιλογή συχνότητας ανά 1MHz σε 16 βήματα; Υπάρχει κάποια επιπλέον πληροφορία για σχετικό κύκλωμα;

Αν μιλάμε για κάτι τέτοιο

http://blog.ht717.com/dds-vfo-versi-717-with-s-meter/#.V7quqp9RXqA

...αλλά μέχρι 16MHz και αντί περιστροφικό επιλογέα (encoder), να έχει binary;

Δεν το πολυ-κατέχω με τα ερτζιανά, συμπαθατε με...

finos
22-08-16, 11:41
Μια γενητρια συχνότητων που είναι χρησιμη σε ενα εγαστιριο ;

Fire Doger
22-08-16, 12:00
Μια γενητρια συχνότητων που είναι χρησιμη σε ενα εγαστιριο ;
Συνήθως για να δοκιμάσεις κάτι έχοντας μια γνωστή σταθερή συχνότητα.
Για παράδειγμα για να κάνεις μια AM διαμόρφωση, να δεις αν ο μΕ σου μετράει σωστά στα 60.000 RPM του κινητήρα, δοκιμές θορύβου κλπ κλπ.

Συνήθως συναντάτε πολύ στις τηλεπικοινωνίες και στους μΕ. Αν για παράδειγμα θες να στείλεις ένα pwm σε ένα transistor αντί να προγραμματίσεις arduino κοπανάς την γεννήτρια.
Οι καινούριες (ψηφιακές) έχουν και "φτιαχτά" (arbitrary) σήματα, μπορείς δηλαδή να στέλνεις κάποια bits συνέχεια κάπου ή ένα "παλαβό" σήμα, και διάφορα άλλα.
Πάει πάντα σετ μαζί με παλμογράφο (μια γεννήτρια 1Mhz σου είναι άχρηστη όταν έχεις παλμογράφο με το ζόρι 20khz) και με φασματογράφο αν σου χρειάζεται.
Όπως και με τον φασματογράφο αν το χρειαστείς θα το καταλάβεις. Είναι απ' τα must ενός εργαστηρίου και στην σχολή το 90% των ηλεκτρονικών θα περιέχει γεννήτρια (ή ένα 555 επειδή δεν υπάρχουν χρήματα και τις γ@μ@νε οι φοιτητές)

*Υπάρχουν εφαρμογές και για τον υπολογιστή και για το κινητό για να βγάλουν σήμα γεννήτριας απ' το audio jack (με προσοχή μην κάψεις καμιά μητρική-κινητό)

MacGyver
22-08-16, 12:14
Καλημέρα

Μοιας και βλέπω ότι το "κωλοβαρατε" να θέσω μια ερώτηση .
Μανο είναι εφικτό αντί για ψηφιακό counter να μπει rotary binary switch με αριθμιτη ώστε να πάρω βήματα 1 Μηζ 1-15 μηζ
Δεν μιλάω για το συγκεκριμένο κύκλωμα κάποιο παραπλήσιο η arduino

Edit
Περιστοφικος 4 bit με αριθμιση

https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcS4M0DGg0k3AR6EO80qM0uLYRJgmGG6H EURFEoUeutm8Mg8FT-qUghttps://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRoct3rPBm-HoW_XR5U9W0bdvSRXvWJH6Qg58wbXGZr9IXG8HFD
Οι rotary encoder (http://www.ebay.com/itm/Rotary-Encoder-Module-Brick-Sensor-Development-KY-040-Fit-For-Arduino-/281678079368?hash=item4195526588:g:nE8AAOSwBahVQfJ 7) είναι η καλύτερη λύση για γρήγορη αλλαγή στη συχνότητα (ραδιοφωνικό ψάξιμο), δεσμεύουν ελάχιστα πιν (3) στο arduino, και έχουν τρεις δυνατότητες: πάνω, κάτω, και αλλαγή βήματος η mode (από το software).
Μειονέκτημα: θέλουν οθόνη για απεικόνιση και μνήμη στο software.

Τα Thumbwheel (http://tronixstuff.com/wp-content/uploads/2011/08/switchesss.jpg) απεικονίζουν την συχνότητα, έχουν μνήμη αλλά δεν είναι πρακτικά για ψάξιμο σε δέκτες (vfo).
Επιπλέον επειδή έχουν παράλληλη έξοδο (4 πιν σε κάθε ψηφίο), για τη σύνθεση όλης της συχνότητας χρειάζεται interface σε σειριακή λογική η κάτι άλλο, καθότι διαφορετικά θα χρειάζονταν 20+ dig in στο arduino.
Μπορεί βέβαια να γίνει και DAC με αντιστάσεις στις εξόδους του διακόπτη οπότε κάθε διακόπτης δεσμεύει μία αναλογική αντί για τέσσερις ψηφιακές.
Αν το βήμα είναι μόνο ένα ψηφίο όπως λες, τότε είναι ποιο απλά τα πράγματα.

manolena
22-08-16, 13:08
Άμα λέω εγώ ότι είναι μεγάλο σχολείο εδώ μέσα...

SeAfasia
22-08-16, 13:33
Άμα λέω εγώ ότι είναι μεγάλο σχολείο εδώ μέσα...

όχι το κρυφό Μάνο,ανοικτό πανεπιστήμιο....και τσάμπα!!:biggrin:

p.gabr
22-08-16, 13:42
Steve για ένα και μόνο ψηφίο, αυτό των ΜΗΖ
Με δυο τέτοιους μεταγωγους, δηλαδή ΠΧ να έχουν την ένδειξη 0-1 κσι να έχουμε έξοδο 1 Μηζ, 0-5 έξοδο 5 MHz ένδειξη 1-2 έξοδο 12Μηζ

Με δυο (κολλητους στο δίπλα) σαν αυτούς που έδειξα
https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRoct3rPBm-HoW_XR5U9W0bdvSRXvWJH6Qg58wbXGZr9IXG8HFD

manolena
22-08-16, 13:55
Δηλαδή Παναγιώτη, το εύρος πρέπει να είναι μέχρι 16MHz σε 16 βήματα του 1 MHz; Δεν χρειάζεται πιο μικρομετρική ρύθμιση όπως γίνεται με τους encoders;

Γίνεται αυτό που λες αλλά για να μην σπαταλωνται πολλά pins, μία επέκταση από 8 I/Οs σε π.χ. PCF8574 ορισμένα σαν είσοδοι και εμπλοκή σειριακού διαύλου I2C είναι μάλλον ο,τι πρέπει.

MacGyver
22-08-16, 14:48
Δεν έχω διαβάσει όλο το θέμα, πάντως είναι κυρίως θέμα κώδικα.
Αποφασίζεις για το hardware και μετά επεμβαίνεις στον κώδικα.
Αν γίνει χρήση του τρικ του DAC , με την λογική που διαβάζει το UP-DOWN, θα διαβάσει και τη θέση του θαμπγουιλ και θα προσθέσει το αντίστοιχο νούμερο στην εξίσωση καθορισμού της συχνότητας.

-if(analogRead(buttonPin)>=χχχ && analogRead(buttonPin)<=χχχ).......
-case x: toFrequency = (toFrequency + 1000000);
-case y: toFrequency = (toFrequency + 2000000); κλπ


#include <stdio.h>
#include <dds.h>
#include <LiquidCrystal.h>
#include <WString.h>


#define data_pin 12
#define load_pin A5
#define clock_pin A4
#define clock_hz 120000000LL




#define RESET 13
#define data_pin 12
#define load_pin A5
#define clock_pin A4
#define clock_hz 120000000LL
#define calibrationValue -0.0400000 // this is a value we change to calibrate our particular chip more accurately
#define buttonPin A0
#define SINE_output 21
#define SQUARE_output 20


// chip, data_pin, load_pin, clock_pin, clock_hz
//dds ddschip(DDS9850, data_pin, load_pin, clock_pin, clock_hz); // set my dds up with 120mhz onboard crystal
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


// some variables to use in our program
long toFrequency = 8000000;
long currentFrequency;
long maxFrequency = 40000000;
long minFrequency = 0;
int incrementNumber = 6;
int maxprogramnumber = 2; // dont forget to increase the menu numbers here!!
int programnumber = 1;
boolean menu_flag1 = 0;
boolean menu_flag2 = 1;
void booting();
void menu();


byte sine_1[8] = {
B00011,
B00100,
B00100,
B01000,
B01000,
B10000,
B10000,
B10000
};
byte sine_2[8] = {
B11000,
B00100,
B00100,
B00010,
B00010,
B00001,
B00001,
B00001
};
byte sine_3[8] = {
B10000,
B10000,
B10000,
B01000,
B01000,
B00100,
B00100,
B00011
};
byte sine_4[8] = {
B00001,
B00001,
B00001,
B00010,
B00010,
B00100,
B00100,
B11000
};
byte square_1[8] = {
B11111,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000
};
byte square_2[8] = {
B11111,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001
};
byte square_3[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B11111
};
byte square_4[8] = {
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B11111
};
void setup()
{
//Serial.begin(9600);
lcd.createChar(0, sine_1); delay(10);
lcd.createChar(1, sine_2); delay(10);
lcd.createChar(2, sine_3); delay(10);
lcd.createChar(3, sine_4); delay(10);
lcd.createChar(4, square_1); delay(10);
lcd.createChar(5, square_2); delay(10);
lcd.createChar(6, square_3); delay(10);
lcd.createChar(7, square_4); delay(10);
// set up the LCD"s number of columns and rows:
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
booting();
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" 0-40MHz DDS "); //Print a little message
lcd.setCursor(0, 1);
lcd.print(" MANOS MAR V1.0 ");
delay(5000);
// setup pins
pinMode(RESET, OUTPUT);
pinMode(data_pin, OUTPUT);
pinMode(load_pin, OUTPUT);
pinMode(clock_pin, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
pinMode(SINE_output, OUTPUT);
pinMode(SQUARE_output, OUTPUT);
digitalWrite(SINE_output, HIGH);
digitalWrite(SQUARE_output, LOW);


//ddschip.calibrate(calibrationValue); // this is a value we change to calibrate our particular chip more accurately
//ddschip.setfrequency(toFrequency);
lcd.clear();
}


void loop()
{
if(toFrequency > maxFrequency)
{
(toFrequency = maxFrequency);
lcd.clear();
lcd.print(" ERROR: Maximum ");
lcd.setCursor(0, 1);
lcd.print(" Freq. achieved ");
delay(2000);
}
if(toFrequency < minFrequency)
{
(toFrequency = minFrequency);
lcd.clear();
lcd.print(" ERROR: Minimum ");
lcd.setCursor(0, 1);
lcd.print(" Freq. achieved ");
delay(2000);
}
//ddschip.setfrequency(toFrequency);
currentFrequency = toFrequency;

switch(incrementNumber)
{
case 0:
//Serial.println("STEP: 1Hz");//"increment amount is 1hz"
lcd.setCursor(0, 0);
lcd.print("STEP: x1Hz");
break;

case 1:
//Serial.println("STEP: 10Hz");//"increment amount is 10hz"
lcd.setCursor(0, 0);
lcd.print("STEP: x10Hz");
break;

case 2:
//Serial.println("STEP: x100Hz");
lcd.setCursor(0, 0);
lcd.print("STEP: x100Hz");
break;

case 3:
//Serial.println("STEP: x1KHz");
lcd.setCursor(0, 0);
lcd.print("STEP: x1KHz");
break;

case 4:
//Serial.println("STEP: x10KHz");
lcd.setCursor(0, 0);
lcd.print("STEP: x10KHz");
break;

case 5:
//Serial.println("STEP: x100KHz");
lcd.setCursor(0, 0);
lcd.print("STEP: x100KHz");
break;

case 6:
//Serial.println("STEP: x1MHz");
lcd.setCursor(0, 0);
lcd.print("STEP: x1MHz");
break;

default:
//Serial.println("STEP: x100Hz");
lcd.setCursor(0, 0);
lcd.print("STEP: x100Hz");
break;
}

lcd.setCursor(0, 1);
lcd.print("Fo = "); //Print to lcd
lcd.setCursor(5, 1);
lcd.print(currentFrequency);
lcd.print(" Hz ");

//Serial.println(incrementNumber); // temporary for debuggin delete me

//Serial.print("Current Frequency is set to :");
//Serial.println(currentFrequency);

while((analogRead(buttonPin))>=1000)
{

}
delay(5);
if(analogRead(buttonPin)>=100 && analogRead(buttonPin)<=200)
{
// we have pushed up
upFrequency();
delay(300);
}


if(analogRead(buttonPin)>=200 && analogRead(buttonPin)<=400)
{
// we have pushed down
downFrequency();
delay(300);
}

if((analogRead(buttonPin))<=50)
{
// we have pushed right
incrementNumber++;
delay(300);
}

if(analogRead(buttonPin)>=400 && analogRead(buttonPin)<=600)
{
// we have pushed left
incrementNumber--;
delay(300);
}

if(analogRead(buttonPin)>=650 && analogRead(buttonPin)<=1000)
{
programnumber++;
menu();
delay(300);
}


if(incrementNumber > 6)
{
incrementNumber = 0;
} // this is where the menu goes around and around
if(incrementNumber < 0)
{
incrementNumber = 6;
}

if(programnumber > 1)
{
programnumber = 0;
} // this is where the menu goes around and around
if(programnumber < 0)
{
programnumber = 1;
}

delay(100);
lcd.clear();

}


void upFrequency()
{
//Serial.println("Going UP Frequency");
switch(incrementNumber)
{
case 0:
toFrequency = (toFrequency + 1);
break;

case 1:
toFrequency = (toFrequency + 10);
break;

case 2:
toFrequency = (toFrequency + 100);
break;

case 3:
toFrequency = (toFrequency + 1000);
break;

case 4:
toFrequency = (toFrequency + 10000);
break;

case 5:
toFrequency = (toFrequency + 100000);
break;
case 6:
toFrequency = (toFrequency + 1000000);
break;

default:
toFrequency = (toFrequency + 10);
break;
}
}


void downFrequency()
{
//Serial.println("Going DOWN Frequency");
switch(incrementNumber)
{


case 0:
toFrequency = (toFrequency - 1);
break;

case 1:
toFrequency = (toFrequency - 10);
break;

case 2:
toFrequency = (toFrequency - 100);
break;

case 3:
toFrequency = (toFrequency - 1000);
break;

case 4:
toFrequency = (toFrequency - 10000);
break;

case 5:
toFrequency = (toFrequency - 100000);
break;

case 6:
toFrequency = (toFrequency - 1000000);
break;

default:
toFrequency = (toFrequency - 10);
break;
}
}


void menu()
{
while((analogRead(buttonPin))>=1000)
{

}
delay(5);
switch(programnumber)
{
case 1:
lcd.clear();
lcd.print("OUTPUT: ");
lcd.write(8);
lcd.write(1);
lcd.setCursor(0,1);
lcd.print("SINE ");
lcd.write(2); lcd.write(3);
digitalWrite(SINE_output, HIGH);
digitalWrite(SQUARE_output, LOW);
menu_flag1 = 1;
menu_flag2 = 0;
delay(2000);
break;

case 2:
lcd.clear();
lcd.print("OUTPUT: ");
lcd.write(4);
lcd.write(5);
lcd.setCursor(0,1);
lcd.print("SQUARE ");
lcd.write(6); lcd.write(7);
digitalWrite(SINE_output, LOW);
digitalWrite(SQUARE_output, HIGH);
menu_flag1 = 0;
menu_flag2 = 1;
delay(2000);
break;

default:
menu_flag1 = 1;
menu_flag2 = 1;
break;
}

}


void booting()
{
int i;
int cur = 7;

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Booting ");
for(i=4; i>0; i--)
{
lcd.setCursor(cur, 0);
cur++;
lcd.print(".");
delay(400);
if(cur==10) continue;
}
cur = 7;
lcd.setCursor(cur, 0);
lcd.print(" ");
for(i=4; i>0; i--)
{
lcd.setCursor(cur, 0);
cur++;
lcd.print(".");
delay(400);
if(cur==10) continue;
}
}

misterno
22-08-16, 15:11
Μιας και αναφερθήκατε σε rotary encoder, ποια η διαφορά ενός rotary encoder 360 χωρίς μπουτόν και ποια με button;
Στον κώδικα πως φαίνεται η διαφορά;
Διαβάζω την βιβλιοθήκη arduino Encoder_Master και αναφέρει μέσα για click και doubleclick functions.
Έχει να κάνει με το τρόπο συνδεσμολογίας;

manolena
22-08-16, 15:54
Ο απλός encoder (που δεν νομιζω να υπάρχει), έχει μόνο δυο επαφές που ανοιγοκλείνουν με την περιστροφή, ενώ αυτός με ενσωματωμένο διακόπτη επιπλέον στον άξονα έχει και τρίτη επαφή. Ο πρώτος χρειάζεται δύο pins (είθισται με interrupt), ενώ ο δεύτερος θέλει τρία. Είναι δε πολύ πρακτικός γιατί ενώ περιστρέφοντας ρυθμίζεις μία μεταβλητη, πατώντας τον άξονα την αποθηκευεις, αλλαζεις μενού. Μπορείς επίσης με την κατάλληλη βιβλιοθήκη να εκμεταλλευτείς μονό πάτημα , διπλό πάτημα, διαρκές πάτημα κτλ.

kioan
22-08-16, 15:56
Μιας και αναφερθήκατε σε rotary encoder, ποια η διαφορά ενός rotary encoder 360 χωρίς μπουτόν και ποια με button;

Αυτά με μπουτόν έχουν μία επιπλέον επαφή που κλείνει όταν πατιέται.

(με πρόλαβε ο από πάνω και απάντησε αναλυτικότερα :wiink:)

manolena
22-08-16, 15:58
Εσύ ο από κάτω να είσαι πιο γρήγορος!!!!!!!

misterno
22-08-16, 16:28
Ο απλός encoder (που δεν νομιζω να υπάρχει), έχει μόνο δυο επαφές που ανοιγοκλείνουν με την περιστροφή, ενώ αυτός με ενσωματωμένο διακόπτη επιπλέον στον άξονα έχει και τρίτη επαφή. Ο πρώτος χρειάζεται δύο pins (είθισται με interrupt), ενώ ο δεύτερος θέλει τρία. Είναι δε πολύ πρακτικός γιατί ενώ περιστρέφοντας ρυθμίζεις μία μεταβλητη, πατώντας τον άξονα την αποθηκευεις, αλλαζεις μενού. Μπορείς επίσης με την κατάλληλη βιβλιοθήκη να εκμεταλλευτείς μονό πάτημα , διπλό πάτημα, διαρκές πάτημα κτλ.
Μάνο, αυτό (http://www.aliexpress.com/item/Free-Shipping-360-degrees-rotary-encoder-module-For-module-We-are-the-manufacturer/32527999742.html?spm=2114.13010608.0.56.yV4eG3) που παρήγγειλα σε ποια κατηγορία encoder ανήκει;

finos
22-08-16, 16:31
Αυτός νομίζω έχει κουμπί .

manolena
22-08-16, 16:41
Μάνο, αυτό (http://www.aliexpress.com/item/Free-Shipping-360-degrees-rotary-encoder-module-For-module-We-are-the-manufacturer/32527999742.html?spm=2114.13010608.0.56.yV4eG3) που παρήγγειλα σε ποια κατηγορία encoder ανήκει;

Είναι με διακόπτη στον άξονα. Αν δεις στο πλακετάκι, έχει πέντε σήματα VCC, GND, SW, CLK, DT

Το SW είναι για τον άξονα, τα CLK, DT για τον encoder. Βρίσκεις τρία πινάκια με interrupt και τα συνδέεις. Το βράδυ περισσότερα με παραδείγματα, τώρα είμαι με το τηλέφωνο...

Σημείωση: υπάρχει σχετική βιβλιοθήκη που μπορείς να κάνεις interrupt assignment και σε άλλα πινάκια εκτός των INT0, INT1, INT2 αν αυτά τα χρειάζεσαι για άλλες δουλειές.

p.gabr
22-08-16, 17:39
Δηλαδή Παναγιώτη, το εύρος πρέπει να είναι μέχρι 16MHz σε 16 βήματα του 1 MHz; Δεν χρειάζεται πιο μικρομετρική ρύθμιση όπως γίνεται με τους encoders;

Γίνεται αυτό που λες αλλά για να μην σπαταλωνται πολλά pins, μία επέκταση από 8 I/Οs σε π.χ. PCF8574 ορισμένα σαν είσοδοι και εμπλοκή σειριακού διαύλου I2C είναι μάλλον ο,τι πρέπει.

Μιλώ για ακέραιες συχνότητες τα υπόλοιπα μηδενικά πχ 12.000

Τέλος πάντων αναστατωσα λίγο το θέμα με τις αρλούμπες μου ,όλα γίνονται αλλά πως γίνονται?

Απλώς αυτά τα έχω δει αλλά τότε ήταν πολύπλοκα ήθελαν πολύ υλικό και απλά ρώτησα μήπως τώρα είναι πιο απλο.

Edit
Και εγώ με το κινητό είμαι και είναι περί ορισμένες οι δυνατότητες
Ένας τέτοιος περιστροφικος μεταγωγός δίνει αυτούς τους κώδικες

https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQPIeoU0QqNxdI1vNT1hgTSNlcVdO3ES dM0kTfV3XYA_l9h5Axev-OKAQPv


https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcSV6RiRbwGnTLxaJEw-ATkr0HNt-ehiArkc3XdezypDe_J_D8N-VA

manolena
22-08-16, 18:25
Μη σε νοιάζει, όλα γίνονται! Ούτε αναστατώνεις το θέμα, ούτε τίποτα... Να ρωτησω, τους διακόπτες τους έχεις;

p.gabr
22-08-16, 18:38
Όχι τώρα αλλά είναι δυνατόν προσεχώς οπότε μην μιλάμε ξεκάρφωτα, ενδεχομένως να υπάρχει κάποια διαφορά

manolena
22-08-16, 18:40
Ωραία, μόλις τους έχεις, στείλε data ή link και θα γίνει όπως το χρειάζεσαι. Μην αγχωνεσαιιιιιιιιι!!!!!!!

p.gabr
22-08-16, 20:39
66305

66306


Μάνο θυμόμουν ότι αυτό το είχα και το βρήκα , είναι 18 θέσεων και αυτό θα με βόλευε αν ήταν πιο εύκολο .
Θα ήθελα εάν γινόταν στη θέση 1 να ξεκινάει από 4.000Mhz έως θέση 18 22.000mhz

manolena
22-08-16, 22:02
Δεν έχω ξαναδεί τέτοιο πράγμα... Μοιάζει με (διπλό; τετραπλό; ) μεταγωγικό (16; 18; ) θέσεων;

p.gabr
22-08-16, 22:17
Δεν είναι εμπορίου αυτό βρε Μανο ,είναι ειδικών περιπτώσεων .
Ναι είναι μεταγωγος 18 θέσεων με μια "μάνα " φαίνεται λίγο στην πλάγια φωτογραφία , και μην φανταστείς πως είναι τεράστιος, μικρός είναι σύγκρινε τον με τον άξονα

SRF
22-08-16, 22:23
Δεν έχω ξαναδεί τέτοιο πράγμα... Μοιάζει με (διπλό; τετραπλό; ) μεταγωγικό (16; 18; ) θέσεων;

Κλασσικότατος (και υπέροχος) περιστροφικός μεταγωγικός διακόπτης 1Χ18 είναι!

p.gabr
22-08-16, 22:29
Κλασσικότατος (και υπέροχος) περιστροφικός μεταγωγικός διακόπτης 1Χ18 είναι!


Αχχχ αυτοί οι νεαροί, η πορσελάνη και τα ασημικά, νομίζουν ότι είναι μονό για φαΐ ](*,)

manolena
22-08-16, 22:32
Για να χρησιμοποιηθεί αυτός θα πρέπει να κάνεις έναν decoder σαν αυτόν:

66307
...για να μπορέσει ο μ/Ε να πάρει 4 ψηφία για όλες τις 16 θέσεις. Με απλές διόδους και μικρά φορτία αντιστάσεων πρόσδεσης.

manolena
22-08-16, 22:33
Αχχχ αυτοί οι νεαροί, η πορσελάνη και τα ασημικά, νομίζουν ότι είναι μονό για φαΐ ](*,)

Ναι, τα παλιόπαιδα!!!!

SProg
22-08-16, 22:36
1 αναλογική εισοδο θελεις και μπολικες (n-1) αντιστασεις.

manolena
22-08-16, 22:42
1 αναλογική εισοδο θελεις και μπολικες (n-1) αντιστασεις.

Απο κάτι τέτοια φαίνεται ένας μηχανικός. 66308

SRF
22-08-16, 22:51
Για να χρησιμοποιηθεί αυτός θα πρέπει να κάνεις έναν decoder σαν αυτόν:

66307
...για να μπορέσει ο μ/Ε να πάρει 4 ψηφία για όλες τις 16 θέσεις. Με απλές διόδους και μικρά φορτία αντιστάσεων πρόσδεσης.

Ένα απλό... SN74LS674 (http://www.ti.com/product/SN74LS674) με δύο έξτρα διόδους και τελείωσες!

manolena
22-08-16, 22:54
Ένα απλό... SN74LS674 (http://www.ti.com/product/SN74LS674) με δύο έξτρα διόδους και τελείωσες!

E, έλεγα πως ο Παναγιώτης αφού είναι της παλιάς καλής σχολής, να μην μπλέξει με τέτοια.

p.gabr
22-08-16, 23:00
ok ευχαριστώ παιδιά μην σας κουράζω άλλο , μέχρι εκεί στον decorder τα ήξερα Μάνο , έλεγα μήπως έχει αλλάξει κάτι
Ενας άλλος μεταγωγος που είχαμε σε κάτι συσκευές ήταν αυτοί οι πατητοί

66309

Σας ευχαριστώ για το κουτσομπολιο, πάει μακριά η βαλίτσα, και έτσι εγκαταλείπω
Το ήθελα άπλα εαν γίνεται για το ραδιόφωνο που έχω φτιάξει και που χρειάζεται να αλλάζω κρυστάλλους για τις μπάντες (4-20 mhz και δεν τους έχω και όλους) , είχα σκεφτεί βεβαία κάποιο pll , άλλα δεν μου άρεσαν τα ψηφιακά display .


edit
Ναι Γιωργο και αυτό το ήξερα πως γίνεται από εκεί και πέρα κολλάω

SProg
22-08-16, 23:01
Aυτη ειναι κλασικη λυση συνηθως για Keypad.Σου γλυτωνει μια hardware διακοπη και μερικα Ι/Ο.

To θεμα ειναι οτι εχει 18 θεσεις (!!) και εφοσον τις θελουμε και τις 18..τοτε αναγκαστικα αυξανονται τα extra.

manolena
22-08-16, 23:14
ok ευχαριστώ παιδιά μην σας κουράζω άλλο , μέχρι εκεί στον decorder τα ήξερα Μάνο , έλεγα μήπως έχει αλλάξει κάτι
Ενας άλλος μεταγωγος που είχαμε σε κάτι συσκευές ήταν αυτοί οι πατητοί

66309

Σας ευχαριστώ για το κουτσομπολιο, πάει μακριά η βαλίτσα, και έτσι εγκαταλείπω
Το ήθελα άπλα εαν γίνεται για το ραδιόφωνο που έχω φτιάξει και που χρειάζεται να αλλάζω κρυστάλλους για τις μπάντες (4-20 mhz και δεν τους έχω και όλους) , είχα σκεφτεί βεβαία κάποιο pll , άλλα δεν μου άρεσαν τα ψηφιακά display .


edit
Ναι Γιωργο και αυτό το ήξερα πως γίνεται από εκεί και πέρα κολλάω

Έχεις αυτό:

66310

66311

...που δίνει αυτό:

66312

Με αυτό το σχηματικό:

66313

...και λίγο κώδικα, απλό, έχεις 16 θέσεις στο πρόγραμμα για να αλλάξεις σε 16 βήματα τη συχνότητα.

0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F

Μην τα παρατάς τώρα, μια χαρά θα γίνει το ραδιοφωνάκι σου.

p.gabr
22-08-16, 23:25
Nαι για αυτό ακριβώς μιλούσα στην αρχή ,με αυτόν τον κώδικα ,αλλά όπως σου είπα πρέπει να ρωτήσω εν υπάρχει ακόμα σε κάτι φίλους , αλλά σιγά και να το παραγγείλω πόσο θα κάνει ??

SProg
22-08-16, 23:33
Απο 4 εως 22MHz ειναι 19 συνδιασμοι με βημα 1.Αλλιως αυξανεις βημα ή μειωνεις ευρος.

fotisr
22-08-16, 23:51
Εξοχα Μανο μπραβο σου.

SRF
23-08-16, 00:52
ok ευχαριστώ παιδιά μην σας κουράζω άλλο , μέχρι εκεί στον decorder τα ήξερα Μάνο , έλεγα μήπως έχει αλλάξει κάτι
Ενας άλλος μεταγωγος που είχαμε σε κάτι συσκευές ήταν αυτοί οι πατητοί

66309

Σας ευχαριστώ για το κουτσομπολιο, πάει μακριά η βαλίτσα, και έτσι εγκαταλείπω
Το ήθελα άπλα εαν γίνεται για το ραδιόφωνο που έχω φτιάξει και που χρειάζεται να αλλάζω κρυστάλλους για τις μπάντες (4-20 mhz και δεν τους έχω και όλους) , είχα σκεφτεί βεβαία κάποιο pll , άλλα δεν μου άρεσαν τα ψηφιακά display .


edit
Ναι Γιωργο και αυτό το ήξερα πως γίνεται από εκεί και πέρα κολλάω


Κλασσικό 4-πλό Thumb-wheel που δίνει με 4 εξόδους αυτόματα BCD ανα ψηφίο!

Πόσα θέλεις... ? :biggrin:

SeAfasia
14-09-16, 12:29
Mάνο,μπορείς να ανεβάσεις το κώδικα να κάνω δοκιμή στο dds μου;

manolena
14-09-16, 12:47
Κώστα, δες λίγο το #3 (http://www.hlektronika.gr/forum/showthread.php?t=72185&p=618054&viewfull=1#post618054)

SeAfasia
14-09-16, 12:57
Κώστα, δες λίγο το #3 (http://www.hlektronika.gr/forum/showthread.php?t=72185&p=618054&viewfull=1#post618054)

compilation terminated.

exit status 1
Error compiling for board Arduino Nano.

τα λέμε αργότερα,πάω για δουλεια....:biggrin:

manolena
14-09-16, 13:09
Κάτσε βρε ένα λεπτό... Πάρε και τη βιβλιοθήκη

SeAfasia
14-09-16, 23:14
Κάτσε βρε ένα λεπτό... Πάρε και τη βιβλιοθήκη


Sketch uses 4,372 bytes (14%) of program storage space. Maximum is 30,720 bytes.
Global variables use 394 bytes (19%) of dynamic memory, leaving 1,654 bytes for local variables. Maximum is 2,048 bytes.
An error occurred while uploading the sketch

Γιατί;Δεν έχω την πείρα.....:saad:

manolena
14-09-16, 23:16
Έχεις τη βιβλιοθήκη σε δικό της φάκελο στο directory ...\arduino xxx\libraries ;

Κάνε ένα PrintScreen και βάλε φωτογραφία την οθόνη. Κάνει compiling αλλά όχι uploading;

SeAfasia
14-09-16, 23:36
δλδ είναι να κτυπάς το κεφάλι σου στον τοίχο....το πρωί δούλευε κανονικά Μάνο...
τα δύο .zip αρχεία τα έχω στο documents\arduino\libraries σωστά;

SeAfasia
15-09-16, 23:28
τοπρόβλημα επιλύθηκε.....αχ αυτά τα headers

manolena
16-09-16, 09:45
Για πες, τι πατάτα έγινε; Καμιά φωτογραφία απο οθόνη; Δουλεύει εντάξει;

SeAfasia
16-09-16, 23:50
Τι εννοώ και αν κάπου είμαι ελλειπής ας με διορθώσετε,
καθώς εγκαθιστούμε το IDE του arduino δημιουργεί δύο φακέλους,έναν στο Documents/Arduino και τον δεύτερο στο Windows/Program Files(x86).
Μια υπόδειξη οι δύο αυτοί φάκελοι εξαρτώνται και από το είδος του λειτουργικού στο που θα εγκατασταθούν δλδ διαφορετικό στα Windows - Linux - Mac κτλπ...
Τώρα όσον αφορά τον κώδικα του φίλου μας AD7C του οποίου ανήκει η πατρότητα(ad7c (http://www.ad7c.com/projects/ad9850-dds-vfo/)) έπρεπε να ακολουθήσω τα εξής βήματα:

1.ξεζιπάρουμε το αρχείο που καταβάσαμε σε κάποιο φάκελο πχ στο Documents
2.Tώρα μέσα στο φάκελο θα βρούμε έναν υποφάκελο με όνομα AD9850_LCD_ROTARY_WMENUS ο οποίος περιέχει τα
AD9850_LCD_ROTARY_WMENUS
AD9850_LCD_ROTARY_WMENUS_IF το οποίο σβήνουμε(ή αν θέλουμε το κρατάμε αν θέλουμε να κρατήσουμε την IF επιλογή του DDS θα πω άλλη φορά τι είναι αυτό).
3.Κλείνουμ τον φάκελο και αλλάζουμε το ονομά του σε AD9850
4.Το φάκελο αυτό το κάνουμε copy/paste στο Documents/Arduino.
5.Γυρνάμε το ξεζιπαρισμένο φάκελο KAI στο φάκελο RotarySource/libraries/rotary/rotary3 διαγράφουμε τα rotary και rotary3 αφήνοντας μόνο το libraries.
6.Mέσα στο φάκελο libraries θα βρούμε έναν υποφάκελο με όνομα Rotary που περιέχει τα δύο αρχεία rotary.ccp και το header αρχείο rotary.h,κάπου εδώ έτρωγα την "χλέμπα" και δεν μπορούσα να κάνω compiling/upload το κώδικα του AD7C....τεσπα!!
7.Τώρα,τo φάκελο με τα δύο αυτά αρχεία,μέσω copy/paste τα τοποθετούμε στην διαδρομή
Windows 10/Program Files(x86)/Arduino/Libraries
8.Tέλος επιστρέφουμε στο φάκελο(ή μέσω του arduino IDE) AD9850 που περιέχει το AD9850_LCD_ROTARY_WMENUS και με διπλό κλικ κάνουμε compiling/upload το κωδικά μας....

Μάνο παρόμοια σειρά ακολούθησα στον κωδικά σου και είχα θέμα με τα pins,

Not used: C:\Program Files (x86)\Arduino\libraries\Manolena_dds
exit status 1
no matching function for call to 'dds::dds(int, int, const uint8_t&, const uint8_t&, long long int)'

θα φτιάξω τον κώδικα με την διάταξη σού αν βρώ χρόνο..Πιστεύω να βοήθησα παίδες...:biggrin:

Fire Doger
17-09-16, 00:16
7 :confused1:
Στο documents/Arduino υπάρχει υποφάκελος libraries (στον οποίο μπαίνουν και ότι lib έχεις κατεβάσει απ' την διαχείριση βιβλιοθηκών του IDE).
Γιατί το έβαλες στο program files? Όταν κάνεις update το arduino θα κάνει uninstall και reinstall και θα χαθούν ότι μετατροπές έκανες στο program files.

manolena
17-09-16, 09:12
Κώστα, είναι απλό το ζήτημα:
Για να κατεβάσεις την τελευταία έκδοση του Arduino IDE πας στην αντίστοιχη σελίδα και επιλεγεις το zip file για "NON ADMIN INSTALLATION". Κατεβάζεις όλο το πακέτο και το ξεζιπαρεις όπου γουστάρεις και τρέχει αυτόνομα. Ούτε program files, ούτε τίποτα. Αλλιώς, συμβαίνουν όλα αυτά που λέει ο Στέφανος.

SeAfasia
17-09-16, 23:50
Ευχαριστώ Μάνο,Στέφανε λειτουργεί άψογα...αλλά γιατί είχα θέμα;

Fire Doger
18-09-16, 04:57
Θέμα δεν είχες, απλώς επειδή έχεις την έκδοση που θέλει install όταν θα έκανες update τον IDE θα σου έβγαζε σφάλματα το compile (του συγκεκριμένου sketch) γιατί ο φάκελος που έφτιαξες και έβαλες στις βιβλιοθήκες θα είχε εξαφανιστεί γιατί το update του IDE είναι απεγκατάσταση παλιού-εγκατάσταση νέου, με την απεγκατάσταση κάνει delete όλο τον φάκελο "Arduino" στα program files.
Ότι βάλεις στο documents/Arduino μένει και μετά την απεγκατάσταση-αναβάθμιση του IDE.

Με την stand alone έκδοση που λέει ο Μάνος κάνεις copy paste τον φάκελο με τις βιβλιοθήκες σου από τον φάκελο με την παλιά έκδοση στον φάκελο με την καινούρια και τέλος.