dimanche 16 août 2015

Le DDS AD9850 et le Bus Pirate

HC-SR08 connecté au 'Bus Pirate'. N'étant pas sûr que le Bus Pirate pouvait fournir assez de courant, le module est alimenté par un 'MB102 Breadboard Power Supply Module'.

On trouve sur eBay un breakout, le HC-SR08, avec un générateur de signal sinusoïdal DDS AD9850. La datasheet nous apprend que le composant est configurable en envoyant 40 bits en série : 32 bits pour la fréquence (f=(x * CLKIN)/2^32 avec CLKIN = 125 MHz) et 8 bits de configuration (5 bits de phase et 3 de contrôle). Pour mettre le composant en mode 'série', il faut mettre la pin D2 à la terre et D1 avec D0 sur VDD. Le chip peut être alimenté en 3.3 volts. Les bits sont pris un par un au flanc montant de W_CLK et le tout est pris en compte au flanc montant de FQ_UD. En fait, cela ressemble très fort à du SPI et cela devrait être facile à mettre en œuvre avec un Bus Pirate, espèce de couteau suisse de la communication série pour ce genre de bidule. En utilisant la sortie CS pour FQ_UD, cela devrait même être trivial...

Aussitôt dit, aussitôt fait.
Pirate bus
----------
PB.GND  -- GND
PB.MOSI -----> DDS.DATA    # SPI bus
PB.CS   -----> DDS.FU_UD
PB.CLK  -----> DDS.W_CLK

DDS
---
DDS.GND -- GND

DDS.D0 -- 3.3V   # config serie
DDS.D1 -- 3.3V
DDS.D2 -- GND

DDS.VCC -- 3.3V

DDS.ZOUT1 ----------------> Oscillo.CH1
GND ----------------------> Oscillo.GND
Vient ensuite l'interaction avec le Bus Pirate... Sur Ubuntu, le driver du FTDI (USB-RS232) est natif, il n'y a qu'à utiliser 'minicom(1)' à 115200 bauds sur /dev/USB0, par exemple. Mettre le bidule en mode SPI, configurer les options et envoyer la séquence de bits.
$ minicom -D /dev/ttyUSB0 -b115200
[...]
HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
x. exit(without change)

(1)>5
Set speed:
 1. 30KHz
 2. 125KHz
 3. 250KHz
 4. 1MHz

(1)>1
Clock polarity:
 1. Idle low *default
 2. Idle high

(1)>1
Output clock edge:
 1. Idle to active
 2. Active to idle *default

(2)>1
Input sample phase:
 1. Middle *default
 2. End

(1)>1
CS:
 1. CS
 2. /CS *default

(2)>2
Select output type:
 1. Open drain (H=Hi-Z, L=GND)
 2. Normal (H=3.3V, L=GND)

(1)>2
Ready
SPI>L
LSB set: LEAST sig bit first
SPI>[0 0 0x25 0 0]
/CS ENABLED
WRITE: 0x00
WRITE: 0x00
WRITE: 0x25
WRITE: 0x00
WRITE: 0x00
/CS DISABLED  # ---> 70.42 khz mesuré
SPI>[0 0 0x26 0 0]
/CS ENABLED
WRITE: 0x00
WRITE: 0x00
WRITE: 0x26
WRITE: 0x00
WRITE: 0x00
/CS DISABLED # ---> 72.46 kHz mesuré
SPI>
Théoriquement, [0 0 0x25 0 0] devrait donner une fréquence de (37*256^2/256^4)*125 MHz, c'est-à-dire 70.572 kHz et [0 0 0x26 0 0], une fréquence de (38*256^2/256^4)*125 MHz, c'est-à-dire 72.479 kHz. La mesure à l'oscillo est un peu différente mais pas beaucoup : 2/1000 dans le premier cas et beaucoup moins dans le second. Il est fort probable que l'erreur soit du côté de la mesure plus que du côté de la génération (?). Pour 'qualifier' la fréquence générée, il faudrait utiliser un diviseur de fréquence et intégrer sur une plus longue durée; utiliser un fréquence-mètre calibré.

Aucun commentaire:

Enregistrer un commentaire