Note d’application
AN-169
Rev 1.0
MISE en OEUVRE DES CODEURS SSI
Exemple de code (microchip XC8) :
typedef union { // conversion et découpage d'un int en
bytes
Les codeurs des séries 22Y ou 25Y disposent
d'une interface série synchrone.
struct {
Le maître fournit une horloge et lit les 12 bits
formant la position actuelle du codeur.
};
Le codeur ne dispose pas de signal de
validation comme un « chip select » et doit
être resynchronisé à chaque transmission.
La resynchronisation est effectuée par la mise
à l'état haut du signal d'horloge « CLK »
pendant un temps dit « TimeOut ».
Ceci a pour conséquence d'imposer des temps
limites sur CLK, en effet une horloge trop
lente pourrait être interprétée comme un
TimeOut.
int valInt;
} valueInt;
unsigned int grayToBinary(unsigned int num) {
unsigned int mask;
for (mask = num >> 1; mask != 0; mask = mask
>> 1) {
num = num ^ mask;
}
return num;
}
int main(int argc, char** argv) {
La durée à l'état bas de CLK doit être
comprise entre 25ns et 16µs
valueInt dataVal;
La durée à l'état haut de CLK doit être
comprise entre 25ns et 16µs.
init();
while (1) {
TimeOut
dataVal.valInt = 0; // variable qui va contenir la
valeur lue sur le codeur SSI
clk = 0;
__delay_us(1); // la durée à l'état bas doit etre
entre 25ns et TimeOut
CLK
DATA
unsigned char low, high;
D11 D10
D0
for (char i = 0; i < 12; i++) {
0
clk = 1;
D'autre part les 12 bits sont transmis selon un
code Gray réduit, symétrique par rapport à la
valeur médiane.
__delay_us(1); // la durée à l'état haut doit
etre entre 25ns et TimeOut
clk = 0;
// la durée à l'état bas doit etre entre 25ns et
TimeOut
dataVal.valInt = (dataVal.valInt << 1) |
data; // le premier bit transmis est D11
// __delay_us(1); // la durée à l'état bas doit
etre entre 25ns et TimeOut
// donc ne pas rajouter de délai si la durée du
décalage est suffisamment longue
}
// Un dernier coup de clock, mais sans décalage
clk = 1;
__delay_us(1); // la durée à l'état haut doit etre
entre 25ns et TimeOut
Tél:04.50.70.54.54
info@megatron.fr
http://www.megatron.fr
AN-169
2
clk = 0;
__delay_us(1); // la durée à l'état haut doit etre
entre 25ns et TimeOut
clk = 1;
//
__delay_us(17); // Timeout de 16µs mini
permettant la resynchronisation pour la demande
suivante
//
dataVal.valInt = grayToBinary(dataVal.valInt);
while (BusyUSART());
WriteUSART(dataVal.high); // par exemple sortie
sur UART du MSB
while (BusyUSART());
WriteUSART(dataVal.low); // par exemple sortie
sur UART du LSB
}
Exemple d'interface :
Les lignes CLK et DATA étant symétriques une
conversion de type RS422 est nécessaire
DCM-102-D
5 ou +24V
GND
2
1
+5V
CN3
C2
1
2
100nF
U1
1
+5V
2
3
4
8
7
6
5
CN1
5
1
4
2
3
+5V
2
3
C3
1
1
2
3
4
RO
RE
DE
DI
VCC
B
A
GND
6
7
6
5
http://www.megatron.fr
VCC
GND
CLK+
CLKDAT+
DAT-
DCM-106-D
2
8
MAX3082CPA
info@megatron.fr
2
100nF
U2
Tél:04.50.70.54.54
4
5
+5V
120
1
R2
CN2
VCC
B
A
GND
MAX3082CPA
DCM-105-D
CLK
DATA
GND
VCC
RO
RE
DE
DI
1
">
/
Scarica
Solo un promemoria. Puoi visualizzare il documento qui. Ma soprattutto, la nostra IA l''ha già letto. Può spiegare cose complesse in termini semplici, rispondere alle tue domande in qualsiasi lingua e aiutarti a navigare rapidamente anche nei documenti più lunghi o complicati.