Frekans / nabız sinyallerini nasıl oluşturabilirim?


19

Raspberry Pi'yi sinyal üreteci olarak kullanmanın yollarını arıyorum. Şu anda ebay ucuz bir AD9850 modülü çengel üzerinde çalışıyorum . Bu 40MHz'e kadar oldukça doğru frekanslar üretecektir (AD9851 ile 70MHz).

resim açıklamasını buraya girin

Bence ses çıkışı çok sınırlı bir frekansa kadar rastgele dalga formları için de kullanılabilir.

Başka olasılıklar var mı?

Yanıtlar:


13

Frekansı 1000Hz'e nasıl ayarlayacağınızı göstermek için AD9850 modülünü ve basit bir Python programını nasıl bağladım.

AD9850'nin 125MHz kristal ile düzgün çalışması için 5V'de çalışması gerekir. Olur muhtemelen onlar sadece girişler olduğundan modülüne doğrudan 4 GPIO işaretçilerine tel için Tamam olabilir ama bir üzerinden bağlantı MCP23017 etkili bir şekilde başka içine modülü döner I²C periferik ve emin RPI girişler güvenlidir yapar.

+ 5V Hakkında Önemli Not
GPIO'daki + 5V pin, AD9850'ye güç sağlamak için gerçekten yeterli akım sağlayamaz. Harici bir 5V besleme kullanmalısınız.

MCP23017 üzerinden AD9850 modülüne bağlı 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()

Bu sizin kendi RPi GPIO sembolünüz mü?
Alex Chamberlain

1
@AlexChamberlain, evet öyle. Bildiğim kadarıyla RPF RPi kendisi dışında çok yararlı bir şey yayınlamadı :)
John La Rooy

Hmm, sanırım bu aptalca bir soru olabilir, ama GPIO sembolü nedir?
Steven Lu

@StevenLu, şemanın sağındaki büyük dikdörtgen. Eski RPi'lerin 26 iğnesi vardı, yenilerinin 40 iğnesi var. bkz. elinux.org/…
John La Rooy

Tamam. Çok doğal görünüyor. 40 pin versiyonunu çizmediğinizi düşünüyorum, çünkü şema için bu pinlerden sadece 3 tanesine ihtiyacınız vardı.
Steven Lu

11

Teorik olarak bazı D / A dönüştürücüyü GPIO pinlerine bağlayabilirsiniz, ancak bu sinyal üretimi için uygun değildir, çünkü esas olarak Linux gerçek zamanlı bir işletim sistemi olmadığı için kesin zamanlama ile süremezsiniz.

Ayrıca, bunun bu kadar yüksek frekanslarda çalışmasının bir yolu yoktur.

44 kHz ya da yeterli ise, ses jakı bunu yapmanın en basit yolu olabilir.


4

John La Rooy'un iyi bir çözümü var, ancak devre bazılarının tercih ettiğinden daha karmaşık olabilir. Bu , Tom Herbison tarafından sadece AD9850 kullanılarak tasarlanan benzer bir çözümü açıklamakla birlikte, John'un çözümü gibi 2 yerine 4 GPIO sinyal pini kullanıyor.

Tom GPIO'ya şu şekilde bağlanır: bağlantı şeması

AD9850'yi 5V yerine 3.3V'de çalıştırdığına dikkat edin. Bu tartışmaya göre , AD9850'nin 3.3V veya 5V'de çalıştığı derecelendirilmiştir, ancak bazı kartlar 5V'yi uzun süre işleyemeyen bileşenler kullanabilir, bu nedenle 3.3V'de çalıştırmak, AD9850 kartının lezzetinize bağlı olarak daha iyi bir çözüm olabilir. .

Benim özel AD9850 anakartım çoğu anakartın altındaydı , bu yüzden alt tarafı bir prototip kartına bastırmadan önce resmini çektim. Pim konumları, Tom'un yönetim kurulundaki konumlarla aynı oldu. Tahtada,FQ etiketli FU_UQ, CLKolduğu W_CLKve RSTolduğu RESET.

Tom, bu Python 3 betiğini fonksiyon üretecini kontrol etmek için sağlar. İndirme bağlantısının kesilmesi durumunda v1.0'ın bir kopyası:

# 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 üzerindeki GPIO pinlerinin her türlü kullanımı kök olarak çalışmayı gerektirdiğinden, Tom python kodunu kök ayrıcalıklarıyla başlatmak için iki yöntem açıklar. İlk yöntemi Python IDE masaüstü simgesini her zaman root olarak çalışacak şekilde değiştirmek, ancak bu bana güvensiz gibi geliyor - gerekmiyorsa tüm python GUI programlarını root olarak çalıştırmak istemezsiniz. İkinci yöntem, sudo idle3_Python 3 Tümleşik Geliştirme Ortamını kök ayrıcalıklarına ihtiyaç duyduğunda kök ayrıcalıklarıyla başlatmak için bir komut isteminden çalıştırmaktır .

Tom, RPi.GPIO python 3 kütüphanesini kurduğundan bahsetmez, bu yüzden bazı Pi OS sürümlerinde zaten mevcut olabilir, ancak Occidentalis v0.2'de mevcut değildi, bu yüzden koştum sudo apt-get install python3-rpi.gpio . Python 3'ün RPi.GPIO için farklı bir konum kullandığını, bu nedenle sudo apt-get install python-rpi.gpiokütüphanenin sadece Python 2 tarafından erişilebilir olmasını sağlayacağını unutmayın.

Python 3 IDE kök ayrıcalıklarıyla açıldığında, dosyayı açın rpi_rfsiggen.py , ardından menüden seçim yapın Run -> Run Moduleveya F5 tuşuna basın.

İlk denememde SinB çıkış pininden (kartımda etiketli ZOUT2) 1Vpp'de güzel bir kararlı 18kHZ sinüs dalgası elde edebildim .


3

Sadece ses ve Lf rf için bir fonksiyon jeneratörü uygulamak istiyorsanız, EBAY'den ucuz bir AD9833 modülü alın. Bu size sinüs, kare ve üçgen dalgalar artı değişken faz verecektir. Görünüşe göre çok iyi değil 7 MHz ....

resim açıklamasını buraya girin


Bu modüllerin AD9850 modüllerinden çok daha pahalı olmasının bir nedeni olmalıdır. Neden olduğu hakkında bir fikrin var mı?
John La Rooy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.