2009-02-26 4 views
3

Я разрабатываю устройство измерения давления. Я использовал чип MSP430F133 и использовал встроенный верстак IAR. Он показывает давление в трех разных единицах.MSP 430 неверные значения отображаются

Я беру 32 образца и усредняю ​​их. Выбор единицы измерения на P5, в зависимости от выбранного выходного значения, рассчитывается и отображается на ЖК-дисплее.

Теперь блок «IN WC» показывает двоичную усредненную шкалу ввода, только для анализа.

Проблема: в единицах по умолчанию (ММ WC) значения будут правильно отображаться, но в тестовой ситуации, когда давление сбрасывают он идет вниз и LCD читать ниже

+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 

Как вы можете есть одно неверное значение отображается, я не могу понять причину.

+0

Вам необходимо изолировать проблему. Сначала начните с отправки исходных значений ADC на дисплей, а затем используйте что-то вроде excel, чтобы выполнить преобразование и проверить значения. Если у вас есть место на дисплее, выведите как adc, так и caculated значения. Выводятся любые константы или переменные. –

+0

Источник больше не доступен. – eaanon01

ответ

1

Это выглядит подозрительно, || вероятно, должно быть & &:

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

Но я не вижу, как это вызывает проблемы.

Кроме того, вы должны очистить и упростить код. Как это очень трудно читать.

4

В приведенном ниже коде ptiveValue = значение и d1 = значение, так d2 всегда 0, то в цикле у вас есть для (I = 0;! Я < = 3 || Рез [я] = '\ 0'; я ++) , который должен быть для (I = 0, я < = 3 & & Рез [я] = '\ 0';! я ++) поэтому он всегда печатает то, что осталось в буфере не то, что вы хотите

Плохой код:

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]); 

    } 
} 

Исправлен код

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

Вы также переписываете свой буфер и, возможно, создаете странное поведение.

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

Должно быть

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

Он перезаписывает другую память, которая может или не может дать этот результат, но это происходит только один раз в начале программы. Что-то, что, безусловно, должно быть исправлено, но, вероятно, не является источником проблемы ... –

+0

Поскольку MSP430 не имеет стека или кучи памяти, которые знают переменную, он сбивается. Но я согласен, вероятно, не источник проблемы. –

+0

Некоторые варианты MSP430 имеют буфер/стек. – Sharique

0

Глядя на ваш код я не вижу каких-либо особых причин вы бы получить, что значение, если это не отражается фактические значения, воспринимаемого.

Можете ли вы запустить программу и вывести каждое из 32 значений перед усреднением для номера, имеющего проблему, номер перед ним и номер после него?

Альтернативно, выпишите новый образец каждый раз, когда вы получите образец и дадите нам эти данные.

-Adam

2

К сожалению, ни один из двух ссылок на исходный код работ больше. Но я вижу, что причиной может быть тот факт, что ожидаемая «правильная» последняя цифра в этом месте равна нулю. Мое предположение заключается в том, что где-то в коде вычисления или визуализации этот ноль ошибочно принимается за условие остановки и заставляет случайную цифру отображать на своем месте. (только «31» поступает на выход, но 3 цифры посылаются на дисплей)

«||»/«& &» вопрос выше показывает, что код не очень прямо вперед, и если это верно и для остальных, здесь неправильное условие остановки и цикл фиксированной длины могут вызвать это.

Просто «дикая догадка» (TM), но лучшее, что я могу дать, не зная фактического кода.

1

Я собираюсь предложить вам предлагаемое решение ADC 101, которое вы могли бы попробовать. В зависимости от типа используемого вами датчика вам может потребоваться выполнить собственное дебакание, чтобы очистить ваши показания. Я уже упоминал эту статью в прошлом и нашел ее очень полезной для изучения этой техники: A Guide to De-bouncing by Jack G. Ganssle!

Как я уже говорил, хотя это предполагает, что ваше оборудование требует отскока, но руководство поможет вам определить это. Даже если вы этого не требуете, вы можете найти это интересно независимо!

Дополнительное: Только поэтому вы знаете причину, по которой я предлагаю это, вы упомянули, что нечетные показания происходили, когда давление отпускалось. Ошибки отскока обнаруживаются при отборе проб при срабатывании механических переключателей и датчиков.

+1

Я просто взял все это время, чтобы ответить на вопрос с 2009 года ... вздох ... – Fz3