|
Проблема с термопарой, ... или с АЦП ? |
|
|
|
Aug 7 2010, 12:11
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(sensor_ua @ Aug 7 2010, 14:44)  Так сколько показывает? И какое напряжение сигнала термопары? Насчёт целочисленной арифметики - как минимум не понял насчёт VREF - оно осталось вещественным или как? Забыл написать Код #define VREF 2500000LL // VREF = +2.5 V Цитата(Tanya @ Aug 7 2010, 14:11)  Вот на него и выводите регистры АЦП. Объясните, пожалуйста, каким образом вывести значение 24-битного регистра в 4-разрядный индикатор? Лучше уж подкличить UART, тогда все станет понятно. Я сейчас этим и занимаюсь.
|
|
|
|
|
Aug 7 2010, 13:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Самое простое, если у Вас 8-и-сегментные индикаторы(8 и точка) - выводить по биту целого на сегмент - да не цифры, а козявки, но инфы достаточно Посмотрел ещё раз на Ваш вариант целого - думаю, что без long long переполнение обеспечено. При сигнале 3 мВ код АЦП в идеале должен быть 9677098 (0x93A92A) (AdcValue - STEPS_B)*VREF = 3.221225E+12 (0x 2EDFFF8CC40) 0хFFF8CC40>>30 = 0x03 Но Вы написали Цитата Код #define VREF 2500000LL // VREF = +2.5 V Может, препроцессор лажанулся и пересчитал и подставил VREF >> (AD7799_128_GAIN + BITS - 1) ? Тогда будет ноль. Скобками можно это проверить
--------------------
aka Vit
|
|
|
|
|
Aug 7 2010, 14:42
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(sensor_ua @ Aug 7 2010, 16:15)  Посмотрел ещё раз на Ваш вариант целого - думаю, что без long long переполнение обеспечено. Может, препроцессор лажанулся и пересчитал и подставил VREF >> (AD7799_128_GAIN + BITS - 1) ? Я очень сомневаюсь, что компилер будет игнорировать порядок выполнения арифметических операция и правила приведения типов, которые описаны в любом учебнике по С/С++. Согласно общепринятым правилам, выполняются вначале выражения в скобках, затем слева направо учитывая приоритет операций. Когда результат вычитания (ADC_Value - STEP_B), который имеет тип long , умножается на VREF, имеющий тип long long, то первый операнд приводится к типу long long. Операция >> имеет меньший приоритет, чем *. Это даже не стоит проверять.
|
|
|
|
|
Aug 7 2010, 15:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Насчёт long long Вы написали всё правильно и я на это обратил внимание (правда не сразу, потому и редактировал пост добавлением). Цитата Я очень сомневаюсь, что компилер будет игнорировать порядок выполнения арифметических операция и правила приведения типов, которые описаны в любом учебнике по С/С++. Я ясно написал, что возможно проблема у препроцессора, но если бы Вы всё-таки чётко выдали нагора то неправильное число, то и гаданий было бы меньше. А приоритет операций кроме арифметических  , представьте себе, никогда не запоминал и не собираюсь, ибо не на одном Си свет клином сошёлся. Потому если мне надо, то смотрю не учебник, а справочник. И не стесняюсь. В данном случае выдал предположение насчёт возможного нарушения обработки из-за наличия не переменных или констант в последовательной записи , а только литералов. Вам помочь пытаюсь, а Вы одно число выдать боитесь  Ещё у Вас есть усреднение. Интересно было бы узнать значение Value.Average // (1 << NMAX) на предмет опять же переполнения Result.Data[Result.Channel].
--------------------
aka Vit
|
|
|
|
|
Aug 8 2010, 05:13
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Подключил UART. Отдельная плата с MAX232, соединяется через 4 проводка: общий, +5В, RXD, TXD. В программу добавил драйвер UART, которым всегда пользуюсь. Но почему-то всегда передает 0x00, чтобы я не посылал. Какое-то проклятие!!! Сейчас вывожу на 7-сегм индикатор значение напряжения в микровольтах, значение int. При правильном включении ТП показывает значение -1.5 ... -1.7 мВ. ТП прикладываю к горячему. Показания не меняются. Но если подключить неправильно ТП ("-" ТП на AIN1+ ) , то значения меняются по температуре, но в отрицательную область! Я уже все больше склоняюсь к мысли, может просто убрать этот минус и пусть работает так? Но все же этому должно быть какое-то простое объяснение. PS. Значение Value.Average = 4, и это нее приведет к переполнению. PS2. Это ж надо так было облажаться!!! Код // Read from data register, it should be previously requested from ad7799_request_data, the value is signed //------------------------------------------------------------------------------ unsigned long ad7799_ReadData() { unsigned long val = 0;
.................. Нужно возвращать значение типа long !. Главное, что в шапке функции я об этом специально написал  Все теперь работает. Спасибо.
|
|
|
|
|
Aug 10 2010, 07:38
|

Гуру
     
Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271

|
Цитата(MrYuran @ Aug 6 2010, 03:32)  Что-то мне кажется, что не должно АЦП мерить напряжение выше опоры. Полностью поддерживаю! Это следует из принципа работы АЦП, где опора на делителе делится на много-много ответвлений, а потом происходит сравнение. Цитата(alux @ Aug 6 2010, 12:57)  Покажите, пожалуйста, в даташите, где сказано о том, что напряжение на входе не должно превышать опорное? Тогда разность напряжений не должна превышать опору. А вообще, насколько я разбирался с АЦП в Attiny (это конечно не одно и то же), то биполярный режим - это всего лишь способ представления данных: со знаком минус или без знака. А Цитата измерение напряжения на положительном входе относительно отрицательного входа АЦП - это дифференциальный режим измерений, с биполярным не связанный. Другими словами, дифференциальность производится аналогово (вычитанием на входном ОУ), а биполярность делается в цифре - смещением нуля по шкале. И это совершенно независимые параметры.
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
|
Aug 10 2010, 14:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Полностью поддерживаю! Это следует из принципа работы АЦП АЦП бывают разных видов. Как и их входные каскады. В данном случае Вы и MrYuran ошибаетесь Вот выдержка из DS AD7799: The AD7798/AD7799 can be programmed to have a gain of 1, 2, 4, 8, 16, 32, 64, or 128 using Bit G2 to Bit G0 in the configuration register. Therefore, with a 2.5 V reference, the unipolar ranges are from (0 mV to 19.53 mV) to (0 V to 2.5 V), and the bipolar ranges are from ±19.53 mV to ±2.5 V. When the in-amp is active (gain ≥ 4), the common-mode voltage (AIN(+) + AIN(−))/2 must be greater than or equal to 0.5 V. If the AD7798/AD7799 operate with a reference that has a value equal to AVDD, the analog input signal must be limited to 90% of VREF/gain when the in-amp is active for correct operation. BIPOLAR/UNIPOLAR CONFIGURATIONThe analog input to the AD7798/AD7799 can accept either unipolar or bipolar input voltage ranges. A bipolar input range does not imply that the parts can tolerate negative voltages with respect to system GND. Unipolar and bipolar signals on the AIN(+) input are referenced to the voltage on the AIN(–) input. For example, if AIN(−) is 2.5 V and the ADC is configured for unipolar mode and a gain of 1, the input voltage range on the AIN(+) pin is 2.5 V to 5 V. If the ADC is configured for bipolar mode, the analog input range on the AIN(+) input is 0 V to 5 V. The bipolar/unipolar option is chosen by programming the U/B bit in the configuration register.
--------------------
aka Vit
|
|
|
|
|
Aug 11 2010, 04:15
|

Гуру
     
Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271

|
Цитата(sensor_ua @ Aug 10 2010, 21:45)  АЦП бывают разных видов. Как и их входные каскады. В данном случае Вы и MrYuran ошибаетесь Вот выдержка из DS AD7799: The AD7798/AD7799 can be programmed to have a gain of 1, 2, 4, 8, 16, 32, 64, or 128 Cогласен, я забыл о наличии усиления перед непосредственно аналого-цифровым преобразованием. Таким образом, все мои утверждения справедливы для сигнала непосредственно перед АЦП, уже после усиления. В любом случае, автору необходимо не забывать про такую цитату: Цитата A bipolar input range does not imply that the parts can tolerate negative voltages with respect to system GND.
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|