John La Rooy memiliki solusi yang baik tetapi sirkuit mungkin lebih rumit daripada yang diinginkan beberapa orang. Ini menggambarkan solusi serupa yang dirancang oleh Tom Herbison hanya menggunakan AD9850, meskipun menggunakan 4 pin sinyal GPIO bukannya 2 seperti solusi John.
Tom terhubung ke GPIO seperti ini:
Perhatikan dia menjalankan AD9850 pada 3.3V, bukannya 5V. Menurut diskusi ini , AD9850 dinilai berjalan pada 3.3V atau 5V, tetapi beberapa papan mungkin menggunakan komponen yang tidak dapat menangani 5V lama, jadi menjalankan pada 3.3V sebenarnya bisa menjadi solusi yang lebih baik, tergantung pada selera Anda pada papan AD9850 .
Papan AD9850 khusus saya memiliki sebagian besar label pin hanya di bawah papan, jadi saya mengambil gambar bagian bawah sebelum menekannya ke papan prototyping. Lokasi pin akhirnya identik dengan yang ada di papan Tom. Di papan tulis saya, FQ
diberi label FU_UQ
, CLK
adalah W_CLK
, dan RST
sedang RESET
.
Tom menyediakan skrip Python 3 ini untuk mengontrol fungsi generator. Berikut adalah salinan v1.0 jika tautan unduhan terputus:
# RPi RF Signal Generator v1.0
# Copyright (C) 2013 Tom Herbison MI0IOU
# Email (hidden to discourage spammers - see original rpi_rfsiggen.py file)
# Web <http://www.asliceofraspberrypi.co.uk>
# 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 3 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, see <http://www.gnu.org/licenses/>.
# import GUI module
from tkinter import *
# import GPIO module
import RPi.GPIO as GPIO
# setup GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# Define GPIO pins
W_CLK = 15
FQ_UD = 16
DATA = 18
RESET = 22
# setup IO bits
GPIO.setup(W_CLK, GPIO.OUT)
GPIO.setup(FQ_UD, GPIO.OUT)
GPIO.setup(DATA, GPIO.OUT)
GPIO.setup(RESET, GPIO.OUT)
# initialize everything to zero
GPIO.output(W_CLK, False)
GPIO.output(FQ_UD, False)
GPIO.output(DATA, False)
GPIO.output(RESET, False)
# Function to send a pulse to GPIO pin
def pulseHigh(pin):
GPIO.output(pin, True)
GPIO.output(pin, True)
GPIO.output(pin, False)
return
# Function to send a byte to AD9850 module
def tfr_byte(data):
for i in range (0,8):
GPIO.output(DATA, data & 0x01)
pulseHigh(W_CLK)
data=data>>1
return
# Function to send frequency (assumes 125MHz xtal) to AD9850 module
def sendFrequency(frequency):
freq=int(frequency*4294967296/125000000)
for b in range (0,4):
tfr_byte(freq & 0xFF)
freq=freq>>8
tfr_byte(0x00)
pulseHigh(FQ_UD)
return
# Class definition for RPiRFSigGen application
class RPiRFSigGen:
# Build Graphical User Interface
def __init__(self, master):
frame = Frame(master, bd=10)
frame.pack(fill=BOTH,expand=1)
# set output frequency
frequencylabel = Label(frame, text='Frequency (Hz)', pady=10)
frequencylabel.grid(row=0, column=0)
self.frequency = StringVar()
frequencyentry = Entry(frame, textvariable=self.frequency, width=10)
frequencyentry.grid(row=0, column=1)
# Start button
startbutton = Button(frame, text='Start', command=self.start)
startbutton.grid(row=1, column=0)
# Stop button
stopbutton = Button(frame, text='Stop', command=self.stop)
stopbutton.grid(row=1, column=1)
# start the DDS module
def start(self):
frequency = int(self.frequency.get())
pulseHigh(RESET)
pulseHigh(W_CLK)
pulseHigh(FQ_UD)
sendFrequency(frequency)
# stop the DDS module
def stop(self):
pulseHigh(RESET)
# Assign TK to root
root = Tk()
# Set main window title
root.wm_title('RPi RFSigGen')
# Create instance of class RPiRFSigGen
app = RPiRFSigGen(root)
# Start main loop and wait for input from GUI
root.mainloop()
Karena setiap penggunaan pin GPIO pada pi membutuhkan berjalan sebagai root, Tom menjelaskan dua metode meluncurkan kode python-nya dengan hak akses root. Metode pertamanya adalah memodifikasi ikon desktop IDE Python agar selalu berjalan sebagai root, tetapi menurut saya itu tidak aman - Anda tidak ingin menjalankan semua program GUI python sebagai root jika Anda tidak perlu. Metode kedua adalah menjalankan sudo idle3_
dari prompt perintah untuk meluncurkan Lingkungan Pengembangan Terpadu Python 3 dengan hak akses root setiap kali diperlukan hak akses root.
Tom tidak menyebutkan menginstal pustaka RPi.GPIO python 3 sehingga mungkin sudah tersedia pada beberapa versi Pi OS, tapi itu tidak tersedia pada Occidentalis v0.2 yang saya gunakan jadi saya berlari sudo apt-get install python3-rpi.gpio
. Perhatikan bahwa Python 3 menggunakan lokasi berbeda untuk RPi.GPIO sehingga sudo apt-get install python-rpi.gpio
hanya akan membuat perpustakaan dapat diakses oleh Python 2.
Setelah Python 3 IDE terbuka dengan hak akses root, buka file rpi_rfsiggen.py
, lalu pilih Run -> Run Module
dari menu atau tekan F5.
Saya bisa mendapatkan gelombang sinus 18kHZ stabil yang bagus pada 1Vpp dari pin output SinB (diberi label ZOUT2
di papan saya) pada percobaan pertama saya.