Solución de problemas de Dac sobre raspberry pi spi

1

Estoy intentando emitir una señal con dac124s085 desde el código python en una frambuesa pi 3b, ejecutando Raspbian Stretch (kernel 4.14.30-v7 + # 1102).

Estoy seguro de que el controlador maestro spi está habilitado - dtparam = spi = on no está comentado en /boot/config.txt

Estoy usando cables dupont de 20 cm entre rpi y dac. El pinout es el siguiente ( dac124s085 pinout en la página 3 | raspberry pi 3 pinout )

MOSI pin 19 on rpi connected to pin 8 DIN on dac
MISO pin 21 on rpi not used by dac
SCLK pin 23 on rpi connected to pin 10 SCLK on dac
CE0  pin 24 on rpi not used by dac
GND  pin 25 on rpi connected to pin 6 GND on dac
CE1  pin 26 on rpi connected to pin 9 SYNC on dac

pin7VREFINondacisconnectedto5Vpin2onrpi(decoupledtoground)pin1VAondacisalsoconnectedto5Vdecoupledtogroundpin2-5VOUTA-Dondacisconnectedtotwostereojacksviaadconeachline

esquema completo en github

Estoy utilizando la biblioteca py-spidev ( enlace ). Prueba de bucle invertido en spidev0.0 y spidev0.1:

./spidev_test -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D

El código que estoy usando:

import spidev
import math

class Dac:

    def __init__(self, device):
        self.spi = spidev.SpiDev()
        self.spi.open(0, device)
        self.spi.max_speed_hz = 1000000

    def write(self, ch, data):
        wdata = []
        wdata.append((ch << 6) | ((int(data) & 0xF00) >> 8))
        wdata.append(int(data) & 0xFF)
        self.spi.xfer(wdata)

    def writeAll(self, ch0, ch1, ch2, ch3):
        self.write(0, ch0)
        self.write(1, ch1)
        self.write(2, ch2)
        self.write(3, ch3)

if __name__ == '__main__':

    dac = Dac(1)

    nsamples = 32
    a = [0] * nsamples
    for n in range(nsamples):
        a[n] = int(2048 + 512*math.sin(2*math.pi*n/256))

    while (True):
        for sample in a:
            dac.write(0, sample)

( guión dac124s085.py en github )

¿Cómo puedo solucionar este problema? El script debe generar una onda sinusoidal pero no lo hace. Realmente funciona si tomo los cables entre el circuito y el rpi. ¿Tal vez la conductividad de mi cuerpo haga algo con la velocidad del reloj o tire de un pin alto / bajo?

¿Es correcto el script? Debo confesar que realmente no lo entiendo.

El analizador lógico muestra esto cuando ejecuto sudo python3 dac124s085.py en rpi:

¿Estoescorrectoconreferenciaaldiagramadetiempo?

Editar: Cuando intento loop.py, el dac en realidad emite una señal constante (sin que yo sostenga los cables ni nada)

from adc124s021 import Adc
from dac124s085 import Dac

adc = Adc(0)
dac = Dac(1)

while True:
    ch0, ch1, ch2, ch3 = adc.readAll()
    print(ch0, ch1, ch2, ch3)
    dac.writeAll(ch0, ch1, ch2, ch3)

Pero dac se engancha a un altavoz. Casi siempre escucho un ruido, excepto cuando estoy cerca del circuito con dac, rpi y cables (sin tocar). Subiré un archivo csv con los puntos de datos.

Edición 2:

El problema se soluciona agregando self.spi.mode = 3 debajo de def __init__ en dac124s085.py

Supongo que debería leer detenidamente www.allaboutcircuits.com/technical-articles/spi-serial-peripheral-interface/

    

0 respuestas

Lea otras preguntas en las etiquetas