답변:
다음은 AD9850 모듈을 연결 한 방법과 주파수를 1000Hz로 설정하는 방법을 보여주는 간단한 Python 프로그램입니다.
AD9850은 125MHz 크리스털과 올바르게 작동하기 위해 5V에서 작동해야합니다. 것입니다 아마 그들은 단지 입력이 때문에 모듈에 직접 4 GPIO 핀 와이어 확인 할 수 있지만 통해 연결 MCP23017은 효율적으로 다른에 모듈을 회전 I²C 주변 및 확인 RPI 입력이 안전합니다.
+ 5V에
대한 중요 정보 GPIO의 + 5V 핀은 실제로 AD9850에 전력을 공급하기에 충분한 전류를 공급할 수 없습니다. 외부 5V 전원을 사용해야합니다.
from functools import partial
import smbus
def main():
addr = 0x20
bus = smbus.SMBus(0) # or SMBus(1) on newer pis
# Helper functions
wr_dir = partial(bus.write_byte_data, addr, 0x01)
wr = partial(bus.write_byte_data, addr, 0x13)
# Set Pins B0-B4 of the MCP23017 to output
wr_dir(0xF0)
# Names of the Pins
RST = 1 << 0
DATA = 1 << 1
FQ = 1 << 2
CLK = 1 << 3
def send_bit(bit):
# send a single bit
wr(DATA * bit)
wr(CLK | DATA * bit)
def fq():
wr(FQ)
wr(0)
def init():
wr(RST)
wr(0)
wr(CLK)
wr(0)
wr(FQ)
wr(0)
freq = 1000
init()
dphase = int(0.5 + (freq << 32) / 125000000.0)
for x in range(32):
send_bit((dphase >> x) & 1)
# Phase bits can all be 0
for x in range(8):
send_bit(0)
fq()
if __name__ == "__main__":
main()
이론적으로 일부 D / A 변환기를 GPIO 핀에 연결할 수는 있지만 주로 Linux가 실시간 OS가 아니기 때문에 정확한 타이밍으로 구동 할 수 없으므로 신호 생성에 적합하지 않습니다.
또한, 이러한 고주파에서 작동 할 수있는 방법은 없습니다.
44kHz 정도면 충분하다면 오디오 잭이 가장 간단한 방법 일 것입니다.
John La Rooy는 훌륭한 솔루션을 제공하지만 회로는 일부 회로보다 더 복잡 할 수 있습니다. 이것은 요한의 솔루션을 추천 GPIO 신호 핀 대신 2를 사용하지만, 단지 AD9850를 사용 톰 Herbison에 의해 설계 유사한 솔루션에 대해 설명합니다.
Tom은 다음과 같이 GPIO에 연결합니다.
그는 AD9850을 5V 대신 3.3V에서 실행합니다. 이 논의 에 따르면 , AD9850은 3.3V 또는 5V에서 작동하는 것으로 평가되었지만 일부 보드는 5V를 오랫동안 처리 할 수없는 구성 요소를 사용할 수 있으므로, AD9850 보드의 특성에 따라 3.3V에서 실행하는 것이 실제로 더 나은 솔루션 일 수 있습니다. .
내 특정 AD9850 보드에는 보드 아래에 대부분의 핀 레이블이 있었으므로 프로토 타이핑 보드로 누르기 전에 밑면 사진을 찍었습니다. 핀 위치는 결국 Tom의 보드와 동일합니다. 내 보드에 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()
pi에서 GPIO 핀을 사용하려면 루트로 실행해야하므로 Tom은 루트 권한으로 파이썬 코드를 시작하는 두 가지 방법을 설명합니다. 그의 첫 번째 방법은 항상 루트로 실행되도록 Python IDE 데스크탑 아이콘을 수정하는 것이지만 안전하지 않은 것 같습니다. 필요하지 않은 경우 모든 Python GUI 프로그램을 루트로 실행하고 싶지는 않습니다. 두 번째 방법은 sudo idle3_
명령 프롬프트에서 실행하여 루트 권한이 필요할 때마다 루트 권한으로 Python 3 통합 개발 환경을 시작하는 것입니다.
Tom은 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에서만 라이브러리에 액세스 할 수 있습니다.
루트 권한으로 Python 3 IDE가 열리면 파일 rpi_rfsiggen.py
을 연 다음 Run -> Run Module
메뉴에서 선택 하거나 F5를 누르십시오.
ZOUT2
첫 시도 에서 SinB 출력 핀 ( 내 보드에 표시 되어 있음)에서 1Vpp의 안정적인 18kHZ 사인파를 얻을 수있었습니다 .
오디오 및 Lf rf 용 함수 발생기를 구현하려면 EBAY에서 저렴한 AD9833 모듈을 선택하십시오. 이것은 사인, 방형 파 및 삼각파와 가변 위상을 제공합니다. 분명히 7 MHz를 지나치지 않았습니다 ....