Аналогово-цифровой преобразователь, Температурный датчик с цифровым выходом — Разработка датчика для измерения вязкости жидкости нефтепродуктов

Rtd: что важно знать и учитывать

Изменение сопротивления типичного RTD типа PT100 (Рисунок 5) составляет менее 0.04 Ом на одну десятую градуса Цельсия, что при токе возбуждения 100 мкА соответствует уровню сигнала в 4 мкВ. В связи с этим особую важность для точности измерений приобретают низкие собственные шумы и смещение АЦП.

Исторически сложилось так, что логометрические измерения между сопротивлениями RTD и измерительного резистора выполнялись при помощи одного АЦП. В качестве опорного сигнала АЦП для измерения падения напряжения на RTD использовалось падение напряжения на измерительном резисторе.

Для такой архитектуры требуются измерительные резисторы сопротивлением 10 кОм и более, которые должны быть буферизованы для исключения падения напряжения от динамических входных токов АЦП. В связи с особым значением сопротивления измерительного резистора эти буферы должны иметь малые уровни смещения, дрейфа и собственных шумов.

Все это затрудняет реверс полярности источников тока, необходимый для компенсации присущих термопарам паразитных эффектов. Опорные входы сигма-дельта АЦП намного восприимчивее к шуму, чем остальные входы, а малые значения опорного напряжения могут привести к неустойчивости.

В архитектуре LTC2983 эти проблемы решены путем увеличения количества АЦП (Рисунок 6). В LTC2983 используются два точно согласованных буферизированных АЦП с автокалибровкой, один из которых обслуживает измерительный вход, а другой подключен к опорному входу.

RTD выпускаются в 2-, 3- и 4-проводных вариантах. К микросхеме LTC2983 можно подключать датчики всех трех типов, задав соответствующую аппаратную конфигурацию схемы. При этом с несколькими резистивными датчиками можно использовать один общий измерительный резистор.

Высокий входной импеданс микросхемы позволяет организовать внешнюю защиту цепей между входами RTD и АЦП без внесения ошибок. Имеется также возможность авторотации тока возбуждения для устранения внешних тепловых ошибок (паразитных термопар). В случаях, когда паразитное сопротивление вывода измерительного резистора ухудшает точность измерений, LTC2983 позволяет подключить резистор RSENSE по схеме Кельвина.

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

Когда RTD используется в качестве датчика холодного спая для термопары, три АЦП одновременно измеряют напряжение на термопаре, измерительном резисторе и RTD. Неисправности RDT учитываются в результатах измерения термопары, и температура RTD автоматически используется для компенсации температуры холодного спая.

(2)         ki 1 = (pi 1 / n) / m

N и M – числа, являющиеся степенями двойки; N – коэффициент инерции фильтра («если сигнал Х в какой-то момент изменил уровень, то каждое N раз измерений значение фильтра будет в e (2,718..) раз ближе к сигналу Х (грубо — на 63%)»)M же является коэффициентом увеличения разрядности (на сколько разрядов увеличиваем разрядность АЦП).

При этом операции с N и умножение с M мы можем проводить целочисленно, то есть сдвигом, а вот последнее деление на M делаем с плавающей точкой. При этом выполнять расчёт формулы (1) нужно каждый раз, когда мы получаем код АЦП (то есть, раз в 16 мс), а вот получать сглаженное значение – то есть выполнять трудоёмкое деление с плавающей точкой – достаточно по запросу.

Дальше будем переводить коды АЦП в градусы. Мы решили, что будем считать, что перевод линейный – то есть, нам нужны только угловой коэффициент и коэффициент сдвига; далее при необходимости мы просто умножаем сглаженное значение на одну константу и прибавляем другую (естественно, всё это нецелочисленное).

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

Путей решения этой проблемы несколько: во-первых, мы можем отказаться от кварца и переписать работу с часовым таймером; на освободившиеся ножки можно навесить какой-нибудь датчик температуры, который будет считывать температуру около платы. Таким датчиком, теоретически, может быть и всем известный ds1820, однако следует помнить, что 1-wire крайне требовательна ко времени (ссылка на статью), и при общении через этот протокол нужно запрещать прерывания – а значит, будут страдать как индикация на дисплее, так и «реакция» контроллера на нажатие на кнопки или вращение энкодера.

Помимо ds1820, можно использовать, например, терморезистор (однако у него нелинейная зависимость между сопротивлением и температурой);Ещё один вариант — хорошее, но дорогое решение – использование специальных усилителей с компенсацией холодного спая (например, AD8495).

Аналогово-цифровой преобразователь, Температурный датчик с цифровым выходом - Разработка датчика для измерения вязкости жидкости нефтепродуктов
Рисунок 4.Схема подключения термопары к операционному усилителю с компенсацией холодного спая.

В общем, на данный момент – пока проект считается учебным — решения с компенсацией холодного спая пока нет, но мы работаем над этим.Вернемся же к программе – попробуем сделать красивую реализацию считывания, усреднения кодов АЦП и перевод их в температуру.

Внимание! Наша программа становится достаточно большой, поэтому ей нужен больший объём стека! Увеличим его с стандартного «0x20» — 32 байт — до «0х40» — 64 байт, чтоб с запасом было. Настройки меняются в Project->Options.. (смотрите, чтобы в области «Workspace» был выбран не какой-нибудь конкретный файл, а весь проект)->General Options->System; меняем значение Data stack (CSTACK).

Заголовочный файл станет таким:

#ifndef ADC_TEMPERATURE_H
#define ADC_TEMPERATURE_H
#include "ioavr.h"
#include "inavr.h"
#include "stdint.h"

#define ADC_DEFAULT_ANGULAR_COEF 1
#define ADC_DEFAULT_OFFSET_COEF 0

typedef struct
{
  volatile uint8_t atOnNewADCValue;                                         //посылка о приходе нового значения АЦП
  //переменные для перевода значения температуры из кода АЦП в градусы (линейная аппроксимация)
  double atAngularCoef;
  double atOffsetCoef;
  volatile uint16_t atADCCurrValue;
  volatile uint16_t atADCAvgValue;
  volatile uint32_t atADCAccumulativeSum;
  double atCurrTemperature; 
} TADCTemperature;

extern TADCTemperature ADCTemperature; 

//инициализация АЦП
void ADCInit();
//прерывание по получению нового значения АЦП
#pragma vector = ADC_vect
__interrupt void GetADCValue(void);
//включение АЦП
void ADCOn();
//выключение АЦП
void ADCOff();
//получение нового значения температуры (записывается в структуру), возвращает 1 в случае успешного получения нового значения, и 0 - в случае ошибки
uint8_t ADCGetNewTemperatureValue();
//получение кода АЦП
uint8_t ADCGetNewCode();
#endif

Файл ADCTemperature.c:

#include "ADCTemperature.h"

//параметры АЦП-преобразования
const uint8_t ADCAvgDegree = 13;										//степень двойки у "усреднения" (наше N)
const uint8_t ADCExpansionDegree = 2;									//степень двойки у "расширения" (из 10-битного АЦП в 12-битное) (наше M)
const uint16_t ADCExpansionDivider = 4; //2ˆADCExpansionDegree

TADCTemperature ADCTemperature;

//инициализация АЦП
void ADCInit()
{
  ADCTemperature.atADCAccumulativeSum = 0;
  ADCTemperature.atADCCurrValue = 0;
  ADCTemperature.atADCAvgValue = 0;
  //АЦП инициализируется до определения коэффициентов из EEPROM!
  ADCTemperature.atAngularCoef = ADC_DEFAULT_ANGULAR_COEF;
  ADCTemperature.atOffsetCoef = ADC_DEFAULT_OFFSET_COEF;
  ADCTemperature.atCurrTemperature = 0;
  ADCTemperature.atOnNewADCValue = 0;
	__disable_interrupt();
	ADMUX = (1 << REFS0);                        			//источник опорного напряжения AVCC; несимметричный вход ADC0 (MUX4-0 = 0000); выравнивание результата по правому краю (ADLAR = 0) 
  ADCSRB = 0;                                              //режим непрерывного преобразования (ADT2-0 = 000)
  ADCSRA = (1 << ADEN)  | (1 << ADATE) | (1 << ADIE) |		//включили АЦП (но не запустили!); разрешили прерывание по получению значения;
           (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);     //выбрали предделитель частоты 128
	__enable_interrupt();
}

//включение АЦП
void ADCOn()
{
  ADCTemperature.atOnNewADCValue = 0;
  __disable_interrupt();
  ADCSRA |= (1 << ADSC) | (1 << ADATE);                     //запустили АЦП в режиме непрерывного преобразования
  __enable_interrupt();
}

//выключение АЦП
void ADCOff()
{
  __disable_interrupt();
  ADCSRA &= (˜((1 << ADSC) | (1 << ADATE)));
  __enable_interrupt();
}

//прерывание по получению нового значения АЦП
#pragma vector = ADC_vect
__interrupt void GetADCValue(void)
{
  uint8_t ADCHigh;
  uint32_t currSum;
	ADCTemperature.atADCCurrValue = ADCL;                      //сохранили результат
  ADCHigh = ADCH;
  ADCTemperature.atADCCurrValue  = (ADCHigh << 8);
  //считаем среднее 
  currSum = (ADCTemperature.atADCAccumulativeSum >> (ADCExpansionDegree   ADCAvgDegree));
  currSum  = ADCTemperature.atADCAccumulativeSum;
  ADCTemperature.atADCAccumulativeSum = (ADCTemperature.atADCCurrValue << ADCExpansionDegree) - currSum;
	ADCTemperature.atOnNewADCValue = 1;							//отправляем посылку, что есть новое значение АЦП
}


//получение нового значения температуры (записывается в структуру), возвращает 1 в случае успешного получения нового значения, и 0 - в случае ошибки
uint8_t ADCGetNewTemperatureValue()
{ 
  if (ADCTemperature.atOnNewADCValue)                          //если пришло новое значение АЦП
  {
    ADCTemperature.atOnNewADCValue = 0;
    __disable_interrupt();
    ADCTemperature.atADCAvgValue = ADCTemperature.atADCAccumulativeSum >> ADCAvgDegree;        //усредняем по формуле значение АЦП
    __enable_interrupt();
    //увеличиваем разрядность АЦП
    ADCTemperature.atCurrTemperature = (double)ADCTemperature.atADCAvgValue / ADCExpansionDivider;
    //вычисляем значение температуры по линейной формуле
    ADCTemperature.atCurrTemperature = ADCTemperature.atAngularCoef * ADCTemperature.atTemperatureValue  
                                        ADCTemperature.atOffsetCoef;
    return 1;
  }
  else
    return 0;
}

//получение нового значения температуры (записывается в структуру), возвращает 1 в случае успешного получения нового значения, и 0 - в случае ошибки
uint8_t ADCGetNewCode()
{
  if (ADCTemperature.atOnNewADCValue)                                           //если пришло новое значение АЦП
  {
    ADCTemperature.atOnNewADCValue = 0;
    __disable_interrupt();
    ADCTemperature.atADCAvgValue = ADCTemperature.atADCCurrValue;               //считываем реальное значение АЦП
    //ADCTemperature.atADCAvgValue = ADCTemperature.atADCAccumulativeSum >> ADCAvgDegree;        //считываем усредненное значение АЦП
    __enable_interrupt();
    return 1;
  }
  else
    return 0;
}

Добавляем в библиотеку семисегментного дисплея функцию отображения температуры:

//перевод числа с плавающей точкой в строку; точность - десятые доли; [-999.9; 9999.9]; занимает 6 символов, в конец '' не пишет
void DoubleThousandsWithTenthToStr(double Value, char* buff)
{
	uint16_t intValue, definitionNumbers;
	if (Value < 0)																//на первый сегмент пишем "-", если число отрицательно
	{
		buff[0] = '-';
    	intValue = (uint16_t)(Value * (-1));
		Value = Value * (-1);
	}
	else                                                                        //или сотни положительного числа, или просто " "
	{
    intValue = (uint16_t)Value;
    if (intValue >= 1000)
    {
      definitionNumbers = (intValue / 1000) % 10;														
      buff[0] = definitionNumbers   '0';
    }  
    else
      buff[0] = DispBlankSymbol;
	}
  if (intValue >= 100)
  {
    definitionNumbers = (intValue / 100) % 10;														
    buff[1] = definitionNumbers   '0';
  }  
  else
    buff[1] = DispBlankSymbol;
  //пишем десятки, если они есть, или пробел
	if (intValue >= 10)
  {
    definitionNumbers = (intValue / 10) % 10;														
	  buff[2] = definitionNumbers   '0';
  }  
	else
		buff[2] = DispBlankSymbol;
	buff[3] = intValue % 10   '0';												//записали единицы
	buff[4] = '.';
	buff[5] = ((uint16_t)(Value * 10)) % 10   '0';								//записали десятичные
}

//перевод числа с плавающей точкой в строку; точность - десятые доли; [-99.9; 999.9]; занимает 5 символов, в конец '' не пишет
void DoubleHundredsWithTenthToStr(double Value, char* buff)
{
	uint16_t intValue, definitionNumbers;
	if (Value < 0)																//на первый сегмент пишем "-", если число отрицательно
	{
		buff[0] = '-';
    	intValue = (uint16_t)(Value * (-1));
		Value = Value * (-1);
	}
	else                                                                        //или сотни положительного числа, или просто " "
	{
    intValue = (uint16_t)Value;
    if (intValue >= 100)
    {
      definitionNumbers = (intValue / 100) % 10;														
      buff[0] = definitionNumbers   '0';
    }  
    else
      buff[0] = DispBlankSymbol;
	}
  //пишем десятки, если они есть, или пробел
	if (intValue >= 10)
  {
    definitionNumbers = (intValue / 10) % 10;														
	  buff[1] = definitionNumbers   '0';
  }  
	else
		buff[1] = DispBlankSymbol;
	buff[2] = intValue % 10   '0';												//записали единицы
	buff[3] = '.';
	buff[4] = ((uint16_t)(Value * 10)) % 10   '0';								//записали десятичные
}

//отображение значения температуры на дисплее
void DisplayShowTemperatureValue(double Value)
{
	char buff[9];
  DoubleThousandsWithTenthToStr(Value, buff);                                   //перевели число
  //buff[5] = DispBlankSymbol;
  buff[6] = 'C';
  buff[7] = DispPointSymbol;
  buff[8] = 0;
	DisplayShowStr(buff);
}

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

А еще интересно:  Признаки неисправности датчика положения коленвала

Основной файл, функция main:

void main( void )
{
  DDRB = 0;
  PORTB = 0;
  DDRD = 0;
  PORTD = 0;
  DDRC = 0;
  PORTC = 0;
  
  DisplayInit();
  ADCInit();  
  
  FastTimerInit();
  DisplayShowHEX(0);
  ADCOn();
  while(1)
  {
    if (ADCGetNewTemperatureValue())                                           //если есть новое значение АЦП
    {
      DisplayShowTemperatureValue(ADCTemperature.atCurrTemperature);
    }
    __delay_cycles(8000000);
  }
}

Вот проект и прошивка.

Наверх

Автор — Moriam  =ˆˆ=

Обсудить на форуме

Аналоговые и дискретные величины (профессорам, академикам и вундеркиндам можно не читать)

Математику в школе изучали все. Поэтому обратимся к ней и проведем аналогии между аналоговыми и дискретными величинами и числами.

С точки зрения математики — аналоговая величина есть число вещественное, определенное в любой точке заданного отрезка числовой прямой.

Дискретная величина с точки зрения математики есть число целое. И определено оно только в определенных точках заданного отрезка числовой прямой.

На рисунке ниже схематично представлено расположение аналоговых и дискретных величин-чисел на числовой прямой.

Для примера рассмотрим отрезок числовой прямой от -4 до 3. Как видим, дискретных величин, обозначенных красными точками — целых чисел на нем всего 8 штук. Аналоговых величин, показанных зеленой линией на рисунке — бесконечное множество.

Например, у нас есть некая величина X, имеющая диапазон значений от 0 до 127. Если мы представляем эту величину как аналоговую, то теоретически мы можем представить ее с любой точностью — например 12.123455454980 или 126.00000000007 или вообще с миллионом знаков после запятой.

Но как только в дело вступает микроконтроллер и величина X обретает дискретное представление — то ни о какой «бесконечной точности» и речи идти не может даже теоретически. Точность ограничена числом двоичных разрядов, которое мы отводим под представление величины Х.

Например, мы возьмем 7 двоичных разрядов. В этом случае мы можем представить величину Х с точностью единица. То есть можно будет указать X=1 или X=112. А вот Х=112.5 уже указать не получится — разрядности не хватит.

Если мы возьмем для представления той же величины Х не 7, а 10 разрядов, то точность представления будет уже не единица, а 0.125. И в таком виде можно представить Х=95.125 или X=112.5. Но точнее, например в виде X=112.13 — уже представить эту величину нельзя.

Если вас смущает то, что я пишу дробные значения и при этом говорю о них как о целых числах то вспомните, что «дискретные точки» можно расставить на числовой прямой не через единицу, а например через 0.5 или 0.125 единицы. Но их как было, так и останется конечное значение на любом отрезке. И все свойства дискретной величины сохранятся.

Ключевое отличие дискретной величины от аналоговой — это то, что на любом конечном отрезке числовой прямой будет конечное число дискретных (целых) значений и бесконечное число значений аналоговых (вещественных).

В итоге всего выше сказанного получаем тривиальный вывод. Большая часть измеримых величин реального мира — аналоговые. Микроконтроллеры работают только с дискретными числовыми представлениями величин. Поэтому, прежде, чем обрабатывать какую-нибудь аналоговую величину с помощью микроконтроллера — эту величину необходимо представить в виде дискретной. Да еще и в двоичном виде.

Такое преобразование из аналогового представления в дискретное называется аналого-цифровым преобразованием.

Документация

Прежде всего, выразим сочувствие тем, кто хочет разбираться в тематике и не владеет английским… Практически вся документация в мире дается на английском языке. Поэтому незнание английского тут сильно затруднит жизнь. Впрочем, достаточно знать основные термины, чтобы понимать о чем речь.

, он делает многозначительную паузу «е — бай», хотя на самом деле оно читается «и-бай»). Ему вполне хватает знания терминов и четкого представления что где искать.

Тут я хочу дать основное представление о такой документации, что где искать, и немного помочь с терминами.

Берем мы, например, описание такого славного АЦП как ADS8320 Техасского инструментального завода Texas Instruments. Скачиваем PDF-ку и видим в ней много красивого. Сверху крупными буквами — об чем речь. И там уже есть масса информации: это 16-битное АЦП, работает в диапазоне от 2.7 до 5В.

На той же первой странице, как правило, есть «Features» — особенности изделия, чего оно может. Тут же обычно есть «Applications» — то, для чего оно может использоваться. И «Description» — краткое описание.

Далее по тексту обязательно надо найти «Absolute maximum ratings» — это те условия, при которых изделие работать будет, но при их малейшем нарушении бобик сдох и реанимации уже не подлежит. Это — самый важный блок информации, он дает понятие о тех условиях, в которых можно эксплуатировать датчик. И по ним надо сразу оценить — попадает ли ваш диапазон измерений в эти требования.

Тоже важно, но во вторую очередь — «Electrical characteristics», «Specifications», «Timing specifications». Это (как правило, длиннющая таблица на несколько страниц) — все остальные характеристики работы модуля. Тут его задержки, интерпретация входных воздействий и т. п.

И вот тут вы столкнетесь с такой неожиданностью. Почти любой параметр дается в виде «Min» (минимальное значение), «Typ» (типичное) и «Max» (максимальное значение). Дело в том, что мир не идеален, и каждый новый кристалл, микросхема имеют небольшие расхождения в параметрах.

А еще интересно:  Ремонт двс нива 21213 своими руками

Где-то далее в тексте всегда есть «theory of operation» — описание принципа функционирования и всяких хитростей. Это надо для четкого понимания работы устройства. Всегда тут же есть «Digital interface» — как оно взаимодействует с вашим микроконтроллером.

В конце описания почти всегда есть (а если нет — то дается ссылка в каком документе есть) «Mechanical data». Это варианты размеров корпусов, их схема. Тоже важно при заказе датчика — где-то рядом есть «Package type», «Device» с названием элемента для заказа.

Изучение динамических характеристик датчика температуры

Лабораторная работа № 2 по УТС

План лабораторной работы:

1. Изучение устройства и принципа работы датчика.
2. Схема подключения датчика в электрическую схему — транзисторный источник тока.
3. Изучение принципа работы измерительного комплекса на базе АЦП ZET 210 и интерфейса пользователя.
4. Подключение датчика к измерительному комплексу.
5. Получение динамической характеристики датчика при нагревании с ~20°С до 100°С.
6. Обработка результатов эксперимента. Определение передаточной функции датчика. Определение передаточного коэффициента и постоянной времени датчика.
7. Моделирование переходного процесса при нагревании датчика в MATLAB Simulink. Уточнение параметров передаточной функции.
8. Оформление отчета по лабораторной работе. Отчет должен содержать:
— схему подключения датчика к АЦП;
— экспериментально полученный график переходного процесса при нагревании датчика;
— передаточную функцию датчика и наложенные графики переходного процесса, полученные при моделировании и эксперименте.

Устройство и принцип работы датчика температуры охлаждающей жидкости автомобиля

Датчики 23.3828 и 27.3828 температуры охлаждающей жидкости (ДТОЖ) двигателя (рис. 1 и 2) предназначены для измерения температуры охлаждающей жидкости в выходном патрубке водяной «рубашки» головки цилиндров двигателя в составе системы управления двигателем совместно с блоком электронной системы управления двигателем (ЭСУД). Датчики применяются на автомобилях ВАЗ (рис. 3), оснащенных ЭСУД.

Основные технические характеристики датчиков приведены в таблицах 1 и 2.
Таблица 1

ХарактеристикаЗначение
Рабочее напряжение, В3,4±0,03
Сопротивление, Ом:
при 15 °С4033…4838
при 128 °С76,7…85,1
РезьбаМ12×1,5
Размер под ключS19
Масса, г30

Таблица 2

ХарактеристикаЗначение
Номинальное напряжение, В12
Диапазон измеряемых температур, °С (40…130)
Масса, г50

В основе работы этих датчиков лежит свойство проводников и полупроводников изменять свое сопротивление при изменении температуры. Терморезистор, расположенный внутри датчика, имеет отрицательный температурный коэффициент сопротивления, т.е. при нагреве его сопротивление уменьшается. При высокой температуре охлаждающей жидкости терморезистор имеет низкое сопротивление, а при низкой температуре — высокое сопротивление.

2. Схема подключения датчиков

При подключении датчиков данного типа к системе измерений необходимо обеспечить протекание через них тока с постоянным значением в диапазоне 1,0…1,5 А. В этом случае при изменении температуры падение напряжения на датчике будет прямо пропорционально его сопротивлению. В данной лабораторной работе для питания датчиков используется транзисторный источник тока (рис. 4 и 5). С помощью переменного резистора R1 и амперметра, подключенного последовательно с температурным датчиком R5, можно установить необходимое значение силы тока через датчик при различном напряжении питания. Через четырехштырьковый разъем (белого цвета) на источник тока подается напряжение питания 12 В, через двухклеммовый соединитель (зеленого цвета) подключается датчик. На этих же клеммах измеряется падение напряжения на датчике, которое может быть пересчитано в температуру. В автомобиле аналогичное питание датчиков обеспечивается блоком ЭСУД.

3. Измерительный комплекс на базе аналого-цифрового преобразователя ZET 210

Измерительный комплекс, используемый в данной лабораторной работе, состоит из:

1. Модуля аналого-цифрового преобразователя (АЦП) ZET 210, к которому подключается изучаемый датчик (рис. 6);
2. Ноутбука, связанного с АЦП по интерфейсу USB 2.0;
3. Программного обеспечения ZETLAB, обеспечивающего настройку АЦП, первичную обработку сигналов, их отображение и запись на жесткий диск.

Модуль АЦП ZET 210 предназначен для измерений параметров сигналов в широком частотном диапазоне (с частотой дискретизации до 500 кГц), поступающих с различных первичных преобразователей. Модуль имеет также цифровые и аналоговые выходы, которые могут использоваться в цепях управления различными исполнительными механизмами.

Основные технические характеристики модуля АЦП ZET 210 представлены на странице ZET 210 — измерительная лаборатория на ладони!.

Модуль АЦП ZET 210 работает совместно с программами из набора ZETLAB, запускаемыми на ноутбуке, подключенном к модулю по интерфейсу USB 2.0. Управление и запуск программ ZETLAB осуществляется при помощи панели управления программами ZETLAB (далее — панель ZETLAB). Для ее запуска используется ярлык ZETPanel на рабочем столе или главное меню Пуск → ZETLab → ZETPanel. Панель ZETLAB представляет собой горизонтальную панель, располагающуюся после запуска в верхней части экрана (рис 7).

В данной работе настройка модуля АЦП ZET 210 осуществляется с помощью команды панели ZETLAB Сервисные → Диспетчер устройств. В окне настройки свойств устройства необходимо установить частоту дискретизации 4000 Гц (рис. 8). В окне настройки свойств измерительного канала установить дифференциальное включение (рис. 9).

Просмотр данных в графическом виде возможен с использованием программы осциллографа, запускаемой из панели ZETLAB Отображение → Многоканальный осциллограф (рис. 10).

Основные настройки для программы осциллографа следующие (см. рис. 10): интервал — 200 с, частота — 4,0 Гц. С помощью кнопки Старт/Стоп начинается или завершается считывание данных с датчика и их отображение. С помощью кнопки Запись осуществляется сохранение данных, отображенных в виде графиков, во внешнем файле в текстовом виде.

4. Получение динамической характеристики датчика температуры

Динамическая характеристика датчиков 23.3828 и 27.3828 строится при скачкообразном изменении их температуры от комнатной до  100 °С. Это достигается при их резком опускании в кипящую воду. Можно считать, что такой вид воздействия соответствует ступенчатому воздействию. Подключение датчика к измерительной системе показано на рисунках ниже.

4.1. Порядок проведения эксперимента

1. Включить ноутбук, дождаться загрузки операционной системы.
2. Соединить проводами (см. рис. 11 и 12) модуль АЦП ZET 210, транзисторный источник тока, датчик и блок питания.
3. Подключить модуль АЦП ZET 210 к ноутбуку кабелем USB. Убедиться, что светодиодный индикатор питания горит зеленым светом.
4. Произвести настройку модуля АЦП ZET 210 (см. п. 3, рис. 8 и 9).
5. Включить блок питания.
6. Измерить и записать начальную температуру датчика, которая равна температуре окружающего воздуха.
7. Довести воду в специальной емкости до температуры кипения.
8. Запустить на ноутбуке программу «Многоканальный осциллограф».
9. Опустить датчик в емкость с кипящей водой и держать его там, пока не завершиться переходный процесс (около 1-ой минуты). Внимание! Во избежание получения ожогов данные операции необходимо проводить с осторожностью и в матерчатых перчатках.
10. При окончании переходного процесса нажать кнопку Стоп в программе «Многоканальный осциллограф». Затем нажать кнопку Запись и сохранить полученный график переходного процесса на диск.
11. Выключить блок питания и разобрать измерительную систему.

4.2. Обработка результатов эксперимента

Целью обработки результатов, полученных в результате эксперимента, является определение передаточной функции данного датчика. Так как температурный датчик характеризуется некоторой инерционностью, то для его описания удобно использовать передаточную функцию апериодического звена: W(p)=k/(Tp 1)

Обработку результатов удобно проводить в пакете MathCAD (рис. 13). Основные этапы обработки следующие:

  • чтение данных из файла с помощью функции READPRN и построение графика;
  • вычленение из полного графика участка с переходным процессом;
  • вычисление передаточного коэффициента k и постоянной времени датчика T.

Для более «тонкой» настройки параметров передаточной функции необходимо провести моделирование эксперимента в MATLAB Simulink (рис. 14 и 15). Подбором параметров передаточной функции необходимо добиться хорошего совпадения расчета с экспериментом.

Пару слов про систему управления

Немного теории для ответа на вопрос «а зачем нужны датчики???».

Много ли знает электропила о том, что она режет — дерево, метал, веревку?.. И как она режет — прямо, криво? И режет ли вообще — может, она в воздухе крутится? И не сгорел ли у нее движок — напряжение-то подается, но уже ничего не крутится?

А стоит ей добавить глаза — и все сразу станет понятно! Хотя потом к глазам надо добавить мозги…

Ну ладно, решим вопрос попроще. По поводу «сгорел ли движок» самое простое решение — поставить датчик тока. Ток течет — значит, потребление есть. А если еще знать текущее потребление, то мы можем уже понять: 1) пилится ли оно? 2) крутится с превеликим трудом?..

Вот так вот банальная электропила превращается в весьма умное устройство и начинает понимать, что происходит кругом. Или, говоря более корректно,

датчики позволяют узнать состояние окружающей среды

А еще интересно:  Лебедка на ниву в Москве: 39-товаров: бесплатная доставка [перейти]

. Под «окружающей средой» тут можно понимать то, что нам надо в данном случае. У этой умнеющей электропилы «окружающей средой» будет режим работы мотора.


А можно эту электропилу сделать не просто умнеющей, а и мудрой. Всего-то делов — задать ей нужные обороты двигателя.

Выставили отметку — 400 оборотов в минуту — и пошли пилять. Разумеется, пока зубья пилы не вгрызаются в

плоть

материал, частота будет более или менее удовлетворять заданной. Но вот, начинаем рвать дерево. Частота сразу падает. А если же пила начнет постоянно сверять текущие обороты с заданными, то она сможет увеличивать задание до тех пор, пока обороты не достигнут заданных (тут, конечно, надо знать меру, чтобы мотор не сгорел, но это уже другой вопрос).


Вот так и работаем — установили обороты — подсчитали текущие — поняли, как их надо подправить — установили — подсчитали — на что подправить — подправили… В итоге получили

систему управления с обратной связью

. Автоматическая ли она или автоматизированная — это уже зависит от алгоритма управления и кучи других вещей.

Система управления с обратной связью

Говоря более корректным языком, круг работы такой системы выглядит следующим образом: 1) производится расчет — какое нам надо подать воздействие на мотор электропилы (напряжение, импульсы или еще что-нибудь), чтобы выдержать установленное число оборотов? 2) если надо — советуемся с оператором; 3) подаем это воздействие; 4) смотрим результат — с помощью датчиков измеряем текущее состояние; 1) делаем следующий расчет.

Вот какое место занимают датчики в системах управления. Ни много ни мало — глаза и уши (да еще нос и язык).

Подключение ацп

Напомню, что аналоговые сигналы, в основном, бывают двух видов: токовые и напряжения. Кроме того, сигналы могут иметь стандартный диапазон значений, и нестандартный. Стандартные диапазоны значений аналоговых сигналов описаны в ГОСТах (например, ГОСТ 26.

011-80 и ГОСТ Р 51841-2001). Но, если в вашем устройстве используется какой-то самодельный датчик, то сигнал может и отличаться от стандартного (хотя я советую в любых случаях выбирать какой-нибудь стандартный сигнал — для совместимости со стандартными датчиками и другими устройствами).

АЦП в основном измеряют напряжение.

Попробую рассказать о том (в общих чертах), как подключить аналоговый датчик к АЦП и как потом разобраться с теми значениями, которые будет выдавать АЦП.


Итак, допустим, что мы хотим измерять температуру в диапазоне -40… 50 градусов с помощью специального датчика со стандартным выходом 0…1В. Допустим, что у нас есть датчик, который может измерять температуру в диапазоне -50… 150 градусов.

Если температурный датчик имеет стандартный выход, то, как правило, напряжение (или ток) на выходе датчика изменяется по линейному закону. То есть мы можем легко определить, какое напряжение будет на выходе датчика при заданной температуре.

Что такое линейный закон? Это когда диапазон значений на графике выглядит как прямая линия (см. рис.). Зная, что температура от -50 до 150 даёт на выходе датчика напряжение, изменяемое по линейному закону, мы, как я уже сказал, можем вычислить это напряжение для любого значения температуры на заданном диапазоне.

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

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

Первым делом определяем диапазон температур. Он у нас от -50 до 150, то есть 201 градус (не забываем про ноль).

А диапазон измеряемых напряжений — от 0 до 1 В.


То есть в шкалу от 0 до 1 нам надо впихнуть диапазон от 0 до 200 (всего 201).

Находим коэффициент преобразования:

К = U / Tд = 1 / 200 = 0,005 (1)

То есть при изменении температуры на 1 градус напряжение на выходе датчика будет меняться на 0,005 В. Здесь Тд — это температурный диапазон. Не значения температуры, а количество единиц измерения (в нашем случае градусов) на температурной шкале, сопоставляемой со шкалой напряжения (ноль не учитываем для упрощения, так как в диапазоне напряжений тоже есть ноль).

Проверяем характеристики АЦП микроконтроллера, который мы планируем использовать. Значение LSB не должно быть более К (более 0,005 в нашем случае, точнее, это допустимо, если вас устроит погрешность более 1 единицы измерения — более 1 градуса в нашем случае).

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

Теперь у нас есть все необходимые данные, чтобы в программе микроконтроллера преобразовать значение на выходе АЦП в значение температуры.


Мы помним, что мы сместили диапазон температур на 50 градусов. Это надо учитывать при преобразовании значения на выходе АЦП в температуру.

А формула будет такая:

Т = (U / К) — 50 (2)

Например, если на выходе АЦП 0,5 В, то


Т = (U / К) — 50 = (0,5 / 0,005) — 50 = 100 — 50 = 50 градусов

Теперь нам надо определить дискретность, то есть желаемую точность измерений.

Как вы помните, абсолютная погрешность может составлять несколько LSB. К тому же ещё существуют нелинейные искажения, которые обычно равны 0,5 LSB. То есть общая погрешность АЦП может доходить до 2-3 LSB.

В нашем случае это:


Uп = 3 LSB * 0,005 = 0,015 В

Или 3 градуса.

Если в вашем случае не так всё гладко, то снова используем формулу, выведенную из (1):

Тд = Uп / K = 0,015 / 0,005 = 3


Если погрешность в 3 градуса вас устраивает, то можно ничего не менять. Ну а если нет, то придётся подобрать АЦП с большей разрядностью либо подыскать другой датчик (с другим температурным диапазоном или с другим выходным напряжением).

Например, если вам удастся найти датчик с диапазоном -40… 50, как мы и хотели, и с таким же выходом 0…1В, то

К = 1 / 90 = 0,01

Тогда абсолютная погрешность будет:


Тд = Uп / K = 0,015 / 0,01 = 1,5 градуса.

Это уже более-менее приемлемо. Ну а если у вас будет датчик с выходом 0…5В (это тоже стандартный сигнал), то

К = 5 / 90 = 0,05


А абсолютная погрешность будет:

Тд = Uп / K = 0,015 / 0,05 = 0,3 градуса.

Это уже вообще ништяк.


Но! Не забывайте, что здесь мы рассматриваем только погрешность АЦП. Но и у самого датчика тоже есть погрешность, которую также надо учитывать.

Но всё это уже из области электроники и метрологии, поэтому данную статью я здесь и закончу.

А в конце на всякий случай приведу формулу обратного преобразования температуры в напряжение:


U = K * (Tв 50) = 0,005 * (150 50) = 1

P.S. Писал эту статью после тяжёлого рабочего дня, так что если что где напутал — прошу прощения )))

1 ЗвездаНельзя так писать о НивеНа троечкуНива хороша!Нива лучше всех! (Пока оценок нет)
Загрузка...
Закладка Постоянная ссылка.

Добавить комментарий

Ваш адрес email не будет опубликован.