Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Commentez, partagez et proposez des Tutos en langage BASIC et PASCAL !
[En cours] Conversion analogique-numerique / numerique-analogique
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#1 Message par cyril13110 » sam. 26 août 2017 23:02

conversion analogiques numerique/ numerique analogique

TraitNum.gif


1) base commune CAN -CNA
Calcul :
le calcul est simple, il faut dans un premier temps calculer le quantum. C'est a dire la plus petite tension numerisable avec le convertisseurs et il se calcul de la maniere suivante:
q = (Vref+ - Vref-) / valeur max numerique

1.1) cas avec avec Vref- et Vref+ interne au pic:
nous utilisons des pic principalement en 5v et les convertisseurs sont en 10 bits, soit 1024

5v / 1024 =0,0048828125
ca veux donc dire que en cette configuration le can du pic peut détecter et convertir une tension par pas de 4,88mV.
une tonsion de 3mV ne sera pas détectable par exemple.

meme exemple mais en 3.3V:
3.3 / 1024 = 0,0032226563

ici c'est la base, le seul inconvénient vient de la conversion de l'information pour affichage sur un LCD car il faut absolument travailler avec des variables à virgule (ce qui charge le pic, bon aprés si le pic ne sert qu'a faire un simple thermostat ok on s'en fous mais si le pic gere un code plus consequent là......il va falloir faire des calculs assez consommateurs)

1.2) cas avec Vref- et Vref+ externe au pic (merci à paulfjujo pour son retour sur les VREF):
maintenant imaginons que nous voulons imposer les tension de reférences, pour augmener la resolution, ou plutot gagner en precision:
nous sommes sur 10 bits, soit une valeur de 1024 max, nous avons une valeur analogique qui evolue entre 0 et 1v, dans ce cas la il serait intéréssant de passer VREF+ à 1,024V, soit un pas de detection de 1mV.
Ce qui aura pour effet de pouvoir detecter plus de variation que, si par exemple, nous avions laissé le Vref+ à 5v avec un pas de detection à 4,8mV.

Je vais prendre du coup l'exemple de mon besoin pour un projet en cours, je veux me faire un générateur de courant reguler par le pic avec une plage d'evolution de 0A à 1.5A.
du coup au lieu de garder le VREF+ à 5V je vais le passer à 2,048V et avoir un pas de 2mV pour la mesure.
Ce qui va donc me donner un echelon de regulation de 2mA avec une resistance de mesure de 1 ohm, l'idée me plais bien car je gagne en precision.....
et pour l'affichage sur mon LCD, la conversion sera plutot rapide car le quantum n'a pas de virgule.

partant de là, il est donc possible de faire le calcul inverse afin de calculer et afficher la tension sur un afficheur lcd par exemple, d'utiliser la valeur numerique dans un calcul de filtre numérique, de faire diverses fonctions si la valeur numerique depasse un ou plusieurs seuils......ect....la c'est libre court a votre imaginations et surtout fonction des besoins du projet....


2) conversion analogique numérique
symbole d'un CAN:
Image
avant tous convertisseur, il y a toujours un échantillonneur bloqueur
sti45.gif


sti46.gif


L’échantillonneur/bloqueur va servir à maintenir la tension à convertir afin de laisser le temps au convertisseur de faire son travail.
Sans l’échantillonneur/bloqueur le can ne pourra pas fonctionner.

Dans les puces all inclusive l’échantillonneur/bloqueur est présent, donc pas besoin de le rajouter.

Ce qui donne un signal nalogique de la forme suivante pour convertion:
courbe-ANbis.png


2.1)montage a composant discret (juste pour culture générale):

Image
Image

bien évidement il existe diverse technologie de CAN, aujourd'hui tous est intégré dans une puce et ca simplifie grandement les montages.

2.2) convertisseur avec données parallèles

je n'ai pas trouvé de schéma pour un CAN avec données parallèle. ca reste de la culture générale car aujourd'hui ce genre de puce est , si je ne me trompe pas, obsolète depuis trés longtemps.
C'est la puce qui intégré tous ce montage mais qui garde encore les données parallèles. l’inconvénient n'est pas trés difficile à comprendre, cela oblige à avoir de dispo autant de bit que la résolution en compte en dispo sur le contrôleur ou plutot le processeur.
Ces puces là, doit dater de l’époque des processeurs, chaque puce était adressé sur le mapping memoire, pour y avoir passer un peut de temps à l'ecole sur le sujet une mega galere.....heuresement que les controleurs sont apparu avec tous ce qu'il va bien de deja intégré :langue: :langue: :langue: :langue: :langue: (desolé pour les anciens)
J'ai tous de meme ouvert mes livres d'ecoles pour vous donnéer quelques reférences à titres d'exemple:
- ADC1225
- ADC 0808/0809

2.3) utilisation d'une entrée analogique des pic

bon tous ca c'est bien beau mais passons enfin à ce qui nous intéresse réellement...

tous le monde ou presque connait ce schéma:
Image

d'un pic à un autre la seule différence est le nombre d'entrée analogique de disponible. Il me semble que les registres sont quasi identique d'un pic à un autre mais à valider.

4 ou 5 registres sont utilisés pour configurer et gérer le CAN :
- Les registres de résultat : ADRESH et ADRESL
- Les registres de contrôle : ADCON0, ADCON1 et ADCON2
Le registre ADCON0 est lié au pilotage du CAN , ADCON1 permet de configurer les lignes comme étant des entrées numériques, analogiques ou de éférence. Enfin, ADCON2 sert à choisir l'horloge de conversion, un temps d'acquisition programmé et la justification du résultat.

Les compilateurs permettent pas mal de configurations mais dés que l'on a besoin de passer dans un cas particulier il faut regler les registres un à un.
Seul le cas simple avec les tensions de references internes sont gérés par le compilateur. Par contre ce qui particulierement bien c'est que tous les registres sont normalement connus du compilateur.

Image
Image

Le registre ADCON0 est completement géré par le compilateur.
Ce registre sert principalement à choisir l'entrée analogique et à activer la conversion.

Image
Image

Le registre ADCON1 sert à gerer les tensions de références et le parametrage des entrées, c'est à dire le nombre d'entrée analogique et tout ou rien.

Image

Le registre ADCON2 est trés important à comprendre si l'on veux passer à 100% par le paramétrage des registres ou de parametrer un point important.

Dans ce registre il y a 2 configuration très importants à comprendre, le temps d'acquisition ou de conversion et l’horloge de conversion du CAN.
Ces 2 parametres doivent absolument etre bien configurer si non le CAN ne donnera pas de resultat fiable. Ces parametres sont en fonction du quartz utilisé et il absolument respecter les preconisations constructeurs.
Là on reboucle, le temps d'acquisition est le temps pendant lequel échantillonneur/bloqueur va maintenir la tension à convertir. Un temps trop cours le convertisseur n'arrivera pas à suivre, un temps trop long peut penaliser un code qui demande un temps de cycle cours. Il y a un minimum à mettre en fonction du quartz, si le pic n'a pas un process qui demande un temps de cycle cours rien ne vous empeche d'augmenter ce temps, mais la c'est une question de compromis en fonction du besoin.

Image

Configurer le temps d'acquisition
Le registre ADCON2 permet à l'utilisateur de configurer un «temps d'acquisition». Ce temps intervient entre le moment où le bit GO/DONE est mis à 1 et le moment ou la conversion démarre réellement.
Les bits ACQT2 à ACQT0 (ADCON2<5:3>) permettent de configurer un temps d'acquisition compris entre 2 et 20 Tad (Tad = période de l'horloge de conversion, 1 Tad = 1 bit). Si un temps d'acquisition est programmé, il n'est pas nécessaire d'attendre entre le moment ou une voie est sélectionnée et celui où l'on place le bit GO/DONE à 1.
Il est possible de ne pas utiliser ce temps d'acquisition (ACQT2:ACQT0 = 000). Dans ce cas, la conversion démarre immédiatement après que le bit GO/DONE ait été positionné à 1. Il est de la responsabilité de l'utilisateur de s'assurer que le délai nécessaire entre la sélection d'une voie et le lancement de la conversion ait eu lieu. Dans tous les cas, lorsque la conversion est terminée, le bit GO/DONE est remis à 0 et le bit ADIF positionné à 1.

Si je dois resumer les parametres ci-dessus, au plus le quartz a une fréquence elevé et au plus il faut ralentir l'horlogue du CAN pour lui laisser le temps de la conversion.

Jusqu'a présent nous avons parlé que de la configuration, mais il faut faire attention à l'impedance de sortie du signal analogique à convertir:
Pour permettre au convertisseur de fonctionner au maximum de ses possibilités, il est nécessaire que le condensateur d'échantillonnage (CHOLD) ait le temps de se charger complètement à la valeur de la tension appliquée sur l'entrée analogique.

Image

L'impédance de sortie de la source de tension (Rs) ainsi que la résistance de l'interrupteur analogique (Rss) ont une influence directe sur le temps de charge de CHOLD. Dans tous les cas, il est recommandé que l'impédance de sortie de la source de tension ne dépasse pas 2,5k ohm.

exemple de configuration avec l'utilisation direct des registres:

Code : Tout sélectionner

ADCON0 = %00000001;
//bit 7 et 6 : ne sert a rien
//bits 5 à 2 : permet de choisir l'entrée a convertir, ici on va lire la voie 0
//bit 1: ici ce bit passe à 1 quand la conversation est fini, il faut donc dans le top le scruter soit attendre un temps suffisamment afin d'être certain que ca soit fini
//bit 0: permet d'activer le CAN sur le niveau logique 1.

ADCON1 = %00010000;
//bit 7 et 6 : ne sert a rien
//bit 5 : 0 ici j'utilise Vref- interne
//bit 4 : 1 ici j'utilise Vref+ externe
//bit 3 à 0: ici jai tous mis a 0 ca veut dire que j'utilise toutes les voies ana

ADCON2 =%10110001;
//bit 7 : justification a droit ou a gauche
la justification permet de soit demarer mettre le bit de poid faible du resultat sur le bit 0 de ADRESL et on n'utilise que les 2 bit de poid faible de ADRESH SOIT %xxxxxx00 (justification a droite), ou de mettre le bit de poid fort du resultat sur le bit de poid fort de ADRESH et la cest le contraire les bits de poids faible de la mesure seront sur les bits 6 et 7 de ADRESL soit %00xxxxxx (justification a gauche)
//bit 6: ne sert a rien
//bit 5 à  3: ici jai mis 110 soit 16 TAD, pour se paramtre il gaut se reporter au la DS.
//bit 2 à  0: ici on parametre la vitesse  de cadencement du CAN. ici 001 soit la fréquence general de travail diviser par 8.




ce réglage peut trés bien etre utiliser directement dans les compilateurs

2.4) convertisseur avec données series

les convertisseurs series sont en tous points identiques sauf que l'échange de données sont soit en I2C soit en SPI.
Dans les 2 cas, il y a des puces avec Vref interne et des puces avec Vref externe. Il y a des references à 1, 2, 4, 8 voies.
apres il y a des references avec des resultats 8 bits, 10 bits, 12 bits et il me semble quil existe meme 16bits et 24 bits.
apres tous est question de compromis et de besoin.

voila quelques exemples de CAN SPI :
MCP3001 - 10bits - 1 entrée ana
MCP3201 - 12 bits - 1entrée ana
MCP3208 - 12 bits - 8 entrée ana


voila quelques exemples de CAN I2C:
MCP3021 - 10 bits - 1 entrée ana
MCP3221 - 12 bits - 1 entrée ana

Les références ci-dessus sont tous au format classiques MSOP, PDIP, SOIC 150mil , TSSOP et sont de technologies de l'approche successives, je vous laisse découvrir.
d'autre techno existent mais il va falloir se les souder.......




2.5) exemple d'utilisation
avoir une entrée analogique permet de lire des grandeurs physique afin d'interagir avec l'environnement.
pour les exemples on peut parler de regulations (temperature, debit, pression, courant, tension,....ect....) la liste est longue.
on peut faire de la domotique avec par exemple l'utilisation de capteur de température pour ventiler une piece.


3) conversion numerique analogique
3.1) theorie simplifié et calcul
pour les calculs cest le meme principe que ci dessus.

voila deja le symbole:
mpi18_cna.gif


Du coup pour le calcul, il faut faire le chemin inverse du CAN, mais le resonnemant reste le meme.
Pour se simplifier le resonnement on va partir sur un Vref+ à 2048Mv, soit 2.048V. Ce qui donne un quantum de 2mV.

Pour expliquer rapidement le résonnement à utiliser, je vais partir sur un projet que j'ai réaliser:
Classeur1.xlsx

L'exemple est trés simple, sur une feuille excel j'ai calculer une sinusouide, j'ai isolé 1 alternance complete que j'ai placé entre 0V et 5V.
J'ai fait en sorte d'avoir le nombre d'echantillon que je desirais gardé (en valeur analogique) et j'ai calculé la représentation numerique de chaque valeur avec la meme formule de calcul:
val numerique = tension / q
Ici, mon exemple est sur 8 bits, soit une valeur de 255 en numerique.
Mon quantum est de 5/ 255 = 19mV (pas trés trés precis ca, mais a ce moment là la precision de la tension n'etait pas ma priorité).
Partant de là, excel facilite les caculs en determinant une table de points analogique puis numeriques trés rapidement.
et voila vous avez votre table de données numeriques à sortir.

Le calcul peut trés bien se faire avec 10 bits, 12 bits, 16 bits........ca reste la meme chose.
mon exemple est sur 5V, mais ne vous empeches de faire les calculs sur 12V pour avoir une amplitude plus grande.
Le HARD fera le reste....


3.2)schémas électronique
il ne me semble pas qu'il existe un pic avec un cna, du coup il faut faire un peut plus de bricolages.

- montage a réseau de résistances R/2R:


reseau R-2R.gif


Ce montage est très simple à mettre en œuvre, mais il demande beaucoup de sorties.
la détermination de la tension de sortie est très simple, il suffit de calculer les résistances équivalentes pour chaque voies et vous remarquerez que ça fait des ponds diviseurs de tension pour chaque voies avec un coefficients de 2 pour chaque étage.
Le bit 0 est égal au quantum q, soit 18mv
Le bit 1 est égal à 2q
le bit 2 est égal à 4q
le bit 3 est égal à 8q
le bit 4 est égal à 16q
le bit 5 est égal à 32q
le bit 6 est égal à 68q
le bit 7 est égal à 128q

un exemple de ce montage est disponible sur ce topic avec une description complète et des imprime écran d'oscilloscope:
http://www.fantaspic.fr/viewtopic.php?style=1&f=21&t=325



- montage a convertisseur avec donnée a entre parallèle :
Je vais faire un bref passage dans ce chapitre car aujourd'hui de tel composants ne se trouvent quasiment plus, ils sont devenus obsolète car ils demandent trop de sorties. Mais la remarque des CAN parallèle s'applique ici aussi.
Pour vous trouver des references de puces, j'ai ouvert mes vieux livres d’écoles...
* DAC 0800
* ADC 1208/1209/1210

- montage a convertisseur avec donnée série (I2C ou SPI):

pour ne pas changer, je vais partir sur la base microchip (pour info je n'ai pas d'action chez eux, mais vue que le site est centralisé sur les pic le choix n'est pas très difficile voir même logique), bien évidement il y a d'autre marque de fondeur. La liste est très longue .
chez microchip, les CNA sont soit SPI soit I2C.
L'avantage principale est que ca ne prend que les E/S de communications, allé pour vraiment aller loin il y a un legé désavantage pour le SPI qui a besoin d'un CS par puce mais vue que la vitesse de communication est assez élevé rien empêchement d'ajouter une puce de 16 bits sur le réseau SPI pour gérer tous les CS.

Je vous mets le lien vers la liste CNA, a vous de faire votre choix. Perso je vais me diriger vers des puces SPI pour commencer.
liste CNA disponible chez MICROCHIP

3.3) programme

Quelque soit le montage CAN que vous choisissez le programme aura toujours la même constante, seul le transfert de la valeurs vers le monde extérieur changera.

bien évidement l'utilisation d'un cna oblige a faire des compromis, je m'explique :
je vais partir sur la recomposition d'un signal sinusoïdale.
au moins vous limitez le nombre d'échantillons au plus vous pourrez monter en fréquence de sortie mais au plus il faudra utiliser un filtre analogique sévère pour avoir un signal de sortie le plus propre possible.
pour comprendre le problème il faut comprendre la composition d'un signal carré (décomposition de fourrier ou encore FFT)
un signal carré est composé de la fréquence porteuse qui pour l'exemple on va dire quelle sera de 1khz, mais aussi d'une multitude de fréquences secondaires appelé harmoniques, toutes c'est harmoniques sont décalés de de 2 fois la fréquence porteuses.
des exemples valent mieux que des théories, pour une fréquence principale de 1khz, les harmoniques commencent a 3khz, puis 5khz, 7khz, 9khz, 11khz, ect jusqu’à l'infinie.


3.4) exemple d'utilisation
ce type de fonction fonction est utile quand on a besoin d'une sortie analogique pour un pic.
cette sortie analogique peut attaquer l'entrée d'un comparateur de tension pour par exemple avoir un générateur de courant géré par microcontrôleurs , la fabrication d'un générateur de fonction, la génération d'un signal particulier.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par cyril13110 le mar. 19 sept. 2017 17:05, modifié 24 fois.

Proposer un Tutoriel
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2586
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » dim. 27 août 2017 16:45

bonjour Cyril,

bonne initiative ,
meme si c'est un peu redondant avec ce que jeremy à déja fait coté C

prevoir peut etre de rajouter les cas particuliers qui sont les plus embetants , et qui se generalise avec les PIC rescents

* usage de VREF externe VREF- et VREF+ generalemenrt sur RA2 et RA3
* usage de VREF interne 4.096, 2.048 et 1.024V
permettant d'obtenir une meilleur resolution
et aussi de se dispenser d'utiliser du flottant
avec Vref=4.096
4096/1024 = 4 mV par point
U (mV)= ADC Points <<2;
et on positionne ensuite le point decimal ..

à inclure aussi, un item important :
les timmings à respecter suivant FOSC
TAD , Temps de conversion

L'impedance de la source de signal à mesurer ..

nota: mikroC ne sait pas gerer correctement les ref interne pour ADC
avec ADC_Read(channel);
je ne sais pas si c'est idem avec mikroBasic
il faut alors gerer l'ADC directement via ses registres.

A+
Aide toi, le ciel ou FantasPic t'aidera

Proposer un Tutoriel
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#3 Message par cyril13110 » dim. 27 août 2017 17:15

bonjour paulfjujo,
je prend note poir completer car je compte faire quelque chose de vraiment complet.
de passer par les différentes techno afin de transmettre des informations completes a tous ce qui ne maitrisent pas trop.
et je vais completer le tuto avec mes cours de bts.....
je ne me suis jamais pose la question sur l'utilisation de vref exterieur mais ca sera l'occasion....

Proposer un Tutoriel
cyril13110
Confirmé
Confirmé
Messages : 721
Âge : 41
Enregistré en : avril 2016
Localisation : 13

#4 Message par cyril13110 » lun. 28 août 2017 21:00

au final je viens de mieux regarder ca m'intéresse bien davoir un vref a 2.048 v.......je vais pouvoir etre plus precis dans ma regulation....


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité