John La Rooy มีวิธีแก้ปัญหาที่ดี แต่วงจรอาจซับซ้อนกว่าบางอย่างที่ต้องการ สิ่งนี้อธิบายถึงวิธีการแก้ปัญหาที่คล้ายกันซึ่งออกแบบโดย Tom Herbison โดยใช้เพียง AD9850 ถึงแม้ว่ามันจะใช้พินสัญญาณ GPIO 4 ขาแทน 2 เหมือนโซลูชันของ John
ทอมเชื่อมต่อกับ GPIO ดังนี้:
สังเกตว่าเขาใช้ AD9850 บน 3.3V แทนที่จะเป็น 5V จากการสนทนานี้ AD9850 นั้นได้รับการจัดอันดับให้ทำงานที่ 3.3V หรือ 5V แต่บางบอร์ดอาจใช้ส่วนประกอบที่ไม่สามารถจัดการ 5V ได้นานดังนั้นการทำงานที่ 3.3V อาจเป็นวิธีแก้ปัญหาที่ดีกว่าขึ้นอยู่กับรสชาติของบอร์ด AD9850 .
บอร์ดAD9850 ของฉันโดยเฉพาะมีป้ายชื่อพินส่วนใหญ่อยู่ใต้บอร์ดเท่านั้นดังนั้นฉันจึงถ่ายภาพด้านล่างก่อนที่จะกดลงในบอร์ดต้นแบบ ตำแหน่งพินสิ้นสุดลงเหมือนกับตำแหน่งบนกระดานของทอมอยู่แล้ว บนกระดานของฉันFQ
จะมีป้ายFU_UQ
, CLK
เป็นW_CLK
และเป็นRST
RESET
Tom ให้สคริปต์ 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 ใด ๆ ต้องใช้เป็นรูททอมจึงอธิบายสองวิธีในการเรียกใช้โค้ดไพ ธ อนด้วยสิทธิ์พิเศษรูท วิธีแรกของเขาคือการปรับเปลี่ยนไอคอนเดสก์ท็อป Python IDE ให้ทำงานเหมือนรูทเสมอ แต่นั่นทำให้ฉันไม่ปลอดภัย - คุณไม่ต้องการรันโปรแกรม python GUI ทั้งหมดในฐานะรูทหากคุณไม่จำเป็นต้องทำ วิธีที่สองคือการเรียกใช้sudo idle3_
จากพรอมต์คำสั่งเพื่อเปิดใช้งาน Python 3 Integrated Development Environment ที่มีสิทธิ์ใช้งานรูททุกครั้งที่ต้องการสิทธิ์ใช้งานรูท
ทอมไม่ได้พูดถึงการติดตั้ง RPi.GPIO หลาม 3 ห้องสมุดดังนั้นจึงอาจจะมีอยู่ในบางรุ่นพี่ OS แต่มันก็ไม่ได้มีอยู่ใน Occidentalis v0.2 sudo apt-get install python3-rpi.gpio
ผมใช้ดังนั้นฉันวิ่ง โปรดทราบว่า Python 3 ใช้ตำแหน่งอื่นสำหรับ RPi.GPIO ดังนั้นsudo apt-get install python-rpi.gpio
จะทำให้ไลบรารีสามารถเข้าถึง Python 2 เท่านั้น
เมื่อ Python 3 IDE เปิดพร้อมกับสิทธิ์ของรูทให้เปิดไฟล์rpi_rfsiggen.py
จากนั้นเลือกRun -> Run Module
จากเมนูหรือกด F5
ฉันสามารถรับคลื่นไซน์ขนาด 18kHZ ที่เสถียรที่ 1Vpp จากขาออก SinB (ติดป้ายZOUT2
บนบอร์ด) ในการทดลองครั้งแรกของฉัน