Kupiłem ostatnio moduł generatora AD9850 do testów . Aby nie wymyślać koło ponownie zacząłem szperać w sieci , no i znalazłem taki kod który byłem w stanie zrozumieć co autor modyfikacji miał na myśli .
Link do źródła KLIK.
Wyczyściłem wszystko co było zbędne , pozostawiając czysty kod do sterowania tym modułem .
Zmeniłem zakres kroku Hz , oraz zmodyfikowałem sposób wyświetlani częstotliwości na LCD .
Generator działa całkiem przyzwoicie w zakresie od 1MHz – 40 MHz z błędem +12Hz /1 MHz i rośnie do 78Hz przy 40 MHz . Od 1 MHz do 300 kHz +/- 1Hz , poniżej 200 kHz zaczyna podbijać częstotliwość do 400 Hz . Trudno mi powiedzieć czy moduł jest taki dup....ty , czy moja kalibracja mało dokładna .
Jeśli ma ktoś doświadczenie z tym modułem , chętnie przeczytam co mogę tu ulepszyć .
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- ' Sterownik Syntezera
- ' Copyright 2012 SQ9MDD <rlabus@luxmat.com>
- '
- ' This program is free software; you can redistribute it and/or modify
- ' it under the terms of the GNU General Public License as published by
- ' the Free Software Foundation; either version 2 of the License, or
- ' (at your option) any later version.
- '
- ' This program is distributed in the hope that it will be useful,
- ' but WITHOUT ANY WARRANTY; without even the implied warranty of
- ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ' GNU General Public License for more details.
- '
- ' You should have received a copy of the GNU General Public License
- ' along with this program; if not, write to the Free Software
- ' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- ' MA 02110-1301, USA.
- '
- '
- '-----------------------------------------------------------------
- $regfile = "M8def.dat"
- $crystal = 4000000
- $hwstack = 64
- $swstack = 10
- $framesize = 40
- Config Lcd = 16 * 2
- Config Lcdpin = Pin , Db4 = Pinc.3 , Db5 = Pinc.2 , Db6 = Pinc.1 , Db7 = Pinc.0 , E = Pinc.4 , Rs = Pinc.5
- Config Portb.0 = Input ' enkoder
- Config Portb.1 = Input ' enkoder
- Config Portb.2 = Input 'zmiana kroku
- Config Portb.3 = Output 'dds
- Config Portb.4 = Output 'dds
- Config Portb.5 = Output 'dds
- Portb.0 = 1 ' enkoder
- Portb.1 = 1 ' enkoder
- Portb.2 = 1 ' zmiana kroku
- Portb.3 = 1 'dds
- Portb.4 = 1 'dds
- Portb.5 = 1 'dds
- Dds_w_clk Alias Portb.5 'dds
- Dds_fq_ud Alias Portb.4 'dds
- Dds_data Alias Portb.3 'dds
- Dim Freq As Long
- dim il_znak as byte
- dim tekst1 as string * 9
- dim ftxt as string * 8
- Dim Enc As Byte
- Dim Krok As dword
- Dim Kierunek As Bit
- Dim Init As Byte
- Dim Freqtodds As Single
- Dim Freqtoddsready As Long
- Freq = 1000000
- Krok = 10000
- Declare Sub Wyslij_f_do_dds
- Cursor off
- Echo Off
- Set Dds_w_clk : Waitus 10 : Reset Dds_w_clk : Waitus 10
- Set Dds_fq_ud : Waitus 10 : Reset Dds_fq_ud : Waitus 10
- Init = &H00
- Wait 1
- Gosub Wyswietlacz
- '================== Petla glowna ===================================
- Do
- Debounce Pinb.2 , 0 , Zmianakroku , Sub
- Enc = Encoder(pinb.0 , Pinb.1 , Prawo , Lewo , 0)
- Loop
- End
- '================== Enkoder w lewo =====================
- Lewo:
- waitms 10
- If Kierunek = 1 Then
- Kierunek = 0
- Return
- End If
- If Enc = 2 Or Enc = 1 Then
- Freq = Freq - Krok
- End If
- If Freq < 1000 Then
- Freq = 40000000
- End If
- Gosub Freq_update
- Return
- '================== Enkoder w prawo =====================
- Prawo:
- waitms 10
- If Kierunek = 0 Then
- Kierunek = 1
- Return
- End If '
- If Enc = 3 Or Enc = 0 Then
- Freq = Freq + Krok
- End If
- If Freq > 40000000 Then
- Freq = 1000
- End If
- Gosub Freq_update
- Return
- '================== Zmiena kroku ==========================
- Zmianakroku:
- waitms 600
- If Krok = 1000000 Then
- Krok = 100000
- Elseif Krok = 100000 Then
- Krok = 10000
- Elseif Krok = 10000 Then
- Krok = 1000
- Elseif Krok = 1000 Then
- Krok = 100
- Elseif Krok = 100 Then
- Krok = 10
- Elseif Krok = 10 Then
- Krok = 1
- Elseif Krok = 1 Then
- Krok = 1000000
- End If
- Gosub Wyswietlacz
- Return
- '============= Wyswietlanie czestotliwosci ================================
- Freq_update:
- tekst1 = " 00000000"
- ftxt = str(freq)
- il_znak = len(ftxt)
- if il_znak = 1 then
- mid(tekst1 , 9 , il_znak) = ftxt
- elseif il_znak = 2 then
- mid(tekst1 , 8 , il_znak) = ftxt
- elseif il_znak = 3 then
- mid(tekst1 , 7 , il_znak) = ftxt
- elseif il_znak = 4 then
- mid(tekst1 , 6 , il_znak) = ftxt
- elseif il_znak = 5 then
- mid(tekst1 , 5 , il_znak) = ftxt
- elseif il_znak = 6 then
- mid(tekst1 , 4 , il_znak) = ftxt
- elseif il_znak = 7 then
- mid(tekst1 , 3 , il_znak) = ftxt
- elseif il_znak = 8 then
- mid(tekst1 , 2 , il_znak) = ftxt
- end if
- Locate 1 , 1
- Lcd mid(tekst1 , 1 , 3)
- Lcd "."
- Lcd Mid(tekst1 , 4 , 3)
- Lcd "."
- Lcd mid(tekst1 , 7 , 3)
- lcd " Hz "
- Call Wyslij_f_do_dds
- Return
- '================= Wyswietlanie kroku czestotliwosci ============================
- Wyswietlacz:
- Gosub Freq_update
- Locate 2 , 2 : lcd "Krok "
- If Krok = 1 Then
- Lcd " 1 Hz" '1 hz
- Elseif Krok = 10 Then
- Lcd " 10 Hz" '10 hz
- Elseif Krok = 100 Then
- Lcd "100 Hz" '100 hz
- Elseif Krok = 1000 Then
- Lcd " 1 kHz" '1 khz
- Elseif Krok = 10000 Then
- Lcd "10 kHz" '10 khz
- Elseif Krok = 100000 Then
- Lcd "100kHz" '100 khZ
- Elseif Krok = 1000000 Then
- Lcd " 1 MHz" '1 MHz
- End If
- '============== Wysylanie danych do DDS 9850 ================================
- Return
- Sub Wyslij_f_do_dds
- Freqtodds = Freq * 34.3598 ' 34.3598 kalibracja czestotliwosci
- Freqtoddsready = Freqtodds
- Shiftout Dds_data , Dds_w_clk , Freqtoddsready , 3 , 32 , 10
- Shiftout Dds_data , Dds_w_clk , Init , 3 , 8 , 10
- Set Dds_fq_ud : Waitus 10 : Reset Dds_fq_ud : Waitus 10
- End Sub