HomeMade
Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - Wersja do druku

+- HomeMade (http://sp-hm.pl)
+-- Dział: Urządzenia nadawczo odbiorcze KF (/forum-62.html)
+--- Dział: Syntezy częstotliwości i moduły DSP (/forum-74.html)
+--- Wątek: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO (/thread-2164.html)

Strony: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ9MDD - 11-10-2014 22:49

Hmmm.... tak sobie pomyślałem że pewnie brakuje Ci jeszcze biblioteki "rotary encoder".

Bo jeśli je ręcznie załadowałeś to innej przyczyny być nie może.
Biblioteka w załączeniu.


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ6IYY - 12-10-2014 10:09

biblioteka lcd nokie weryfikacja ok
na LCD5110 Basic i Graph nie udało się weryfikować


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ9MDD - 12-10-2014 11:06

Faktycznie masz rację Michał, mój błąd, użyłem tam innej biblioteki do LCD.
Z tą którą dałeś będzie to działać.
To teraz czekamy czy zadziała jeśli tak to możemy coś tam dalej dopisywać.


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - DA_KAR - 12-10-2014 11:46

(11-10-2014 11:34)SQ9MDD napisał(a):  "Heniek" chyba gdzieś w akcji zaginął nam.
...
Przepraszam że się tak wpycham z tym ale może koledzy mają ochotę podłubać. Jeśli ktoś ma arduino to może już testować, a kto wie może obok Heńka jakiś Złomek powstanie...

Ale się cieszę. Po cichu liczyłem że ktoś "kumaty" w ARDUINO
nie wytrzyma i temat pociągnie. Pomysł jest świetny i szkoda by
gdzieś nam zaginął. Jam prosty mechanik, potrafię gotowy kod
przejrzeć i czasami coś zmodyfikować ale nie napisać od zera.
Zaczynam gromadzić klocki. Big Grin


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP6AUO - 12-10-2014 14:34

Witam Wszystkich.
Weryfikacja zakończona sukcesem.
Mogę przystąpić do konstruowania schematu i montażu detali.
W załączeniu widok po weryfikacji.

[attachment=9070]


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ9MDD - 12-10-2014 14:52

No i super widzę że nawet jest zainteresowanie wspólnym pisaniem synezera.
No to postanowiłem że nieco wyprostuję ten kod.
I tak:
- zmieniłem jednak bibliotekę do obsługi LCD gdyż pojawiały się problemy z kontrastem wyświetlacza przy poprzedniej.
- przeniosłem wyświetlanie częstotliwości do osobnej funkcji tak by można było z jednego miejsca kontrolować sposób wyświetlania częstotliwości.

[attachment=9072]

Następne co zrobić trzeba koniecznie to wprowadzenie pośredniej, i obsługę zmiany kroku syntezera.

Odpalajcie sprzęty jak będzie działać to piszemy dalej.

Kod:
//**************************************************​**********************//
// Złomek - kumpel Heńka, projekt pogladowy obsługi DDS AD9850,
// wyświetlacza nokii 5110 i jakiegoś enkodera.
// Projekt otwarty http://sp-hm.pl
// SQ9MDD -  początkowy szkielet programu v 1.0.0
// S_____ -
// S_____ -
//
//**************************************************​**********************//
/* CHANGELOG (nowe na górze)
2014.10.12 - początek projektu wspólnego na sp-hm.pl
wymiana biblioteki wyświetlacza lcd na LCDD5110 basic
2014.05.22 - pierwsza wersja kodu warsztaty arduino w komorowie.  
*/
//**************************************************​**********************//
//podłączamy bibliotekę syntezera
#include <AH_AD9850.h>

//podłączamy bibliotekę enkodera
#include <RotaryEncoder.h>;

//podłączamy bibliotekę do obsługi wyświetlacza
#include <LCD5110_Basic.h>

//inicjalizujemy komunikację z syntezerem
//syntezer   - arduino
//CLK        - PIN 8
//FQUP       - PIN 9
//BitData    - PIN 10
//RESET      - PIN 11
AH_AD9850 AD9850(8, 9, 10, 11);

// inicjalizujemy wyświetlacz
// lcd    - arduino
// sclk   - PIN 7
// sdin   - PIN 6
// dc     - PIN 5
// reset  - PIN 3
// sce    - PIN 4
LCD5110 lcd(7,6,5,3,4);
extern uint8_t SmallFont[]; //czcionka z biblioteki
extern uint8_t MediumNumbers[];//czcionka z biblioteki

//inicjalizujemy enkoder
//AO - w lewo
//A1 - w prawo
//nalezy pamiętać o kondensatorach (100nF) pomiędzy liniami encodera a masą
RotaryEncoder encoder(A0,A1,5,6,1000);

//kontrast wyświetlacza
const int kontrast = 70;

//zmienna pomocnicza do wyrzucania danych na lcd
char buffor[] = "              ";

//zmienna dla częstotliwości, wstawiamy tam częstotliwość od której startujemy
long czestotliwosc = 3710000;

//zmienna pomocnicza do liczenia impulsów z enkodera
int enc_sum = 0;

//funkcja do obsługi wyświetlania zmiany częstotliwości
void show_frequency(){
  lcd.setFont(SmallFont);                    //ustawiamy czcionkę
  sprintf(buffor,"%lu",czestotliwosc);       //konwersja danych do wyświetlenia (ładujemy longa do stringa
  lcd.print(buffor,CENTER,0);                //wyświetlamy dane na lcd
}

// setup funkcja odpalana przy starcie
void setup(){
  //odpalamy syntezer i ustawiamy częstotliwość startową
  AD9850.set_frequency(0,0,czestotliwosc);    //set power=UP, phase=0, 1MHz frequency
  delay(1000);                                //sekunda opóźnienia
  lcd.InitLCD(kontrast);                      //odpalamy lcd ustawiamy kontrast
  show_frequency();                           //pokazmy cos na lcd
}

void loop(){
  //czytamy wartość z encodera
  int enc = encoder.readEncoder();
  if(enc != 0) {                          //jeśli wartość jest inna niż zero sumujemy
    enc_sum = enc_sum + enc;              //jeden ząbek encodera to +2 lub -2 tutaj to zliczam
  }
  //jesli zaliczyliśmy ząbek dodajemy lub odejmujemy do częstotliwości wartość kroku (na razie na sztywno 100Hz)
  if(enc_sum >= 2){
    czestotliwosc = czestotliwosc + 100;  //docelowo czestotliwosc = czestotliwosc + krok

    AD9850.set_frequency(czestotliwosc);  //ustawiam syntezę na odpowiedniej częstotliwości
    show_frequency();                     //drukuję częstotliwość na wyświetlaczu za pomocą gotowej funkcji
    enc_sum = 0;                          //reset zmiennej zliczającej impulsy enkodera
  }
  if(enc_sum <= -2){
    czestotliwosc = czestotliwosc - 100;  //docelowo czestotliwosc = czestotliwosc - krok      
    AD9850.set_frequency(czestotliwosc);  //ustawiam syntezę na odpowiedniej częstotliwości
    show_frequency();                     //drukuję częstotliwość na wyświetlaczu za pomocą gotowej funkcji      
    enc_sum = 0;                          //reset zmiennej zliczającej impulsy enkodera
  }  
  delayMicroseconds(5);                    //małe opóźnienie dla prawidłowego działania enkodera
}

A tak działa:





RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP6IFN - 12-10-2014 17:28

U mnie przestraja co 200Hz, na LCD i w rzeczywistości. Pomiar na liczniku częstotliwości. Enkoder jest mechaniczny za 2,40zł (czy coś takiego).
Rysio!
PS. U mnie jeden ząbek enkodera to cyfra 4. Należy tą wartość zmienic w programie na 4, co też uczyniłem. Teraz jest OK!


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ9MDD - 12-10-2014 17:35

Ha, to pewnie inaczej działający enkoder. Zrób Ryśku taki test, w funkcji setup włącz port szeregowy:

Kod:
Serial.begin(9600);

A następnie podczas odczytywania enkodera wyświetl ile masz impulsów na ząbek:

Kod:
if(enc != 0) {                          //jeśli wartość jest inna niż zero sumujemy
    enc_sum = enc_sum + enc;              //jeden ząbek encodera to +2 lub -2 tutaj to zliczam
    Serial.println(enc); //<---- to dorzucamy
  }

Pewnie u Ciebie jest inaczej niż w tym moim i dlatego skacze po 200Hz
I teraz w zasadzie możemy albo zmienić krok albo inaczej zliczać impulsy.

Właściwa zmiana powinna się odbywać tutaj:

Kod:
if(enc_sum >= 2){

i tutaj:

Kod:
if(enc_sum <= -2){

Zamieniamy dwójkę na wartość jaką masz na ząbek. W sumie najlepiej to wystawić jako zmienną do konfiguracji.

Z ciekawości zapytam co to za enkoder?


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP6AUO - 12-10-2014 17:38

Ryszard, jaki to jest model arduino.
Jaki tam jest prosesor i jaki kwarc.
Żeby nie odstawać dokupię taki model jak na fotce (ja mam Arduino UNO)


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP6IFN - 12-10-2014 17:55

Tu go kupiłem: http://electropark.pl/szukaj?orderby=position&orderway=desc&search_query=enkoder&submit_search=Szukaj 24kroki/obrót, cena jest już trochę wyższa.
Zmieniłem krok liczenia, napisałem wcześniej PS do info poprzedniego.
Rysio!
PS. Andrzeju!
Nie masz co kombinować, każde Arduino jest tu dobre do ćwiczeń. Ja mam DUEMILANOWE. Każde Arduino chodzi na kwarcu 16MHz, u mnie siedzi ATmega 328P.
PS2. Faktycznie, ładnie czyta na porcie szeregowym, dostaję 4 jedynki....ale jak wcześniej już napisałem, poprawiłem w programie cyfrę 2 na 4, jest OK!