MICROCONTROLEUR – LP SESAM :
Partie 2 – Conversion AN et NA
Version 2.1
Mise à jour oct. 2017
LibreOffice 5.1 - Ubuntu
Les E/S T.o.R. et après?
De nombreux systèmes ne peuvent se limiter à des entrées/sorties TOR :
ADAPTATION
ADAPTATION
+ Programme pour
«traiter» le son
2
Système numérique
CAN Capteurs analogiques
PROCESSUS
CONTRÔLÉ
Port
Capteurs TOR
µC Entrée
+ programme Port
Actionneurs TOR
Sortie
CNA
Actionneurs
analogiques
CAN : Convertisseur Analogique → Numérique
CNA : Convertisseur Numérique → Analogique
3
Conversion Numérique/Analogique
• Un CN/A (ou DAC en anglais : Digital-to-Analog Converter) convertit un
code numérique en un signal analogique (généralement une tension)
Ex. d'un CN/A 8 bits :
0
1
1 Vs : tension de sortie
0
CN/A
CPU 1
0
0
8 bits
1
VREFN VREFP
(Pré-actionneur +)
µC Actionneur
Tensions de référence analogique
4
Conversion Numérique/Analogique
Suivant le convertisseur :
• différentes « plages » de conversion possibles (tensions en V)
• Différentes résolutions (associées au nombres de bits)
Ex. d'un CN/A 8 bits :
Bipolaire [-5;5V] avec codage binaire signé Unipolaire [0;3,3V] avec codage binaire non signé
Tension de sortie Tension de sortie
5V 3,3 V
0x80
0x7f Code
Code
-5 V 0xff
5
CN/A du LPC1768
Cortex M3 : CN/A 10bits → 1024 valeurs possibles en entrée
Plage de conversion : 0/3,3V
Codes binaires non signés → valeurs de 0 à 0x3FF
Vs
3,3V
Tension de sortie :
𝑁
Vs = ⋅ 3,3𝑉
1024
Remarque :
• on ne peut pas atteindre les 3,3V
• il existe des technologies de CN/A
N
0 qui le permettent, avec une formule
0x3FD
0x3FE
0x3FF
légèrement différente
0x000
0x001
0x002
6
“Défauts” d’un CN/A
• Problèmes courants avec un CN/A et un µC
– Si on utilise un CN/A 10, il n’existe pas de variable de 10 bits en langage C
– → On utilise alors un short (16 bits) ou un int (32 bits) pour préparer la valeur à envoyer
au CN/A
– Si on ne prend pas de précautions, on pourrait dépasser les limites du nombre attendu
par le CN/A
– Exemple : Que se passe-t-il si on envoie la valeur 0x0400 (1024) sur un CN/A 10 bits non
signés (valeur maximum 1023) ?
à Réponse : le CN/A ne regarde que les 10 bits de poids faible (ici
0x000), et on aura alors une tension nulle en sortie !
7
“Défauts” d’un CN/A
• Dans l’exemple de CN/A précédent, imaginons que nous essayons de
fabriquer un signal sinusoïdal en envoyant au CN/A des valeurs
comprises entre -2200 et 2200
3,3V 3,3V
0V 0V
SIGNAL INCOHERENT SIGNAL « ACCEPTABLE » (= saturé)
8
Conversion Analogique/Numérique
Conversion Analogique-Numérique
• Un CA/N (ou ADC en anglais : Analog-to-Digital Converter) convertit
un signal analogique (généralement une tension) en un code
numérique
Ex. d'un CA/N 8 bits :
0
1 Ve : tension d’entrée
1
0 CA/N
CPU 1
0 8 bits
0
1 Capteurs
VREFN VREFP
analogiques
µC
Tensions de référence analogique
9
CA/N du LPC1768
Cortex M3 CA/N 12bits : 4096 valeurs
Plage de conversion : 0/3,3V
Codes binaires non signés → valeurs entre 0 et 0xFFF
N
0xFFF
0xFFE
0xFFD
Caractéristique
« idéalisée » Ve
𝑁= ⋅ 4096
0x002 3,3𝑉
0x001 Formule du CN/A inversée
0x000
3,3V Ve
0
N est forcément un entier, on voit que la caractéristique est toujours
« sous » la caractéristique idéalisée, on garde donc la partie entière pour N
10
CA/N et CN/A
• → Réaliser un programme « suiveur » numérique : Vs=Ve
• On doit donc faire une CAN de la tension en entrée, stockée dans une
variable du programme
• Puis envoyer cette valeur sur le CN/A
• Question ? Pour réaliser un suiveur, l’organigramme ci-dessous est-il
correct?
CA/N → valeur
valeur → CN/A
→ oui si CA/N et CN/A avec même plage de conversion et même résolution
Et dans les autres cas ?
11
CA/N et CN/A sur le LPC1768
• → Réaliser un programme « suiveur » numérique : Vs=Ve
• Attention : nos CA/N et CN/A ne fonctionnent qu’en tension
unipolaire 0/3,3V … et nous voulons travailler avec des signaux
entrée/sortie bipolaires (exemple : un signal sinusoïdal) !
àIl faudra passer par l'utilisation d'un offset de 1,65 V additionné au
signal analogique en entrée Ve
• Question ? Pour réaliser un suiveur, l’organigramme ci-dessous est-il
correct?
CA/N → valeur
Réponse : NON !!!
valeur → CN/A OK… mais pourquoi ?
12
Filtre “Suiveur”
• Le CA/N et le CN/A sur notre cible n’ont pas les mêmes caractéristiques
code ↔ tension
– Les plages de conversion sont identiques : de 0 à 3,3 V
– mais les convertisseurs utilisent un nombre de bits différents :
• CA/N : 12 bits, valeurs numériques entre ………... et ………..
• CN/A : 10 bits, valeurs numériques entre ………... et ……..…
• Par exemple, si la tension 0,5V est présente en entrée du CA/N :
§ 0.5V à CAN à code 621
§ code 621 à CNA à 2.0V
• A cause de la différence du nombre de bits, la tension de sortie est 4 fois
plus grande que celle d’entrée
(+ attention au « défaut » du CN/A, cf cours précédent)
13
Filtre “Suiveur”
• Solution, diviser le code par 4 (ou >>2 ) avant l’écriture sur le CN/A
int main(void)
{
short valeur;
Init_CAN();
Init_CNA();
while(1)
{
valeur = lecture_CAN();
Ecriture_CNA(valeur >>2 );
}
return 0 ;
} → obtention d'un filtre numérique « suiveur »
14
Plus difficile : gain de 2
• On supposera que l’on a des signaux d'entrée centrés sur 1,65V
• Le gain 2 n’est pas à appliquer à cet offset, mais uniquement au
signal “utile”
Idéalement, on sortie
devrait donc obtenir :
entrée
L'offset n'a pas changé !
15
Filtre “Gain de 2”
• Pour ne pas appliquer le gain à l’offset, il faut manipuler les codes
numériques de telle sorte que 1.65V ↔ code 0
int main(void)
{
short entree,sortie;
Init_CAN();
Init_CNA();
while(1)
{
entree = lecture_CAN()-2048; //on enlève l’offset après CA/N
sortie = entree * 2; //on applique le gain 2
Ecriture_CNA((sortie + 2048)>>2); //on remet l’offset avant CNA
}
return 0 ;
}
16
Résumons…
• Chaîne totale de traitement :
μC – domaine numérique
Ve Vs
CA/N Gain x2 >>2 CN/A
• - • +
• 2048 • 2048
Ici en version “sans saturation numérique”...
Filtre Gain de 2 : Problème !
• Problème : il est possible de dépasser les limites des codes CN/A
18
Filtre Gain de 2 : la Solution !
• Il faut mettre en place les saturations numériques avant le CN/A
int main(void)
{
short entree,sortie;
Init_CAN();
Init_CNA();
while(1)
{
entree = lecture_CAN()-2048; //on enlève l’offset
sortie = entree<<1; //on applique le gain 2
if (sortie>2047) sortie=2047;
else if (sortie<-2048) sortie=-2048;
sortie = (valeur+2048)>>2; //on remet l’offset
Ecriture_CNA(sortie);
}
return 0 ;
}
19
Filtre Gain de 2 : Rendu final!
• C'est déjà beaucoup mieux…
20