ฉันจะสร้างสัญญาณความถี่ / ชีพจรได้อย่างไร


19

ฉันกำลังมองหาวิธีที่จะใช้ Raspberry Pi เป็นเครื่องกำเนิดสัญญาณ ขณะนี้ฉันกำลังทำงานเกี่ยวกับการต่อโมดูล AD9850ราคาไม่แพงจากอีเบย์ สิ่งนี้จะสร้างความถี่ที่แม่นยำมากถึง 40MHz (70MHz ด้วย AD9851)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันเดาว่าสัญญาณเสียงสามารถใช้สำหรับรูปคลื่นตามอำเภอใจได้จนถึงความถี่ที่ จำกัด มาก

มีความเป็นไปได้อื่น ๆ อีกไหม?

คำตอบ:


13

นี่คือวิธีที่ฉันเชื่อมต่อโมดูล AD9850 และโปรแกรม Python อย่างง่ายเพื่อแสดงวิธีตั้งความถี่เป็น 1000Hz

AD9850 จำเป็นต้องทำงานที่ 5V เพื่อทำงานอย่างถูกต้องกับคริสตัล 125MHz มันจะอาจจะ ok ลวด 4 ขา GPIO โดยตรงกับโมดูลตั้งแต่พวกเขาเป็นเพียงปัจจัยการผลิต แต่การเชื่อมต่อผ่านทางMCP23017ได้อย่างมีประสิทธิภาพจะเปิดโมดูลเข้าไปอีกI²Cอุปกรณ์ต่อพ่วงและทำให้แน่ใจว่าปัจจัยการผลิต RPI มีความปลอดภัย

หมายเหตุสำคัญเกี่ยวกับ + 5V
พิน + 5V บน GPIO ไม่สามารถจ่ายกระแสไฟให้กับ AD9850 ได้อย่างแท้จริง คุณควรใช้แหล่งจ่ายไฟ 5V ภายนอก

RPi เชื่อมต่อกับโมดูล AD9850 ผ่าน MCP23017

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 ตัวเอง :)
จอห์นลา Rooy

อืมฉันเดาว่านี่อาจเป็นคำถามที่โง่ แต่สัญลักษณ์ GPIO คืออะไร
Steven Lu

@StevenLu สี่เหลี่ยมผืนผ้าขนาดใหญ่ทางด้านขวาของแผนผัง RPi เก่ามี 26 พินส่วนอันใหม่กว่ามี 40 พิน ดูelinux.org/…
John La Rooy

ตกลง. ดูเหมือนเป็นธรรมชาติมาก ฉันคิดว่าคุณไม่ได้วาดพิน 40 อันเพราะคุณต้องการเพียง 3 พินเหล่านั้นสำหรับแผนภาพ
Steven Lu

11

ในทางทฤษฎีแล้วคุณสามารถแปลง D / A เป็นพินของ GPIO ได้ แต่มันไม่เหมาะสำหรับการสร้างสัญญาณเพราะคุณจะไม่สามารถขับด้วยเวลาที่แม่นยำได้เนื่องจาก Linux ไม่ใช่ระบบปฏิบัติการแบบเรียลไทม์

นอกจากนี้ยังไม่มีวิธีที่สิ่งนี้สามารถทำงานได้ที่ความถี่สูงเช่นนี้

หาก 44 kHz หรือเพียงพอฉันคิดว่าแจ็คเสียงอาจเป็นวิธีที่ง่ายที่สุดในการทำ


4

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และเป็นRSTRESET

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บนบอร์ด) ในการทดลองครั้งแรกของฉัน


3

หากคุณเพียงแค่ต้องการสร้างฟังก์ชั่นเครื่องกำเนิดเสียงสำหรับ Lf rf แล้วเลือกโมดูล AD9833 ราคาถูกจาก EBAY สิ่งนี้จะให้คลื่นไซน์สี่เหลี่ยมและสามเหลี่ยมพร้อมเฟสแปรผัน เห็นได้ชัดว่าไม่ดีมากที่ผ่านมา 7 MHz ....

ป้อนคำอธิบายรูปภาพที่นี่


ต้องมีเหตุผลที่โมดูลเหล่านั้นมีราคาแพงกว่าโมดูล AD9850 มีความคิดอะไรบ้าง
John La Rooy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.