주파수 / 펄스 신호를 어떻게 생성 할 수 있습니까?


19

Raspberry Pi를 신호 발생기로 사용하는 방법을 찾고 있습니다. 현재 ebay에서 저렴한 AD9850 모듈 을 연결하는 중 입니다. 이는 최대 40MHz (AD9851의 경우 70MHz)까지 상당히 정확한 주파수를 생성합니다.

여기에 이미지 설명을 입력하십시오

오디오 출력은 매우 제한된 주파수까지 임의 파형에도 사용할 수 있다고 생각합니다.

다른 가능성이 있습니까?

답변:


13

다음은 AD9850 모듈을 연결 한 방법과 주파수를 1000Hz로 설정하는 방법을 보여주는 간단한 Python 프로그램입니다.

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 심볼입니까?
Alex Chamberlain

1
@AlexChamberlain, 그렇습니다. 내가 말할 수있는 한 RPF가 RPi와는 별개
John La Rooy

흠, 나는 이것이 어리석은 질문 일지 모르지만 GPIO 심볼은 무엇입니까?
Steven Lu

@StevenLu, 회로도 오른쪽의 큰 사각형. 오래된 RPi에는 26 개의 핀이 있었고, 새로운 RPi에는 40 핀이 있습니다. 참조 elinux.org/...
존 라 Rooy에게

오 알았어 매우 자연스러운 것 같습니다. 어쨌든 다이어그램에 해당 핀 중 3 개만 필요했기 때문에 40 핀 버전을 그리지 않았다고 생각합니다.
Steven Lu

11

이론적으로 일부 D / A 변환기를 GPIO 핀에 연결할 수는 있지만 주로 Linux가 실시간 OS가 아니기 때문에 정확한 타이밍으로 구동 할 수 없으므로 신호 생성에 적합하지 않습니다.

또한, 이러한 고주파에서 작동 할 수있는 방법은 없습니다.

44kHz 정도면 충분하다면 오디오 잭이 가장 간단한 방법 일 것입니다.


4

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.gpioPython 2에서만 라이브러리에 액세스 할 수 있습니다.

루트 권한으로 Python 3 IDE가 열리면 파일 rpi_rfsiggen.py을 연 다음 Run -> Run Module메뉴에서 선택 하거나 F5를 누르십시오.

ZOUT2첫 시도 에서 SinB 출력 핀 ( 내 보드에 표시 되어 있음)에서 1Vpp의 안정적인 18kHZ 사인파를 얻을 수있었습니다 .


3

오디오 및 Lf rf 용 함수 발생기를 구현하려면 EBAY에서 저렴한 AD9833 모듈을 선택하십시오. 이것은 사인, 방형 파 및 삼각파와 가변 위상을 제공합니다. 분명히 7 MHz를 지나치지 않았습니다 ....

여기에 이미지 설명을 입력하십시오


이러한 모듈이 AD9850 모듈보다 훨씬 비싼 이유가 있어야합니다. 왜 그런지 알아?
John La Rooy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.