FORUM Syndrome-OC - Jacky-PC


  Programmation


  Microcontrolleur &co


  convertisseur analogique numerique trame NMEA

 




Il y a 39 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

convertisseur analogique numerique trame NMEA

n°7417
tinbo
Ok Lah...
Posté le 15-06-2007 à 06:04:21  profilanswer
 

:hello:  tout le monde,  
 
tout d abord je me presente: Tinbo from Singapore :jap:  
 
Comme je suis un peu nouveau ds tout ca, j'aurais besoin d'un tit coup de main sur un tit probleme... :(  
 
Voila je m'explique:  
Je souhaiterai realiser un montage capable de convertir une info de mon capteur de pression qui est analogique en une info numerique du genre: *0001x.x<CR><LF>
 
ou x.x serait la correspondance numerique de la tension analogique qui correspond a une pression.
 
J'imagine que le plus facile serait de faire ca autour d'un PIC et d'un MAX 232 pour la liaison serie verst mon recepteur numerique.
 
Quelqu'un aurait une idee du PIC a utiliser ??
Ou peut etre qu'il y a deja quelque chose de similaire sur le site, mais sorry d avance, j'ai po trouve... :sweat:  
 
Donc voila voila... est ce qu il y aurait une ame charitable pour m'aider ?? :bounce:

mood
Google
Posté le 15-06-2007 à 06:04:21  profilanswer
 

n°7418
Dr Lous
I see old password
Posté le 15-06-2007 à 10:16:54  profilanswer
 

n'importe quel pic avec un CAN et c'est bon :)
 
par exemple le pic16f628, 16f88, ... les plus répendu :) même ceux là ont bien plus de fonctionnalité, donc tu peux prendre encore plus "pas chere" :)

n°7419
tinbo
Ok Lah...
Posté le 15-06-2007 à 13:17:42  profilanswer
 

Merci Docteur,
 
je vais me pencher sur le sujet !!
 
As tu deja utiliser ces deux PIC, moi c'est la premiere fois...
 
SI besoin est pourrais tu m'aider ???
 
Merci d avance

n°7420
Dr Lous
I see old password
Posté le 15-06-2007 à 13:25:32  profilanswer
 

j'utilise le 16f88 et le 18f2550 (pour l'usb)
 
malheuresement je n'ai pas vraiment le temps pour t'aider...
 
mais je te conseille le cours de bigonoff sur les pics, long mais une fois lu entierement une fois tu pourras programmé les pics sans problème :)
 

n°7421
tinbo
Ok Lah...
Posté le 15-06-2007 à 13:38:58  profilanswer
 

Merci beaucoup je vais lire ca ce week end !!!
 
enjoy your week end Doc

n°7425
Deadog
Dain Bramaged
Posté le 15-06-2007 à 14:02:21  profilanswer
 

pour se genre d'application il faut bien définir les caractéristique pour pouvoir choisir le bon CAN (ou µC qui en intègre un).
 
Quelle est la plage de tension que tu dois acquérir ?
À quelle fréquence doit tu acquérir ces signaux ?
Y'a t'il une part d'inertie temporel dans ton capteur ?
De quel précision a tu besoin sur la valeur ?
La relation Volt->pression est elle linéaire ?


---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°7427
Dr Lous
I see old password
Posté le 15-06-2007 à 14:31:16  profilanswer
 

Deadog a écrit :

pour se genre d'application il faut bien définir les caractéristique pour pouvoir choisir le bon CAN (ou µC qui en intègre un).
 
Quelle est la plage de tension que tu dois acquérir ?
pont diviseur ou autre technique pour reduire la tension avec un coef
À quelle fréquence doit tu acquérir ces signaux ?
si mes souvenirs sont bons, sur le 16f88 c'est de l'ordre de 20µs entre chaque capture -> l'ordre de 50KHz
Y'a t'il une part d'inertie temporel dans ton capteur ?
sur ce genre de capteur generalement ca va entre 1sec de framerate et 0.01s, a moins qu'il utilise des capteurs ultra precis de la mort qui tue et qui coute ultra bonbon il est largement dans les plages
De quel précision a tu besoin sur la valeur ?
La relation Volt->pression est elle linéaire ?
même si elle l'est pas il peut la rendre linéaire par le prog du pic ou par le soft/hard qui va utiliser les trames nmea


 
 
:na:

n°7428
Deadog
Dain Bramaged
Posté le 15-06-2007 à 18:37:16  profilanswer
 


 
 
c'est pas vraiment que je te demandais les caractéristiques du CAN d'un pic, surtout quand je l'ai connais [:dslam]
 
je disais ça pour initialiser un esprit de conception mieux proportionné que "il me faut une conversion A/N, oh bah si je prenais un pic"
à part dans le cas de signaux vraiment particuliers à acquérir, un bête pic convient à la plus part des capteurs physiques, mais si on commence comme ça, quand on essaye d'acquérir un truc plus chaud on se demande pkoi le povre 16f il renvoie de la merde [:matleflou]


---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°7439
tinbo
Ok Lah...
Posté le 18-06-2007 à 05:32:34  profilanswer
 

Salut Deadog,
 
merci pour ton aide !!
 
Je suis assez d'accord avec ce que tu as ecris:"il me faut une conversion A/N, oh bah si je prenais un pic"
 
Apres quelques recherches sur le net, j'ai finis par m'orienter vers un PIC:
 
Je dois convertir une tension analogique en numerique.
en Fonction de la valeur de la conversion je dois donner la pression
Et cette valeur de pression doit l envoyer sur un port RS232 dans une trame: *0001x.x<CR><LF>  
 
En faite, technicien de base, je n'ai aucune notion de programmation...
Donc me voila bien embete pour le faire... J'ai suivi le conseil du Doc et je me suis telecharger les cours de Bigonoff, donc ce week end j'ai commence a lire... mais c'est pas demain la veille ou je serais capable de faire tout ca... et mon probleme s'est que c'est assez pressee...
 
Deadog, si tu vois un autre moyen de faire ca ???
 
Deja je vais trouver les reponses a tes questions, c'est deja une bonne base pour demarrer...
 
Voila, a plusme...
 

n°7444
tinbo
Ok Lah...
Posté le 19-06-2007 à 10:40:39  profilanswer
 

Salut  :jap:  
 
Bon apres d'autres recherches, je vais definitivement laisser tomber les cours de Bigonoff, pour le moment biensur, par manque de temps et me concentrer sur de la programmation en C, qui pour beaucoup est plus accessible pour les debutants... comme mouah :lol:  
 
Bon donc je vais utiliser une PIC16F876 et organiser mon programme comme suit:
 
1 - Je recupere l'info analogique sur une entree ANA du micro, RAO/AN0 par exemple.
2 - je stocke la valeur num dans un tableau et quand j'ai accumule 5 valeurs, je fais la moyenne.
3 - Cette moyenne est ensuite transmise sur un port serie sous une forme de trame bien particuliere  
 
Pour la partie 1:
 
J'ai fais des recherches sur la partie CAN du PIC et j'ai trouve differente version de comment faire...
 
Sur la data sheet francaise:
 
Programmation
 Si des entrée de PORTE sont utilisées, placer le bit TRISE,PSPMODE à 0
 Configurer les E/S en Analogique/digital/Référence (ADCON1)
 Configurer les entrées analogiques en entrées (TRISA, TRISE)
 Définir l'horloge de conversion, Valider le module (ADCON0)
 Choisir le canal à convertir (ADCON0)
 attendre temps d’acquisition (20 à 25 µs dans le cas général)
 Lancer la conversion, GO_DONE = 1 (ADCON0)
 Attendre fin de conversion, GO_DONE = 0 ou interruption si validée
 Lire le résultat
 Arrêter le convertisseur ou recommencer au point 6
 
 
SUr le site sympa de: http://angeliz.free.fr/langagec/howto_can.htm
 
Description des fonctions C
 
 La fonction InitA_D configure l'entrée RA0 en mode analogique,
 par l'intermédiaire des bits PCFG.
 L'horloge de conversion est reglée sur 32Tosc, bits ADC.
 Le bit ADFM positionne le résultat contenu dans ADRESH et ADRESL avec
 une justification à droite, les six bits de poids forts de ADRESH sont de ce fait à 0.  
 
 L'utilisation des fonctions demande de les inclure dans votre programme
 configurer RA0 en entrée, et déclarer les variables globales ci-dessous.  
 
    int iValAD, iResultat;
    char cT;
 
 Un simple appel de la fonction et iResultat récupère la valeur sur dix bits de la conversion.
 La résolution est d'environ 5mV (1 bit = 5 mV).
 
    iResultat=ConvertAD();
     
   void InitA_D(void)
 {
 ADCS1=1; ADCS0=0; // Fosc 32
 CHS2=0; CHS1=0; CHS0=0; // sélection de l'entrée analogique RA0
 PCFG3=1; PCFG2=1; PCFG1=1; PCFG0=0;
     ADFM=1; // justification bit à droite registre de réception ADRESH ADRESL
 }
 
   int ConvertAD(void)
 {
 ADON=1;  // activation du convertisseur
 cT=6;
 while(cT--);  // tempo de 23µs
 iValAD=0;
 ADGO=1;  // démarrage conversion  
 while(ADGO); // si ADGO passe à 0 fin de conversion
 iValAD=ADRESH;
 iValAD<<=8;
 iValAD|=ADRESL; // le résultat est contenu dans iValAD
 ADON=0;  // convertisseur arrêté
 return iValAD;
 }
 
 
Donc ma petite question est de comprendre les differences, je n'ai pas envie de recopier comme un cochon et ne rien comprendre... :ange:  
 
 
Qui pourra m'aider ??
Merci d avance :hello:  

n°7445
tinbo
Ok Lah...
Posté le 19-06-2007 à 11:26:36  profilanswer
 

C'est encore moi...
 
Bon quelqu'un pourrais m'aider sur les lignes d'angeliz, qui me semblent plus comprehensible...
 
 
Indentification des Variables :
 
int iValAD, iResultat;
char cT;    //Variable de tempo
iResultat=ConvertAD();
     
 
 
 
Programme de configuration du convertisseur CAN du PIC :
 
void InitA_D(void)
{
ADCS1=1; ADCS0=0;              // Choix de la horloge de conversion a 32
 
CHS2=0; CHS1=0; CHS0=0;              // sélection de l'entrée analogique RA0
PCFG3=1; PCFG2=1; PCFG1=1; PCFG0=0;        // choix si I/O sont ANA ou NUM
ADFM=1;                // justification bit à droite registre réception ADRESH ADRESL
}
 
 
 
Programme de conversion :
 
int ConvertAD(void)
{
ADON=1;               // activation du convertisseur
cT=6;               // On fixe T a 6
while(cT--);             // On demande que T decremente donc tempo de 23µs
iValAD=0;              // On initialise iValad ???
ADGO=1;               // démarrage conversion
while(ADGO);              // si ADGO passe à 0 fin de conversion
iValAD=ADRESH;                 // On dit que iValad = a la valeur contenu ds ADRESH
iValAD<<=8;              // La je ne sais pas ???????????
iValAD|=ADRESL;              // le résultat est contenu dans iValAD
ADON=0;               // convertisseur arrêté
return iValAD;
}
 
Quelqu'un pourrais me confirmer si mes commentaires pour chque lignes sont bonne ??
Je vois qu'il y a des lignes pour une tempo, est ce que c'est necessaire ??
 
Je ne comprends pas trop les dernieres lignes a partir de iValad=ADRESH...
Surtout: iValAD<<=8
Qu'est ce que cela veut dire ???
 
Merci d avance


Message édité par tinbo le 19-06-2007 à 11:27:33
n°7447
Deadog
Dain Bramaged
Posté le 21-06-2007 à 19:29:05  profilanswer
 

l'ADC du pic doit avoir une résolution supérieur à 8bits.
Donc pour obtenir le résultat qui fait plus d'un octet, il faut faire des ptites manip.
 
ADRESH doit sans doute représenter les bits de poids fort du résultats.
On les prend donc, et ensuite, vu que ce sont les bits de poids forts il faut donc les placer à leur place, c'est à dire sur les bits de 8 à 15, pour laisser les bits de 0 à 7 pour l'octet de poids faible, représenter par ADRESL
 
en gros, tu prend les 8 premiers bits, tu les pousses vers la droite de 8 positions (iValAD <<= 8; équivalent à iValAD = iValAD << 8), et ensuite tu prend les 8 derniers bits que tu met la ou t'as fait de la place avant avec le <<.
On fait un OU avec l'opérateur |= pour mélanger les premiers 8 bits avec les deuxièmes 8 bits sans que ceux-ci ne se détruisent l'un l'autre (le << rajoutant des 0 à la représentation binaires du nombre)


---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°7448
Dr Lous
I see old password
Posté le 21-06-2007 à 19:45:48  profilanswer
 

un 16f88 a 10bits de mémoire :)  
aligné a gauche ou a droite :)

n°7450
tinbo
Ok Lah...
Posté le 22-06-2007 à 11:42:03  profilanswer
 

Deadog, Dr Lous,
 
Merci pour l'info... la je comprends beaucoup mieux !!
 
Bon je vois que je ne suis pas pres de faire quelque chose de potable...
 
Faudrait que je sache deja si ma conversion est sur 8 bits ou 10 bits...
 
 :cry: je fais comment mouah.... fo que je cherche...
 
Bon week end  
 

n°7463
RISC
Posté le 24-06-2007 à 16:07:55  profilanswer
 

Bonjour,
 
Rien ne vaut une bonne lecture de la datasheet pour comprendre comment programmer le micro :
http://ww1.microchip.com/downloads [...] 30487c.pdf
 
Pour le CAN, tu lis la page 115, chapitre 12 ( Registre ADCON1 ).
C'est dans ce registre que tu spécifies la justification à gauche ou à droite ;=)
 
Par contre tu ne peux pas choisir le format (8 bits ou 10 bits).
C'est automaquement sur 10 bits, mais....il y a une astuce simple si tu ne veux utiliser que 8 bits :
tu choisis la justification à gauche et tu n'utilises QUE le registre ADRESH (qui contient les 8 bits de poids fort = les + significatifs) et tu ignores ADRESL qui contient les 2 bits les - significatifs.
 
a+


Message édité par RISC le 24-06-2007 à 16:09:00
n°7473
tinbo
Ok Lah...
Posté le 26-06-2007 à 09:35:09  profilanswer
 

Merci RISC and DR,
 
C'est deja beaucoup beaucoup plus clair maintenant...
 
De tout facon je le verrais bien lorsque j'aurais finis mon support pour programmer ma PIC...
 
EN ce moment la ou je coince c'est au niveau de la valeur moyenne, je voudrais calculer la valeur moyenne de 5 resultats de la conversion CAN avant de l'envoyer ds une trame pour le port serie...
 
Le principe parait simple, je stocke ces 5 valeurs ds un tableau et je calcule la valeur moyenne...
 
Mai je ne trouve que des exemples de calculs de valeur a partir de donnees rentrees a la main... :??:

n°7474
Deadog
Dain Bramaged
Posté le 26-06-2007 à 11:35:50  profilanswer
 

Code :
  1. #define NB_MEAN_VALUE 5
  2. void ta_fonction_qui_acquiert (void) {
  3.   // La définition d'une variable static à l'intérieur d'une fonction permet de garder en mémoire la valeur de la variable entre chaque appel de la fonction
  4.   static int tab[NB_MEAN_VALUE];
  5.   static char index=0;
  6.   // acquisition et tout le tralala
  7.   tab[index++] = resultat_ADC();
  8.   // Si on a acquerir les NB_MEAN_VALUE valeur, on calcul et on envoie la moyenne
  9.   if(index >= NB_MEAN_VALUE) {
  10.     // On a le droit de définir de nouvelle variable au début de chaque bloc (bloc = { ... }), et pas seulement au début des blocs de fonctions
  11.     int moyenne=0;
  12.     char i;
  13.     for(i=0 ; i < NB_MEAN_VALUE ; i++)
  14.       moyenne += tab[i];
  15.     moyenne /= NB_MEAN_VALUE;
  16.     envoie_trame_moyenne (moyenne);
  17.     index = 0; // On remet l'index du tableau de valeur à 0 pour recommencer un nouveau cycle la prochaine fois qu'on appel la fonction
  18.   }
  19. }
 


en gros


Message édité par Deadog le 26-06-2007 à 11:41:33

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°7475
tinbo
Ok Lah...
Posté le 26-06-2007 à 12:11:51  profilanswer
 

Merci Deadog,
 
Euh d apres toi c'est une explication en GROS... :sweat:  
 
Bon doit aller acheter du doliprane...
 
Merci en tt cas de ton aide...
 
je vais essayer de comprendre...
 
Pour me foutre encore la haine, en combien de temps tu l'as tape ?? :fou:

n°7476
Dr Lous
I see old password
Posté le 26-06-2007 à 12:14:45  profilanswer
 

tinbo a écrit :

Merci Deadog,
 
Euh d apres toi c'est une explication en GROS... :sweat:  
 
Bon doit aller acheter du doliprane...
 
Merci en tt cas de ton aide...
 
je vais essayer de comprendre...
 
Pour me foutre encore la haine, en combien de temps tu l'as tape ?? :fou:


 
 
depuis quand il prog et toi depuis quand tu prog... :)
tu t'amelioreras quand tu prog depuis un ptit moment touSSa :)

n°7477
tinbo
Ok Lah...
Posté le 26-06-2007 à 12:32:49  profilanswer
 

DR... OUI OUI... mais bon... :cry:  
 
sur ce il faut que je decode son code... :jap:  
 
Merci a vous deux !! :hello:

n°7478
Deadog
Dain Bramaged
Posté le 26-06-2007 à 13:26:10  profilanswer
 

dans un sens j'ai pas était sympa, et dans un autre c'est pour ton bien ;)
 
j'ai volontairement utiliser des trucs qu'on voit pas au début du C mais qui sont tout à fait abordable par les débutants à mon avis (à savoir variable static dans les fonction, macro #define, et notion de bloc).
Je dirais même que la notion de bloc est ce qui devrait être appris parmit les premiers trucs en C, j'ai jamais comprit pkoi les livres et les tutorials passaient dessus :/
 
et pour répondre à ta question, ça a du me prendre 5-10 min, mais c'est surtout les commentaires qui sont long ;)
 
en tout cas essaye de retenir la technique de la variable static, ça permet d'éviter d'abuser des variables globales ;)


Message édité par Deadog le 26-06-2007 à 13:26:50

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°7480
tinbo
Ok Lah...
Posté le 27-06-2007 à 04:44:31  profilanswer
 

Bon en tout cas pour la enieme fois merci...
 
Il est vrais que les cours pour debutant ne sont pas forcement tres intelligemment fait...  
 
Je trouve que le fosse entre le facile et le moyen est un peu grand... et comme tu dis on ne trouve pas au debut les vrai outils pour se simplifier la vie...
 
 :hello:

mood
Google
Posté le 27-06-2007 à 04:44:31  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Microcontrolleur &co


  convertisseur analogique numerique trame NMEA

 

Hit Parade