আমি কীভাবে ফ্রিকোয়েন্সি / নাড়ি সংকেত তৈরি করতে পারি?


19

আমি রাস্পবেরি পাই সিগন্যাল জেনারেটর হিসাবে ব্যবহার করার উপায়গুলি দেখছি। বর্তমানে আমি ইবে থেকে একটি ব্যয়বহুল AD9850 মডিউলটি জড়ানোর কাজ করছি । এটি 40MHz (AD9851 সহ 70MHz) অবধি মোটামুটি নির্ভুল ফ্রিকোয়েন্সি উত্পন্ন করবে।

এখানে চিত্র বর্ণনা লিখুন

আমার ধারণা অডিও আউটপুটটি খুব সীমিত ফ্রিকোয়েন্সি পর্যন্ত স্বেচ্ছাসেবী তরঙ্গকারীর জন্যও ব্যবহৃত হতে পারে।

অন্য কোন সম্ভাবনা আছে?

উত্তর:


13

আমি কীভাবে AD9850 মডিউলটি সংযুক্ত করেছি এবং কীভাবে 1000Hz এ ফ্রিকোয়েন্সি সেট করতে হয় তা দেখানোর জন্য একটি সাধারণ পাইথন প্রোগ্রাম।

ADM850 125MHz স্ফটিকের সাথে সঠিকভাবে কাজ করতে 5V তে চালানো দরকার। এটি হবে সম্ভবত মডিউল সরাসরি টেলিগ্রাম 4 GPIO পিনের যেহেতু তারা শুধু ইনপুট হয় ঠিক হতে, কিন্তু একটি মাধ্যমে সংযোগ MCP23017 কার্যকরভাবে অন্য মডিউল সক্রিয় I²C পেরিফেরাল এবং নিশ্চিত RPi ইনপুট নিরাপদ করে তোলে।

গুরুত্বপূর্ণ নোট +5V সম্পর্কে
জিপিআইওতে + 5 ভি পিনটি AD9850 পাওয়ার জন্য সত্যিকারের পর্যাপ্ত প্রবাহ সরবরাহ করতে পারে না। আপনার একটি বাহ্যিক 5 ভি সরবরাহ ব্যবহার করা উচিত।

এমসিপি 23017 এর মাধ্যমে আরপিআই 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()

এটি কি আপনার নিজস্ব আরপিআই জিপিআইও প্রতীক?
অ্যালেক্স চেম্বারলাইন

1
@ অ্যালেক্সচাম্বারলাইন, হ্যাঁ এটি আছে। যতদূর আমি বলতে পারি আরপিএফ নিজেই আরপিআই ছাড়া খুব কার্যকর কিছু প্রকাশ করেনি :)
জন লা

হুম, আমি অনুমান করি এটি একটি নির্বোধ প্রশ্ন হতে পারে তবে জিপিআইও প্রতীক কী?
স্টিভেন লু

@ স্টিভেনলু, স্কিম্যাটিকের ডানদিকে বৃহত আয়তক্ষেত্র। পুরানো আরপি'র 26 টি পিন ছিল, নতুনগুলিতে 40 টি পিন রয়েছে। দেখতে elinux.org/...
জন লা রয়

ওহ ঠিক আছে. এটা খুব স্বাভাবিক মনে হয়। আমি মনে করি আপনি 40 টি পিন সংস্করণটি আঁকেননি কারণ ডায়াগ্রামের জন্য আপনার কেবল সেই তিনটি পিনের দরকার ছিল।
স্টিভেন লু

11

আপনি তাত্ত্বিকভাবে জিপিআইও পিনগুলিতে কিছু ডি / এ রূপান্তরকারীকে সংযুক্ত করতে পারেন তবে এটি সংকেত উত্পাদনের পক্ষে উপযুক্ত নয় কারণ আপনি এটি সঠিক সময় নিয়ে চালনা করতে পারবেন না, মূলত কারণ লিনাক্স রিয়েল-টাইম ওএস নয়।

এছাড়াও, এই জাতীয় উচ্চ ফ্রিকোয়েন্সিগুলিতে এটি চালানোর কোনও উপায় নেই।

যদি 44 কেজি হার্জ বা তার বেশি হয় তবে আমি মনে করি অডিও জ্যাক এটি করার সবচেয়ে সহজ উপায়।


4

জন লা রুইয়ের একটি ভাল সমাধান রয়েছে তবে সার্কিটটি কারওর চেয়ে বেশি জটিল হতে পারে। এটি কেবল AD9850 ব্যবহার করে টম হার্বিসনের নকশা করা একটি অনুরূপ সমাধান বর্ণনা করে, যদিও এটি জন এর সমাধানের মতো 2 এর পরিবর্তে 4 জিপিআইও সিগন্যাল পিন ব্যবহার করে।

টম জিপিআইওতে এটির সাথে সংযোগ স্থাপন করে: সংযোগ চিত্র

লক্ষ্য করুন তিনি 5V এর পরিবর্তে 3.9V এ AD9850 চালান। এই আলোচনা অনুসারে , AD9850 কে 3.3V বা 5V এ চালানোর জন্য রেট দেওয়া হয়েছে তবে কিছু বোর্ড 5V দীর্ঘ সময়ের জন্য পরিচালনা করতে সক্ষম নয় এমন উপাদানগুলি ব্যবহার করতে পারে, তাই আপনার AD9850 বোর্ডের স্বাদের উপর নির্ভর করে 3.3V তে চলমান আসলে আরও ভাল সমাধান হতে পারে ।

আমার নির্দিষ্ট 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 ইন্টিগ্রেটেড ডেভেলপমেন্ট এনভায়রনমেন্টটি যখন রুট সুবিধাগুলির প্রয়োজন হয় তখন রুট সুবিধাগুলি সহ চালু করতে হয়।

টম আরপিআই.জিপিআইও পাইথন 3 লাইব্রেরি ইনস্টল করার কথা উল্লেখ করে নি তাই এটি ইতিমধ্যে কিছু পাই ওএস সংস্করণে উপলভ্য হতে পারে তবে এটি দৌড়ে দৌড়ে আসার জন্য অ্যাসিডেন্টালিস v0.2 এ উপলব্ধ ছিল না sudo apt-get install python3-rpi.gpio। দ্রষ্টব্য যে পাইথন 3 RPI.GPIO এর জন্য পৃথক অবস্থান ব্যবহার করে তাই sudo apt-get install python-rpi.gpioলাইব্রেরিটি কেবল পাইথন 2 এ অ্যাক্সেসযোগ্য করে তুলবে।

পাইথন 3 আইডিই একবার রুট সুবিধার সাথে খোলে, ফাইলটি খুলুন rpi_rfsiggen.py, তারপরে Run -> Run Moduleমেনু থেকে চয়ন করুন বা এফ 5 টিপুন।

আমি ZOUT2আমার প্রথম প্রয়াসে সিনব আউটপুট পিন ( আমার বোর্ডে লেবেলযুক্ত ) থেকে 1Vpp এ একটি দুর্দান্ত স্থিতিশীল 18kHZ সাইন ওয়েভ পেতে সক্ষম হয়েছি ।


3

আপনি যদি কেবল অডিও এবং এলএফ আরএফের জন্য কোনও ফাংশন জেনারেটর বাস্তবায়ন করতে চান তবে EBAY থেকে একটি সস্তা AD9833 মডিউল চয়ন করুন। এটি আপনাকে সাইন, স্কোয়ার এবং ত্রিভুজ তরঙ্গ প্লাস ভেরিয়েবল ফেজ দেবে। দৃশ্যত 7 মেগাহার্জ খুব ভাল অতীত না ....

এখানে চিত্র বর্ণনা লিখুন


AD9850 মডিউলগুলির চেয়ে মডিউলগুলি এত বেশি ব্যয়বহুল হওয়ার কোনও কারণ থাকতে হবে। কোন ধারণা কেন?
জন লা রোয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.