John La Rooy tem uma boa solução, mas o circuito pode ser mais complicado do que alguns preferem. Isso descreve uma solução semelhante projetada por Tom Herbison usando apenas o AD9850, embora use 4 pinos de sinal GPIO em vez de 2 como a solução de John.
Tom se conecta ao GPIO assim:
Observe que ele roda o AD9850 em 3,3V em vez de 5V. De acordo com esta discussão , o AD9850 é classificado para funcionar em 3,3V ou 5V, mas algumas placas podem usar componentes que não suportam 5V por muito tempo, portanto, rodar em 3,3V pode realmente ser uma solução melhor, dependendo do seu sabor na placa AD9850 .
Minha placa AD9850 em particular tinha a maioria das etiquetas de pinos somente embaixo da placa, então tirei uma foto da parte de baixo antes de pressioná-la em uma placa de prototipagem. Os locais dos pinos acabaram sendo idênticos aos do quadro de Tom. No meu quadro, FQ
está rotulado FU_UQ
, CLK
é W_CLK
e RST
é RESET
.
Tom fornece esse script Python 3 para controlar o gerador de funções. Aqui está uma cópia da v1.0, caso o link de download seja interrompido:
# 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()
Como qualquer uso dos pinos GPIO no pi exige a execução como root, Tom descreve dois métodos para iniciar seu código python com privilégios de root. Seu primeiro método é modificar o ícone da área de trabalho do Python IDE para sempre ser executado como root, mas isso me parece inseguro - você não deseja executar todos os programas da GUI python como root, se não precisar. O segundo método é executar a sudo idle3_
partir de um prompt de comando para iniciar o Python 3 Integrated Development Environment com privilégios de root sempre que necessário.
Tom não menciona a instalação da biblioteca RPi.GPIO python 3, portanto ela já pode estar disponível em algumas versões do Pi OS, mas não estava disponível no Occidentalis v0.2 que eu estava usando, então eu executei sudo apt-get install python3-rpi.gpio
. Observe que o Python 3 usa um local diferente para o RPi.GPIO sudo apt-get install python-rpi.gpio
, tornando a biblioteca acessível apenas ao Python 2.
Quando o IDE do Python 3 for aberto com privilégios de root, abra o arquivo rpi_rfsiggen.py
e escolha Run -> Run Module
no menu ou pressione F5.
Consegui obter uma boa onda senoidal estável de 18kHZ a 1Vpp a partir do pino de saída SinB (rotulado ZOUT2
na minha placa) na minha primeira tentativa.