John La Rooy ha una buona soluzione ma il circuito potrebbe essere più complicato di quanto alcuni preferirebbero. Questo descrive una soluzione simile progettata da Tom Herbison usando solo l'AD9850, sebbene utilizzi 4 pin di segnale GPIO anziché 2 come la soluzione di John.
Tom si collega a GPIO in questo modo:
Si noti che esegue AD9850 su 3,3 V invece che su 5 V. Secondo questa discussione , l'AD9850 è valutato per funzionare a 3,3 V o 5 V, ma alcune schede potrebbero utilizzare componenti non in grado di gestire a lungo 5 V, quindi funzionare a 3,3 V potrebbe effettivamente essere una soluzione migliore, a seconda del sapore della scheda AD9850 .
La mia particolare scheda AD9850 aveva la maggior parte delle etichette dei pin solo sotto la scheda, quindi ho fatto una foto della parte inferiore prima di premerla in una scheda di prototipazione. Le posizioni dei pin finirono per essere identiche a quelle sulla scheda di Tom comunque. Sulla mia lavagna, FQ
è etichettato FU_UQ
, CLK
è W_CLK
ed RST
è RESET
.
Tom fornisce questo script Python 3 per il controllo del generatore di funzioni. Ecco una copia di v1.0 nel caso in cui il collegamento per il download si interrompa mai:
# 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()
Poiché qualsiasi utilizzo dei pin GPIO sul pi richiede l'esecuzione come root, Tom descrive due metodi per avviare il suo codice Python con i privilegi di root. Il suo primo metodo è quello di modificare l'icona del desktop IDE di Python in modo che venga sempre eseguita come root, ma ciò mi sembra non sicuro: non è necessario eseguire tutti i programmi della GUI di Python come root se non è necessario. Il secondo metodo consiste nell'eseguire sudo idle3_
da un prompt dei comandi per avviare Python 3 Integrated Development Environment con i privilegi di root ogni volta che necessita di privilegi di root.
Tom non menziona l'installazione della libreria RPi.GPIO python 3, quindi potrebbe essere già disponibile su alcune versioni di Pi OS, ma non era disponibile su Occidentalis v0.2 che stavo usando, quindi ho corso sudo apt-get install python3-rpi.gpio
. Nota che Python 3 utilizza una posizione diversa per RPi.GPIO, quindi sudo apt-get install python-rpi.gpio
renderà la libreria accessibile solo a Python 2.
Quando l'IDE di Python 3 è aperto con i privilegi di root, apri il file rpi_rfsiggen.py
, quindi scegli Run -> Run Module
dal menu o premi F5.
Sono stato in grado di ottenere una bella onda sinusoidale 18kHZ stabile a 1Vpp dal pin di uscita SinB (etichettato ZOUT2
sulla mia scheda) al mio primo tentativo.