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.GNDVient 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