|
 
|
|
Home Page |
| Домашня сторінка |
AD7792 / AD7793 для измерения температуры с помощью термопары (ТХА). Управление с помощью PIC16F628A
Крушневич С.П..
ВВЕДЕНИЕ.
Возникла необходимость в измерении температуры в трех точках термопарами.
Учитывая положительный опыт в работе с AD7792 (измерение сопротивления) и наличие 3х дифференциальных входов, я выбрал ее для измерения температуры.
В качестве датчиков температуры использовались термопары ТХА (Хромель-Алюмель, за бугром е еще называют "K-тип"), но могут быть использованы и другие типы термопар.
AD7792, AD7793 - это не только АЦП
Если присмотреться внимательнее, то микросхема AD7792 представляет целый набор компонентов:
- 16-ти битный АЦП (24 бита у AD7793), [ADC].
- Встроенный операционный усилитель с коэффициентом усиления от 1 до 128 (значения кратны 2^n), [IN-AMP].
- Встроенный источник тока (10, 210 или 1000 мА) - 2 шт с малым разбросом параметров (между собой) не выше +/-0.5%, [Iout]
- Встроенный датчик температуры
- Встроенный источник напряжения (1/2 напряжения питания) для подтяжки отрицательного вывода АЦП (пригодится в схеме с термопарами), [Vbias]
- Встроенный тактовый генератор, [INTERNAL CLOCK]
- Встроенный источник опорного напряжения (1.17 +/- 0.01% В)
- Функция измерения напряжения питания
- Миниатюрный SMD корпус TSSOP-16 (может кому это и плюс, но мне с обычным паяльником, пришлось напрячся)
- Напряжение питания 2.7...5.25В
- Частота измерения от 4.17 до 470 в секунду.
- Цифровой интерфейс связи - SPI
Остальные характеристике смотрите в официальной документации.

AD7792 + PIC16F628A
Схему измерения было решенно установить поближе к датчикам, поэтому на одной плате с AD7792 расположился и недорогой микроконтроллер PIC16F628A, который выполняет весть необходимый обмен данными с АЦП по интерфейсу SPI и передает результаты измерения (по запросу) по каналу RS485 (используется встроенный UART).

Нажмите для увеличения
Как видно, схема получилась весьма простая. Температура холодных спаев измеряется встроенным в микросхему датчиком температуры.
Ниже приведены участки программного кода для управления АЦП. Подробности настроек смотрите в документации на АЦП.
Исходники для микроконтроллера PIC16F628A
Начальная инициализация АЦП:
SendSPI(0xFF,8);
SendSPI(0xFF,8);
SendSPI(0xFF,8);
SendSPI(0xFF,8);
delay_ms(1);
while(Din==1);
SendSPI(0b00101000,8);
delay_us(5);
SendSPI(0b00000000,8);
Выбор канала АЦП:
void ADC_configure_chanel(unsigned char Ch)
{
SendSPI(0b00010000,8);
delay_us(5);
if (Ch==1) SendSPI(0b0100111010010000,16);
if (Ch==2) SendSPI(0b0100111010010001,16);
if (Ch==3) SendSPI(0b0100111010010010,16);
if (Ch==4) SendSPI(0b0100111110010110,16);
delay_us(5);
}
Самокалибровка:
void ADC_Calibrate(void)
{
SendSPI(0b00001000,8);
delay_us(5);
SendSPI(0b1000000000001111,16);
while(Din==1);
SendSPI(0b00001000,8);
delay_us(5);
SendSPI(0b1010000000001111,16);
while(Din==1);
delay_us(5);
}
Запуск непрерывного преобразования:
void ADC_Start_Continuous_Conversion_Mode(void)
{
SendSPI(0b00001000,8);
delay_us(5);
SendSPI(0b0000000000001111,16);
delay_us(5);
}
Чтения результатов преобразования из АЦП:
signed int16 ADC_Read_Data(void)
{
while(Din==1);
SendSPI(0b01011000,8);
delay_us(5);
return ReadSPI(16);
}
Перевод АЦП в ждущий режим:
void ADC_Shut_Down(void)
{
SendSPI(0b00001000,8);
delay_us(5);
SendSPI(0b0100000000001111,16);
delay_us(5);
}
Главная функция получения температуры:
void RefreshAllData(void)
{
float T4f;
ADC_configure_chanel(1);
ADC_Calibrate();
ADC_Start_Continuous_Conversion_Mode();
delay_ms(250);
T1_RAW=ADC_Read_Data()-0x8000;
ADC_configure_chanel(2);
ADC_Calibrate();
ADC_Start_Continuous_Conversion_Mode();
delay_ms(250);
T2_RAW=ADC_Read_Data()-0x8000;
ADC_configure_chanel(3);
ADC_Calibrate();
ADC_Start_Continuous_Conversion_Mode();
delay_ms(250);
T3_RAW=ADC_Read_Data()-0x8000;
if (NeedT4refresh++>10)
{
NeedT4refresh=0;
ADC_configure_chanel(4);
ADC_Calibrate();
ADC_Start_Continuous_Conversion_Mode();
delay_ms(255);
T4_RAW=ADC_Read_Data();
ADC_configure_chanel(1);
delay_s(3);
}
Благодаря тому, что все каналы АЦП выполены на одном кристалле, в одном технологическом процессе,
они имеют очень близкие характеристики, что позволяет использовать одну функцию для преобразования
"отсчеты АЦП" - "температура".
Учитывая, что в решаемой задаче высокая точность измерений не требуется, компенсация температуры холодного спая выполнялась просто приплюсовкой температуры холодного спая к температуре горячего спая.
Это дало приемлемую точность в рабочем диаппазоне температур (от 20 до 350 градусов Цельсия).
Проверка встроенного датчика темперы показала его высокую линейность в диапазоне от -16 до +30 градусов (в этих пределах выполнялось тестовые измерения).
Точных данных я не привожу, так как для калибровки использовался самый обычый китайский цифровой мультиметр с функцией измерения температуры, у которого разрешающая способность 1 градус. По показаниям прибора отклонение температуры от измеренного мультиметром не превышала 1 градус (опять же: индикация с разрешением в 1 градус).
Выполнив тщательную калибровку можно получить и более высокую точность, но ввиду малого времени на разработку и отсуствие более точных измерительных приборов более тонкая калибровка не выполнялась.