Raspberry Piを信号発生器として使用する方法を検討しています。現在、ebayから安価なAD9850モジュールを接続する作業をしています。これにより、最大40MHz(AD9851では70MHz)までのかなり正確な周波数が生成されます。
オーディオ出力は、非常に限られた周波数までの任意波形にも使用できると思います。
他の可能性はありますか?
Raspberry Piを信号発生器として使用する方法を検討しています。現在、ebayから安価なAD9850モジュールを接続する作業をしています。これにより、最大40MHz(AD9851では70MHz)までのかなり正確な周波数が生成されます。
オーディオ出力は、非常に限られた周波数までの任意波形にも使用できると思います。
他の可能性はありますか?
回答:
AD9850モジュールと簡単なPythonプログラムを接続して、周波数を1000Hzに設定する方法を示します。
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ではないため、正確なタイミングで駆動できないため、信号生成には適していません。
また、これがこのような高周波数で動作する方法はありません。
44 kHz程度で十分であれば、オーディオジャックが最も簡単な方法だと思います。
ジョンラルーイには良い解決策がありますが、回路は他の人が好むよりも複雑かもしれません。 これは、Tom HerbisonがAD9850のみを使用して設計した同様のソリューションを示していますが、Johnのソリューションのように2本ではなく4本のGPIO信号ピンを使用しています。
トムは次のようにGPIOに接続します。
彼が5Vではなく3.3VでAD9850を実行していることに注目してください。この議論によると、AD9850は3.3Vまたは5Vで動作するように定格されていますが、一部のボードは5Vを長時間処理できないコンポーネントを使用する場合があるため、AD9850ボードのフレーバーに応じて、3.3Vでの実行が実際により良いソリューションになる可能性があります。
私の特定の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()
piでGPIOピンを使用するにはrootとして実行する必要があるため、TomはPythonコードをroot権限で起動する2つの方法を説明しています。彼の最初の方法は、Python IDEデスクトップアイコンを変更して、常にrootとして実行することですが、それは安全ではないと感じます。2番目の方法は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の正弦波を得ることができました。