|
Вычисления с помощью макросов, Проблема с выводом значения в реальном времени |
|
|
|
Mar 25 2008, 18:00
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Вывожу на ЖКИ 24-битное значение adc_value АЦП с периодом 1 сек. Это значение используется для вычисления дифференциального давления, которое вычисляется по формуле. Если попытаться выводить сразу в пересчитанное значение дифф. давления, то возникает проблема (виснет программа), хотя по идее макрос заменяется своим определением во время работы препроцессора, поэтому не вызывает затрат времени. И стек не должен потреблять на мой взгляд. Код #define Vref 5.0 #define GAIN 64.0 // Gain #define STEPS_B 8388608.0 // Full-Scale 2^(24-1) for bipolar operation #define SPAN 16.7 // Span (mV) of Pressure Sensors = 1 psi #define mm_Hg 51.714 // мм. рт. ст. (@ 0 гр. C)
#define Vin(adc_value) (((((adc_value)/STEPS_B) - 1.0)*Vref)/GAIN)
diffPressure = (Vin(adc_value)/SPAN)*mm_Hg; Почему так происходит? Как мне выводить значение давления в реальном времени? Это работает под управлением ОС (scmRTOS).
|
|
|
|
|
 |
Ответов
|
Mar 25 2008, 18:54
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(alux @ Mar 25 2008, 21:00)  Вывожу на ЖКИ 24-битное значение adc_value АЦП с периодом 1 сек. Это значение используется для вычисления дифференциального давления, которое вычисляется по формуле. Если попытаться выводить сразу в пересчитанное значение дифф. давления, то возникает проблема (виснет программа), хотя по идее макрос заменяется своим определением во время работы препроцессора, поэтому не вызывает затрат времени. И стек не должен потреблять на мой взгляд. Код #define Vref 5.0 #define GAIN 64.0 // Gain #define STEPS_B 8388608.0 // Full-Scale 2^(24-1) for bipolar operation #define SPAN 16.7 // Span (mV) of Pressure Sensors = 1 psi #define mm_Hg 51.714 // мм. рт. ст. (@ 0 гр. C)
#define Vin(adc_value) (((((adc_value)/STEPS_B) - 1.0)*Vref)/GAIN)
diffPressure = (Vin(adc_value)/SPAN)*mm_Hg; Почему так происходит? Как мне выводить значение давления в реальном времени? Это работает под управлением ОС (scmRTOS). для начала, напишите что константы у Вас float, типа: #define Vref 5.0f не знаю какого типа у Вас adc_value, но я бы преобразовал тип: (float)adc_value ну и в формуле возможно ошибка(???), при вычитании 1.0 у Вас всегда будет отрицательное значение
|
|
|
|
|
Mar 25 2008, 19:10
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(singlskv @ Mar 25 2008, 22:54)  ну и в формуле возможно ошибка(???) В формуле ошибки нет. Проверял в симуляторе подстановкой крайних значений 0х000000 (отрицательное значение) и 0хffffff(положительное значение). Нулевое значение соответствует значению АЦП 0x800000. adc_value имеет тип unsigned long. Цитата(singlskv @ Mar 25 2008, 22:54)  при вычитании 1.0 у Вас всегда будет отрицательное значение Vin = (2-1)*Vref/Gain - это соответствует крайнему положительному напряжению. Vin = (0-1)*Vref/Gain - это соответствует крайнему отрицательному напряжению. Цитата(singlskv @ Mar 25 2008, 22:54)  для начала, напишите что константы у Вас float, типа: #define Vref 5.0f Не помогло. Цитата(meister @ Mar 25 2008, 22:49)  diffPressure = (Vin(0)/SPAN)*mm_Hg; Тоже виснет? Так не виснет. И что?
|
|
|
|
|
Mar 25 2008, 22:14
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(alux @ Mar 25 2008, 22:10)  В формуле ошибки нет. Проверял в симуляторе подстановкой крайних значений 0х000000 (отрицательное значение) и 0хffffff(положительное значение). Нулевое значение соответствует значению АЦП 0x800000. adc_value имеет тип unsigned long. Vin = (2-1)*Vref/Gain - это соответствует крайнему положительному напряжению. Vin = (0-1)*Vref/Gain - это соответствует крайнему отрицательному напряжению. да, это я протормозил, не заметил что Вы делили на 2^(24 -1 ) Цитата Не помогло. А Вы везде заменили ? и в (((((adc_value)/STEPS_B) - 1.0 )*Vref)/GAIN) тоже ? перед adc_value (float) ставили ? покажите минимальный код в котором есть проблема...
|
|
|
|
Сообщений в этой теме
alux Вычисления с помощью макросов Mar 25 2008, 18:00 meister diffPressure = (Vin(0)/SPAN)*mm_Hg;
Тоже виснет? Mar 25 2008, 18:49   alux Цитата(singlskv @ Mar 26 2008, 02:14) А В... Mar 26 2008, 07:22  meister Цитата(alux @ Mar 25 2008, 22:10) Так не ... Mar 26 2008, 04:38 rezident alux, у вас оптимизация при компиляции используетс... Mar 25 2008, 22:39 tag Цитата(alux @ Mar 25 2008, 21:00) Вывожу ... Mar 26 2008, 08:46 alux Цитата(tag @ Mar 26 2008, 12:46) ...а вы ... Mar 26 2008, 09:20  tag Цитата(alux @ Mar 26 2008, 12:20) В симул... Mar 26 2008, 10:50   alux Цитата(tag @ Mar 26 2008, 14:50) ...а вси... Mar 26 2008, 13:28    tag Цитата(alux @ Mar 26 2008, 16:28) Из него... Mar 27 2008, 06:16     alux Цитата(tag @ Mar 27 2008, 10:16) Если adc... Mar 27 2008, 06:45      Сергей Борщ Цитата(alux @ Mar 27 2008, 08:45) Если пе... Mar 27 2008, 10:28       alux Цитата(Сергей Борщ @ Mar 27 2008, 13:28) ... Apr 8 2008, 10:42        Сергей Борщ Цитата(alux @ Apr 8 2008, 13:42) Здесь вы... Apr 8 2008, 15:15 alux В общем, сделал так:
Код#define Kp (Vref*mm_... Mar 27 2008, 10:59 Сергей Борщ Цитата(alux @ Mar 27 2008, 12:59) Здесь а... Mar 27 2008, 14:18  alux Цитата(Сергей Борщ @ Mar 27 2008, 18:18) ... Mar 27 2008, 15:35   Сергей Борщ Цитата(alux @ Mar 27 2008, 17:35) И, соот... Mar 27 2008, 16:39  alux Цитата(Сергей Борщ @ Mar 27 2008, 18:18) ... Mar 27 2008, 18:22   IgorKossak Цитата(alux @ Mar 27 2008, 20:22) PS. Вко... Mar 27 2008, 20:43    alux Цитата(IgorKossak @ Mar 28 2008, 00:43) Р... Mar 28 2008, 05:24 alux На этот раз стек здесь ни при чем. Проблема была в... Mar 29 2008, 19:45 alux И еще один маленький, но очень большой вопрос.
Как... Apr 9 2008, 08:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|