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 - SP9MRN - 19-11-2014 1:19

nie nerwowo :-)
Prolific ma tak samo, pewnie ktoś ten numer powtórzy. To dotyczy chińskich podróbek - a większość naszych "nano" jest z chin...
postaram się sprawdzić, czy zamiana PID na F460 faktycznie zabezpiecza przed zmianą PIDa na 0000 - bo może to jest jakaś metoda profilaktyczna.
"Another solution: Simply change the PID of the device to F460 and you will get a 2.8.28 driver from the Windows Update. Hopefully this vendor / manufacturer won’t be forced by FTDI to update to a new driver anywhere soon…"

Tylko muszę znaleźć "zarażoną" maszynę. Za szybko wyleczyłem :-)

MAc


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ9MDD - 19-11-2014 2:51

OK Panowie kończę na dzisiaj bo rano do pracy....
A więc tak:

Zmiany dotyczyły wprowadzenia obsługi VFO A i B.
Dodałem dwie zmienne dla przechowywania częstotliwości VFO A i VFO B do tych komórek chowam częstotliwość podczas zmiany bieżącego VFO.

Kod:
//funkcja do obsługi zmiany VFO
void change_vfo(){
  myGLCD.setFont(TinyFont);                    //mała czcionka
  switch(vfo_state){                           //sprawdzam jakie VFO zostało wybrane
     case 0:                                   //jeśli A to:
      myGLCD.print("V/A", 56,2);               //sygnalizuję które VFO pracuje
      frequency_vfo_b = frequency;             //zawartość częstotliwość odkładam do pamięci VFO B
      frequency = frequency_vfo_a;             //wczytuję zawartość częstotliwości z pamięci VFO A
     break;
     case 1:
      myGLCD.print("V/B", 56,2);               //sygnalizuję które VFO pracuje
      frequency_vfo_a = frequency;             //zawartość częstotliwość odkładam do pamięci VFO A
      frequency = frequency_vfo_b;             //wczytuję zawartość częstotliwości z pamięci VFO B
     break;
  }
  set_frequency(0);                            //ustawiam częstotliwość dla syntezera
  show_frequency();                            //pokazuję częstotliwość na LCD
  delay(200);                                  //male opóźnienie
}

Rozszerzyłem funkcję obsługującą drabinkę rezystorową i już mamy obsługę dwóch VFO.

Kod:
//obsługa przycisków
  if(analogRead(buttons_input) < 1000){        //jeśli cokolwiek jest wciśnięte to sprawdźmy co to
    delay(10);                                 //male opoźnienie by się ustabilizował stan
    int adc_value = analogRead(buttons_input);
    Serial.println(adc_value);                 //w tym miejscu sprawdzisz jaka wartość ma wcisnięty klawisz patrz port RS232 debugowanie
      if(adc_value < 10){                      //pierwszy przycisk
       step_button_pressed = true;
      }
      if(adc_value > 10 && adc_value < 120){   //drugi przycisk
        rit_button_pressed = true;
      }
      if(adc_value > 120 && adc_value < 220){  //trzeci przycisk
        dim_button_pressed = true;
      }
      if(adc_value > 220 && adc_value < 320){  //trzeci przycisk
        vfo_button_pressed = true;
      }      
  }else{                                       //w każdym innym przypadku resetujemy flagi przycisków
      step_button_pressed = false;             //reset przycisku step
      rit_button_pressed = false;              //przycisk rita
      dim_button_pressed = false;              //przycisk przyciemniania LCD
      vfo_button_pressed = false;              //przycisk zmiany VFO
  }

Kod po kilku testach bo już mi się dzisiaj nie chce siedzieć. Póki co wydaje się że wszystko jest ok. Jutro popołudniu wykonam resztę testów.

Poniżej oczywiście cały kod.


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

Rozmawiałem dzisiaj z Ryśkiem SP6IFN i zwrócił moją uwagę na pewien problem.
Otóż nasza synteza jest przystosowana do s-metra (pamiętajmy że to tylko wskaźnik) który pracuje z napięciem wyjściowym od 0V - 5V. Jest to oczywiście dość dużo, wiekszość konstrukcji pracuje na niższych napięciach.
Wobec tego przebudowałem program w taki sposób by można było zmienić ten zakres na 0V - 1.1V.
Zmiana ta realizowana jest za pomocą funkcji analogReference().
Minusem tego rozwiązania jest to ze nasza drabinka do obsługi przycisków też musi być przeprogramowana, bo zmiana napięcia referencyjnego dotyczy wszystkich wejść analogowych i przestała by działać.

A zatem:

W sekcji konfiguracyjnej mamy zmienną do wyboru napięcia odniesienia:
Kod:
const int bod_lvl = 0;                                //konfiguracja napięcia odniesienia 0 - 5V, 1 - 1.1V

Podczas startu procesora w funkcji setup ustawiamy odpowiednie napięcie:

Kod:
if(bod_lvl == 1){                             //tutaj przy starcie ustawiam właściwe napięcie odniesienia
    analogReference(INTERNAL);                  //dla ATmega168 i ATmega328, INTERNAL = 1.1V w arduino mega wpisujemy INTERNAL1V1
  }

No i na koniec fragment kodu w którym reagujemy na dane z przetwornika, czyli jak teraz wygląda nasza funkcja obsługująca przyciski, już po zmianach:

Kod:
else if(adc_value > 10 && adc_value < 120 && bod_lvl == 0){   //drugi przycisk napiecie odniesienia 5V
        rit_button_pressed = true;
      }
      else if(adc_value > 120 && adc_value < 220 && bod_lvl == 0){  //trzeci przycisk napiecie odniesienia 5V
        dim_button_pressed = true;
      }
      else if(adc_value > 220 && adc_value < 320 && bod_lvl == 0){  //czwarty przycisk napiecie odniesienia 5V
        vfo_button_pressed = true;
      }
      else if(adc_value > 350 && adc_value < 500 && bod_lvl == 1){   //drugi przycisk napiecie odniesienia 1.1V
        rit_button_pressed = true;
      }
      else if(adc_value > 500 && adc_value < 800 && bod_lvl == 1){  //trzeci przycisk napiecie odniesienia 1.1V
        dim_button_pressed = true;
      }
      else if(adc_value > 800 && adc_value < 1000 && bod_lvl == 1){  //czwarty przycisk napiecie odniesienia 1.1V
        vfo_button_pressed = true;
      }

W chwili obecnej na atmedze 328 nasz program zajmuje: 17 012 bajtów z 30 720 bajtów, czyli własnie przekroczyliśmy połowę pamięci procesora.
No Panowie ciekaw jestem waszych postępów w pracach, ktoś poza Rysiem już napędza Złomkiem jakieś radio?


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - DA_KAR - 19-11-2014 23:01

(19-11-2014 17:11)SQ9MDD napisał(a):  No Panowie ciekaw jestem waszych postępów w pracach,
ktoś poza Rysiem już napędza Złomkiem jakieś radio?

Właściwie to nie ma się czym chwalić.
Mam na ukończeniu Kajmana i próbowałem
jak to działa. Złomek fajnie daje sobie radę.
W radiu muszę lekko podciągnąć filtr wejściowy
bo za wcześnie się kończy i zawęzić filtr kwarcowy
bo za szeroki ale dało się posłuchać(pobawić)
choć warunki nie najlepsze.
Pozdrawiam


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ4KKG - 19-11-2014 23:43

Witam.
Melduję, że kolejny Złomek został częściowo uruchomiony - muszę się zaopatrzyć tylko w jakiś normalny encoder - do tej pory używam modułu KY-040. Zmienia mi częstotliwość co drugi ząbek (łopatologicznie tłumacząc na ząbkach parzystych mam sygnał, na nieparzystych brak).
(19-11-2014 17:11)SQ9MDD napisał(a):  No Panowie ciekaw jestem waszych postępów w pracach, ktoś poza Rysiem już napędza Złomkiem jakieś radio?
Na chwilę obecną mam go podłączonego do odbiornika ZetaSDR - sprawdza się w 100% na paśmie 80 m.
Może to trochę śmieszne, ale od czegoś trzeba zacząćTongue

Pozdrawiam


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ6IYY - 20-11-2014 3:46

Witam po naciskaniu klawisza zmiany kroku podkreślenie kroku mi lata bez zaczymania
Cytat:int adc_value = analogRead(buttons_input);
Serial.println(adc_value); //w tym miejscu sprawdzisz jaka wartość ma wcisnięty klawisz patrz port RS232 debugowanie
jaka praktycznie wygląda sposób sprawdzania: terminal itp.. za kogoż kto to nigdy nie robił


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP3JDZ - 20-11-2014 9:14

(20-11-2014 3:46)SQ6IYY napisał(a):  Witam po naciskaniu klawisza zmiany kroku podkreślenie kroku mi lata bez zaczymania

Sprawdź, czy czasem nie masz podłączonego ostatniego/pierwszego rezystora z drabinki od przycisków do masy. Jeden koniec drabinki oporowej jest podłączony do VCC, drugi wisi w powietrzu (nie jest nogdzie podłączony).


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ6IYY - 20-11-2014 14:21

Cytat:Sprawdź, czy czasem nie masz podłączonego ostatniego/pierwszego rezystora z drabinki od przycisków do masy. Jeden koniec drabinki oporowej jest podłączony do VCC, drugi wisi w powietrzu (nie jest nogdzie podłączony).

tak wisi w powietrzu i nadal skacze


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

Michał podpowiedz jakie masz arduino i jakim napięciem zasilasz drabinkę. To pomoże zdiagnozować co się dzieje.

Jeśli nic nie pomyliłem to schemat połączen wygląda tak:

[attachment=9218]


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ6IYY - 21-11-2014 14:24

Arduino Uno zasilane z usb na drabinki 4.89V(mierzone)podane z przyłącza Arduino POWER 5V przycisk STEP na enkoderu