मैं आवृत्ति / पल्स सिग्नल कैसे उत्पन्न कर सकता हूं?


19

मैं एक संकेत जनरेटर के रूप में रास्पबेरी पाई का उपयोग करने के तरीकों को देख रहा हूं। वर्तमान में मैं eBay से एक सस्ते AD9850 मॉड्यूल को हुक करने पर काम कर रहा हूं । यह 40MHz (AD9851 के साथ 70MHz) तक काफी सटीक आवृत्ति उत्पन्न करेगा।

यहाँ छवि विवरण दर्ज करें

मुझे लगता है कि ऑडियो आउटपुट का उपयोग बहुत सीमित आवृत्ति तक की मनमानी तरंगों के लिए भी किया जा सकता है।

क्या कोई अन्य संभावनाएं हैं?

जवाबों:


13

यहां बताया गया है कि कैसे मैंने AD9850 मॉड्यूल को कनेक्ट किया है और 1000Hz को आवृत्ति सेट करने के तरीके को दिखाने के लिए एक साधारण पायथन प्रोग्राम बनाया है।

AD9850 को 125MHz क्रिस्टल के साथ ठीक से काम करने के लिए 5V पर चलने की आवश्यकता है। यह संभवत: 4 GPIO पिन को सीधे मॉड्यूल में वायर करने के लिए ठीक होगा क्योंकि वे सिर्फ इनपुट हैं, लेकिन एक MCP23017 के माध्यम से कनेक्ट करने से प्रभावी रूप से मॉड्यूल को एक और I²C परिधीय में बदल जाता है और सुनिश्चित करता है कि RPI इनपुट सुरक्षित हैं।

महत्वपूर्ण नोट लगभग 5V
GPIO पर + 5V पिन वास्तव में AD9850 को बिजली देने के लिए पर्याप्त वर्तमान आपूर्ति नहीं कर सकता है। आपको बाहरी 5V आपूर्ति का उपयोग करना चाहिए।

आरसीपी M9823017 के माध्यम से AD9850 मॉड्यूल से जुड़ा

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

क्या आपका अपना आरपीआई GPIO प्रतीक है?
एलेक्स चैंबरलेन 12

1
@AlexChamberlain, हाँ यह है। जहाँ तक मैं बता सकता हूँ आरपीएफ ने आरपीआई के अलावा कुछ भी बहुत उपयोगी नहीं छोड़ा है :)
जॉन ला

हम्म, मुझे लगता है कि यह एक मूर्खतापूर्ण सवाल हो सकता है, लेकिन एक GPIO प्रतीक क्या है?
स्टीवन लू

@StevenLu, योजनाबद्ध के दाईं ओर बड़ी आयत। पुराने आरपीआई में 26 पिन थे, नए वाले में 40 पिन हैं। देख elinux.org/...
जॉन ला Rooy

ओह ठीक है। यह बहुत स्वाभाविक लगता है। मुझे लगता है कि आपने 40 पिन संस्करण नहीं निकाले क्योंकि आपको केवल उन 3 पिनों की आवश्यकता थी जो आरेख के लिए वैसे भी थे।
स्टीवन लू

11

आप GPIO पिन के लिए कुछ D / A कनवर्टर को सिद्धांत रूप में हुक कर सकते हैं, लेकिन यह सिग्नल जनरेशन के लिए उपयुक्त नहीं है क्योंकि आप इसे सटीक समय के साथ ड्राइव करने में सक्षम नहीं होंगे, मुख्यतः क्योंकि लिनक्स एक वास्तविक समय ओएस नहीं है।

इसके अलावा, इस तरह की उच्च आवृत्तियों पर काम करने का कोई तरीका नहीं है।

यदि 44 kHz या पर्याप्त है, तो मुझे लगता है कि ऑडियो जैक इसे करने का सबसे सरल तरीका हो सकता है।


4

जॉन ला रोय के पास एक अच्छा समाधान है लेकिन सर्किट अधिक जटिल हो सकता है जो कुछ पसंद करेगा। यह टॉम हर्बिसन द्वारा डिज़ाइन किए गए एक समान समाधान का वर्णन करता है जो केवल AD9850 का उपयोग करता है, हालांकि यह जॉन के समाधान की तरह 2 के बजाय 4 GPIO सिग्नल पिन का उपयोग करता है।

टॉम इस तरह GPIO से जुड़ता है: जोङनेवाली आकूूुी्ती

ध्यान दें, वह 5V के बजाय 3.3V पर AD9850 चलाता है। इस चर्चा के अनुसार , AD9850 को 3.3V या 5V पर चलाने के लिए रेट किया गया है, लेकिन कुछ बोर्ड ऐसे घटकों का उपयोग कर सकते हैं जो लंबे समय तक 5V को संभालने में सक्षम नहीं हैं, इसलिए 3.3V पर चलना वास्तव में एक बेहतर उपाय हो सकता है, जो AD9850 बोर्ड के आपके स्वाद पर निर्भर करता है। ।

मेरे विशेष AD9850 बोर्ड में ज्यादातर पिन लेबल केवल बोर्ड के नीचे थे, इसलिए मैंने इसे एक प्रोटोटाइप बोर्ड में दबाने से पहले अंडरसाइड की एक तस्वीर ली। पिन स्थान वैसे भी टॉम के बोर्ड के समान थे। मेरे बोर्ड पर, FQलेबल है FU_UQ, CLKहै W_CLK, और RSTहै RESET

टॉम फ़ंक्शन जनरेटर को नियंत्रित करने के लिए इस पायथन 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()

चूंकि पीआई पर जीपीओ पिन के किसी भी उपयोग को रूट के रूप में चलाने की आवश्यकता होती है, टॉम अपने पायथन कोड को रूट विशेषाधिकारों के साथ लॉन्च करने के दो तरीकों का वर्णन करता है। उनकी पहली विधि पायथन आईडीई डेस्कटॉप आइकन को हमेशा रूट के रूप में चलाने के लिए संशोधित करना है, लेकिन यह मुझे असुरक्षित के रूप में हमला करता है - यदि आप नहीं करना चाहते हैं तो आप सभी अजगर जीयूआई कार्यक्रमों को रूट के रूप में चलाना नहीं चाहते हैं। दूसरा तरीका यह है कि sudo idle3_जब भी रूट विशेषाधिकारों की आवश्यकता हो, तो रूट विशेषाधिकार के साथ पायथन 3 एकीकृत विकास पर्यावरण लॉन्च करने के लिए कमांड प्रॉम्प्ट से चला जाए।

टॉम ने RPi.GPIO अजगर 3 लाइब्रेरी को स्थापित करने का उल्लेख नहीं किया है, इसलिए यह पहले से ही कुछ Pi OS संस्करणों पर उपलब्ध हो सकता है, लेकिन यह ओकिडेंटलिस v0.2 पर उपलब्ध नहीं था sudo apt-get install python3-rpi.gpio। मैं उपयोग कर रहा था इसलिए मैं भागा । ध्यान दें कि Python 3 RPi.GPIO के लिए एक अलग स्थान का उपयोग करता है इसलिए sudo apt-get install python-rpi.gpioकेवल लाइब्रेरी को Python 2 तक ही पहुँचा जा सकेगा।

एक बार पायथन 3 आईडीई रूट विशेषाधिकारों के साथ खुलने के rpi_rfsiggen.pyबाद, फ़ाइल खोलें , फिर Run -> Run Moduleमेनू से चुनें या F5 दबाएं।

मैं ZOUT2अपने पहले प्रयास में सिनबी आउटपुट पिन ( मेरे बोर्ड पर लेबल ) से 1Vpp पर एक अच्छी स्थिर 18kHZ साइन लहर प्राप्त करने में सक्षम था ।


3

यदि आप केवल ऑडियो और Lf rf के लिए एक फंक्शन जनरेटर को लागू करना चाहते हैं तो EBAY से एक सस्ता AD9833 मॉड्यूल चुनें। यह आपको साइन, स्क्वायर और ट्राइएंगल वेव्स और वैरिएबल फेज देगा। जाहिरा तौर पर बहुत अच्छा नहीं पिछले 7 मेगाहर्ट्ज ....

यहाँ छवि विवरण दर्ज करें


वहाँ एक कारण होना चाहिए उन मॉड्यूल AD9850 मॉड्यूल की तुलना में बहुत अधिक महंगे हैं। कोई विचार क्यों?
जॉन ला रोय नोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.