John La Rooy có một giải pháp tốt nhưng mạch có thể phức tạp hơn một số người muốn. Điều này mô tả một giải pháp tương tự được thiết kế bởi Tom Herbison chỉ sử dụng AD9850, mặc dù nó sử dụng 4 chân tín hiệu GPIO thay vì 2 như giải pháp của John.
Tom kết nối với GPIO như thế này:
Chú ý anh ta chạy AD9850 trên 3.3V thay vì 5V. Theo thảo luận này , AD9850 được đánh giá là chạy ở mức 3,3V hoặc 5V, nhưng một số bo mạch có thể sử dụng các thành phần không thể xử lý 5V lâu, vì vậy chạy ở 3.3V thực sự có thể là một giải pháp tốt hơn, tùy thuộc vào hương vị của bảng AD9850 .
Bảng AD9850 cụ thể của tôi có hầu hết các nhãn pin chỉ bên dưới bảng, vì vậy tôi đã chụp ảnh mặt dưới trước khi ấn nó xuống bảng tạo mẫu. Các vị trí pin cuối cùng giống hệt với vị trí trên bảng của Tom. Trên bảng của tôi, FQ
được dán nhãn FU_UQ
, CLK
là W_CLK
, và RST
là RESET
.
Tom cung cấp tập lệnh Python 3 này để điều khiển trình tạo hàm. Đây là bản sao của v1.0 trong trường hợp liên kết tải xuống bị hỏng:
# 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()
Vì bất kỳ việc sử dụng chân GPIO nào trên pi đều yêu cầu chạy bằng root, Tom mô tả hai phương pháp khởi chạy mã python của mình với quyền root. Phương pháp đầu tiên của anh ta là sửa đổi biểu tượng máy tính để bàn Python IDE để luôn chạy bằng root, nhưng điều đó gây cho tôi là không an toàn - bạn không muốn chạy tất cả các chương trình GUI python như root nếu bạn không phải. Phương pháp thứ hai là chạy sudo idle3_
từ dấu nhắc lệnh để khởi chạy Môi trường phát triển tích hợp Python 3 với các đặc quyền gốc bất cứ khi nào nó cần đặc quyền gốc.
Tom không đề cập đến việc cài đặt thư viện RPi.GPIO python 3 vì vậy nó có thể đã có sẵn trên một số phiên bản Pi OS, nhưng nó không có sẵn trên phiên bản Occidentalis v0.2 mà tôi đang sử dụng nên tôi đã chạy sudo apt-get install python3-rpi.gpio
. Lưu ý rằng Python 3 sử dụng một vị trí khác cho RPi.GPIO vì vậy sudo apt-get install python-rpi.gpio
sẽ chỉ làm cho thư viện có thể truy cập vào Python 2.
Khi IDE Python 3 được mở với quyền root, hãy mở tệp rpi_rfsiggen.py
, sau đó chọn Run -> Run Module
từ menu hoặc nhấn F5.
Tôi đã có thể có được sóng hình sin 18kHZ ổn định ở mức 1Vpp từ pin đầu ra SinB (được dán nhãn ZOUT2
trên bảng của tôi) trong lần thử đầu tiên.