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
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/