Джон Ла Рой має гарне рішення, але схема може бути складнішою, ніж дехто вважає за краще. Це описує подібне рішення, розроблене Томом Гербісоном, використовуючи лише AD9850, хоча воно використовує 4 сигнальних штифта GPIO замість 2 подібних рішень Джона.
Том підключається до GPIO так:
Зауважте, він працює на AD9850 на 3,3 В замість 5 В. Згідно з цією дискусією , AD9850 оцінюється на 3,3 В або 5 В, але деякі плати можуть використовувати компоненти, не здатні довго працювати з 5 В, тому робота на рівні 3,3 В може бути кращим рішенням, залежно від вашого смаку плати AD9850 .
Моя конкретна плата AD9850 мала більшість штифтових міток лише під дошкою, тому я сфотографував нижню сторону перед тим, як натиснути її на плату для складання прототипів. Місце розташування штифтів у будь-якому випадку було ідентичним тим, що знаходилися на дошці Тома. На моїй дошці FQ
розміщено маркування FU_UQ
, CLK
є W_CLK
і RST
є RESET
.
Том надає цей сценарій Python 3 для управління генератором функцій. Ось копія v1.0 у випадку, якщо посилання на завантаження колись порушиться:
# 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()
Оскільки будь-яке використання штифтів GPIO на pi вимагає запуску як root, Том описує два способи запуску свого пітонного коду з привілеями root. Його перший метод полягає в тому, щоб змінити піктограму на робочому столі Python IDE, щоб вона завжди працювала як root, але це вражає мене як небезпечне - ви не хочете запускати всі програми графічного інтерфейсу python як root, якщо цього не потрібно. Другий метод полягає у запуску sudo idle3_
з командного рядка для запуску інтегрованого середовища розробки Python 3 з привілеями root, коли йому потрібні привілеї root.
Том не згадує про встановлення бібліотеки RPi.GPIO python 3, тому вона вже може бути доступна в деяких версіях Pi OS, але вона не була доступна в Occidentalis v0.2, який я використовував, тому я запустив sudo apt-get install python3-rpi.gpio
. Зверніть увагу, що Python 3 використовує інше місце для RPi.GPIO, тому sudo apt-get install python-rpi.gpio
зробить доступною лише бібліотеку для Python 2.
Після відкриття програми IDE Python 3 з правами root, відкрийте файл rpi_rfsiggen.py
, а потім виберіть Run -> Run Module
із меню або натисніть F5.
Мені вдалося отримати гарну стабільну синусоїду в 18 кГц на 1 Впп з вихідного штиря SinB (позначено ZOUT2
на моїй дошці) під час моєї першої спроби.