2009-02-26 9 views
3

Je développe un dispositif de mesure de pression. J'ai utilisé la puce MSP430F133 et l'utilisation de IAR embedded workbench. Il montre la pression dans 3 unités différentes.MSP 430 valeurs erronées affichées

Je prends 32 échantillons et en moyenne. La sélection de l'unité sur P5, en fonction de la valeur de sortie sélectionnée par l'unité, est calculée et affichée sur l'écran LCD.

Maintenant, une unité "IN WC" montre une valeur moyenne d'entrée binaire, juste pour l'analyse.

Le problème: en unités de valeurs par défaut (MM WC) affichent correctement, mais dans une situation de test lorsque la pression est relâché, il descend et lire LCD comme ci-dessous

+31.8 
+31.7 
+31.6 
+31.5 
+31.4 
+31.3 
+31.2 
+31.2 
+31.1 
+31.5 (wrong reading randomly between *.4 to *.7) 
+30.9 

Comme vous pouvez il y a une valeur erronée est affiché, je ne suis pas en mesure de comprendre la raison.

+0

Vous devez isoler le problème. Commencez par envoyer les valeurs ADC brutes à l'écran, puis utilisez quelque chose comme Excel pour effectuer la conversion et vérifier les valeurs. Si vous avez de la place sur l'affichage, affichez les valeurs adc et caculated. Toutes les constantes ou variables que vous utilisez également. –

+0

La source n'est plus disponible. – eaanon01

Répondre

1

Cela semble louche, le || devrait probablement être & &:

 for (i=0; i<= 3||res[i]!='\0'; i++) 

Mais je ne vois pas comment il cause votre problème.

En outre, vous devez nettoyer et simplifier votre code. Comme c'est il est très difficile à lire.

4

Dans le code ci-dessous ptiveValue = valeur et d1 = valeur si d2 est toujours 0 alors dans votre boucle vous avez pour (i = 0; i < = 3 || res [i]! = '\ 0'; i ++) qui devrait être (i = 0; i < = 3 & & res [i] = '\ 0';! i ++) il imprime toujours ce qui a été laissé dans la mémoire tampon pas ce que vous voulez

Code Bad:

if (cntd <= 4) 
{ 
    d2 = (unsigned int) abs((ptiveValue - d1) * 10000); // get 4 digits of real part 
    itoa1(d2, res, &cntreal); 
    for (i=0; i<= 3||res[i]!='\0'; i++) 
    { 
     wr_lcd_dr(res[i]); 

    } 
} 

Code fixeVous écrasez également votre tampon et vous créez peut-être un comportement bizarre.

unsigned short Adcinb[32]; 
for (i = 0; i <= 63; i++) 
Adcinb[i] = 3180; 

devrait être

unsigned short Adcinb[32]; 
for (i = 0; i < 32; i++) 
Adcinb[i] = 3180; 
+0

Il écrase l'autre mémoire, qui peut ou non donner ce résultat, mais cela n'arrive qu'une fois au début du programme. Quelque chose qui doit certainement être corrigé, mais probablement pas la source du problème ... –

+0

Depuis le MSP430 n'a pas une pile ou un tas pour la mémoire qui sait variable, il clobber. Mais je suis d'accord probablement pas source de problème. –

+0

Certaines variantes de MSP430 ont des tampons/piles. – Sharique

0

dessus votre code, je ne vois aucune raison particulière que vous obtiendriez cette valeur à moins qu'elle reflète les valeurs réelles étant détectées.

Pouvez-vous exécuter le programme et afficher chacune des 32 valeurs avant de faire la moyenne pour le numéro qui a le problème, le numéro qui le précède et le numéro qui le suit?

Alternativement, écrivez le nouvel échantillon chaque fois que vous obtenez un échantillon et donnez-nous ces données.

-Adam

2

Malheureusement, aucun des deux liens vers le code source fonctionne plus. Mais d'après ce que je peux voir, la cause pourrait être le fait que le dernier chiffre 'correct' attendu à cet endroit est un zéro. Ma conjecture est quelque part dans le code de calcul ou de visualisation que ce zéro est pris à tort comme une condition d'arrêt et fait apparaître un chiffre aléatoire à sa place. (seulement « 31 » est fourni à la sortie, mais 3 chiffres sont envoyés à l'affichage)

La question « || »/« & & » ci-dessus montre que le code est très direct et si cela est vrai pour le reste aussi, une mauvaise condition d'arrêt ici et une boucle de longueur fixe, il pourrait causer cela. Juste un «deviner» sauvage (TM) mais le meilleur que je peux donner sans connaître le code réel.

1

Je vais aller de l'avant et proposer une solution ADC 101 que vous pourriez essayer. Selon le type de capteur que vous utilisez, vous devrez peut-être effectuer votre propre découplage pour nettoyer vos lectures d'échantillon. Je me suis référé à cet article dans le passé et l'ai trouvé très utile pour apprendre cette technique: A Guide to De-bouncing by Jack G. Ganssle!

Comme je l'ai déjà dit, cela suppose que votre matériel nécessite un rebondissement, mais le guide devrait vous aider à l'identifier. Même si vous n'en avez pas besoin, vous pouvez le trouver intéressant, peu importe! Supplémentaire: Juste pour que vous sachiez la raison pour laquelle je vous suggère que vous avez mentionné que les lectures étaient inhabituelles lorsque la pression était libérée. Des erreurs de décoloration sont évidentes lors de l'échantillonnage lors de l'actionnement de commutateurs et de capteurs à base mécanique.

+1

J'ai juste pris tout ce temps pour répondre à une question de 2009 ... soupir ... – Fz3

Questions connexes