周波数/パルス信号を生成するにはどうすればよいですか?


19

Raspberry Piを信号発生器として使用する方法を検討しています。現在、ebayから安価なAD9850モジュールを接続する作業をしています。これにより、最大40MHz(AD9851では70MHz)までのかなり正確な周波数が生成されます。

ここに画像の説明を入力してください

オーディオ出力は、非常に限られた周波数までの任意波形にも使用できると思います。

他の可能性はありますか?

回答:


13

AD9850モジュールと簡単なPythonプログラムを接続して、周波数を1000Hzに設定する方法を示します。

AD9850は、125MHzの水晶で適切に動作するために5Vで動作する必要があります。でしょう、おそらく彼らは、入力されているので、モジュールに直接4本のGPIOピンを配線する大丈夫、しかし経由で接続MCP23017効果的にすることは別のものにモジュールをオンI²C周辺と確認RPI入力が安全であることができます。

+ 5Vに関する重要な注意事項
GPIOの+ 5Vピンは、AD9850に電力を供給するのに十分な電流を実際には供給できません。外部5V電源を使用する必要があります。

MCP23017を介してAD9850モジュールに接続されたRPi

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()

それはあなた自身のRPi GPIOシンボルですか?
アレックスチェンバレン

1
@AlexChamberlain、はい、そうです。私が知る限り、RPFは
RPi

うーん、これはばかげた質問かもしれませんが、GPIOシンボルとは何ですか?
スティーブンルー

@StevenLu、回路図の右側にある大きな長方形。古いRPiには26ピン、新しいRPiには40ピンがあります。参照elinux.org/...を
ジョン・ラRooy

わかった とても自然に思えます。40ピンバージョンを描画しなかったのは、ダイアグラムに必要なピンが3つだけだったからです。
スティーブンルー

11

理論的にはいくつかのD / AコンバーターをGPIOピンに接続することもできますが、これは主にLinuxがリアルタイムOSではないため、正確なタイミングで駆動できないため、信号生成には適していません。

また、これがこのような高周波数で動作する方法はありません。

44 kHz程度で十分であれば、オーディオジャックが最も簡単な方法だと思います。


4

ジョンラルーイには良い解決策がありますが、回路は他の人が好むよりも複雑かもしれません。 これは、Tom HerbisonがAD9850のみを使用して設計した同様のソリューションを示していますが、Johnのソリューションのように2本ではなく4本のGPIO信号ピンを使用しています。

トムは次のようにGPIOに接続します。 接続図

彼が5Vではなく3.3VでAD9850を実行していることに注目してください。この議論によると、AD9850は3.3Vまたは5Vで動作するように定格されていますが、一部のボードは5Vを長時間処理できないコンポーネントを使用する場合があるため、AD9850ボードのフレーバーに応じて、3.3Vでの実行が実際により良いソリューションになる可能性があります。

私の特定のAD9850ボードでは、ほとんどのピンラベルがボードの下にしかありませんでしたので、プロトタイプボードに押し付ける前に下側の写真を撮りました。ピンの位置は、とにかくトムのボード上のピンの位置と同じになりました。私のボードでは、FQラベル付けされてFU_UQCLKW_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の正弦波を得ることができました。


3

オーディオとLf rfの関数ジェネレーターを実装する場合は、EBAYから安価なAD9833モジュールを選択します。これにより、正弦波、方形波、三角波に加えて可変位相が得られます。どうやら7 MHzを過ぎてもあまり良くないようです...

ここに画像の説明を入力してください


これらのモジュールがAD9850モジュールよりもはるかに高価である理由がなければなりません。理由は何ですか?
ジョンラルーイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.