John La Rooy tiene una buena solución, pero el circuito puede ser más complicado de lo que algunos preferirían. Esto describe una solución similar diseñada por Tom Herbison usando solo el AD9850, aunque usa 4 pines de señal GPIO en lugar de 2 como la solución de John.
Tom se conecta a GPIO así:
Observe que ejecuta el AD9850 en 3.3V en lugar de 5V. Según esta discusión , el AD9850 está calificado para funcionar a 3.3V o 5V, pero algunas placas pueden usar componentes que no pueden manejar 5V por mucho tiempo, por lo que ejecutar a 3.3V puede ser una mejor solución, dependiendo de su sabor de placa AD9850 .
Mi placa AD9850 en particular tenía la mayoría de las etiquetas de clavijas solo debajo de la placa, así que tomé una foto de la parte inferior antes de presionarla en una placa de prototipos. Las ubicaciones de los pin terminaron siendo idénticas a las del tablero de Tom de todos modos. En mi pizarra, FQ
está etiquetado FU_UQ
, CLK
es W_CLK
y RST
es RESET
.
Tom proporciona este script Python 3 para controlar el generador de funciones. Aquí hay una copia de v1.0 en caso de que el enlace de descarga se rompa:
# 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()
Dado que cualquier uso de los pines GPIO en el pi requiere ejecutarse como root, Tom describe dos métodos para lanzar su código python con privilegios de root. Su primer método es modificar el ícono de escritorio IDE de Python para que siempre se ejecute como root, pero eso me parece inseguro: no es necesario ejecutar todos los programas de la GUI de Python como root si no es necesario. El segundo método es ejecutar sudo idle3_
desde un símbolo del sistema para iniciar el entorno de desarrollo integrado de Python 3 con privilegios de root siempre que necesite privilegios de root.
Tom no menciona la instalación de la biblioteca RPi.GPIO python 3, por lo que puede que ya esté disponible en algunas versiones de Pi OS, pero no estaba disponible en el Occidentalis v0.2 que estaba usando, así que corrí sudo apt-get install python3-rpi.gpio
. Tenga en cuenta que Python 3 usa una ubicación diferente para RPi.GPIO, por sudo apt-get install python-rpi.gpio
lo que solo hará que la biblioteca sea accesible para Python 2.
Una vez que el IDE de Python 3 esté abierto con privilegios de root, abra el archivo rpi_rfsiggen.py
, luego elija Run -> Run Module
del menú o presione F5.
Pude obtener una buena onda sinusoidal estable de 18kHZ a 1Vpp desde el pin de salida SinB (etiquetado ZOUT2
en mi placa) en mi primer intento.