Làm thế nào tôi có thể tạo tín hiệu tần số / xung?


19

Tôi đang tìm cách sử dụng Raspberry Pi làm bộ tạo tín hiệu. Hiện tại tôi đang làm việc để kết nối một mô-đun AD9850 rẻ tiền từ ebay. Điều này sẽ tạo ra tần số khá chính xác lên đến 40 MHz (70 MHz với AD9851).

nhập mô tả hình ảnh ở đây

Tôi đoán đầu ra âm thanh cũng có thể được sử dụng cho các dạng sóng tùy ý với tần số rất hạn chế.

Có khả năng nào khác không?

Câu trả lời:


13

Đây là cách tôi đã kết nối mô-đun AD9850 và một chương trình Python đơn giản để hiển thị cách đặt tần số thành 1000Hz.

AD9850 cần chạy ở mức 5V để hoạt động chính xác với tinh thể 125 MHz. Có thể bạn thể kết nối trực tiếp 4 chân GPIO với mô-đun vì chúng chỉ là đầu vào, nhưng kết nối qua MCP23017 có hiệu quả biến mô-đun thành một thiết bị ngoại vi I²C khác và đảm bảo đầu vào RPi an toàn.

Lưu ý quan trọng Giới thiệu về + 5V
Chân + 5V trên GPIO thực sự không thể cung cấp đủ dòng điện để cung cấp năng lượng cho AD9850. Bạn nên sử dụng nguồn 5V bên ngoài.

RPi được kết nối với mô-đun AD9850 qua 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()

Đó có phải là biểu tượng RPIO GPIO của riêng bạn không?
Alex Chamberlain

1
@AlexChamberlain, đúng vậy. Theo như tôi có thể nói RPF đã không phát hành bất cứ thứ gì rất hữu ích ngoài chính RPi :)
John La Rooy

Hmm, tôi đoán đây có thể là một câu hỏi ngớ ngẩn, nhưng biểu tượng GPIO là gì?
Steven Lu

@StevenLu, hình chữ nhật lớn ở bên phải của sơ đồ. RPi's cũ có 26 chân, những cái mới hơn có 40 chân. xem elinux.org/ Kẻ
John La Rooy

Ờ được rồi. Nó chỉ có vẻ rất tự nhiên. Tôi nghĩ bạn đã không vẽ phiên bản 40 pin vì dù sao bạn chỉ cần 3 trong số các chân đó cho sơ đồ.
Steven Lu

11

Về lý thuyết, bạn có thể kết nối một số bộ chuyển đổi D / A với các chân GPIO nhưng điều này không phù hợp để tạo tín hiệu vì bạn sẽ không thể lái nó với thời gian chính xác, chủ yếu vì Linux không phải là hệ điều hành thời gian thực.

Ngoài ra, không có cách nào điều này có thể hoạt động ở tần số cao như vậy.

Nếu 44 kHz hoặc hơn là đủ, tôi nghĩ rằng jack âm thanh có thể là cách đơn giản nhất để làm điều đó.


4

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: Sơ đồ kết nối

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, CLKW_CLK, và RSTRESET.

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.gpiosẽ 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 Moduletừ 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 ZOUT2trên bảng của tôi) trong lần thử đầu tiên.


3

Nếu bạn chỉ muốn triển khai một trình tạo chức năng cho âm thanh và Lf rf thì hãy chọn một mô-đun AD9833 giá rẻ từ EBAY. Điều này sẽ cung cấp cho bạn sóng hình sin, hình vuông và hình tam giác cộng với pha biến đổi. Rõ ràng 7 MHz không tốt lắm ....

nhập mô tả hình ảnh ở đây


Phải có một lý do những mô-đun đó đắt hơn nhiều so với mô-đun AD9850. Bất cứ ý tưởng tại sao?
John La Rooy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.