![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Цифровой вольтметр
Программный фрагмент voltmeter.c производит измерение аналогового сигнала на входе AN6. Измерительная последовательность состоит из четырех преобразований. Режим измерения однократный. Результаты четырех последовательных преобразований одного и того же сигнала располагаются в четырех регистрах результата ADR0H…ADR3H. Эти измерения усредняются, что позволяет снизить влияние шумов. Полученный 8-разрядный двоичный код преобразуется к истинному значению измеряемого напряжения, умноженному на 100 d. Умножение на нормирующий коэффициент (100 в десятичной системе счисления) необходимо, чтобы использовать в программе целочисленные форматы представления данных. Полученный результат содержит одну десятичную цифру целой части измеренного напряжения, это единицы Вольт. А также две цифры десятичной дробной части. Это десятые и сотые доли Вольт в представлении результата. Промежуточные результаты исполнения программы, а также измеренное напряжение выводятся на экран персонального компьютера. /*------------------------------------------------------------------------*/ /* filename: voltmeter.c */ /* В этом примере реализован простейший цифровой вольтметр. */ /* Программа выполняет одно измерение и выводит данные на экран */ /* персонального компьютера. Для того, чтобы выполнить следующее измерение*/ /* следует перезапустить программу */ /*------------------------------------------------------------------------*/ /*подключаемые файлы*/ #include < 912b32.h> #include < stdio.h> #define DECIMAL 0х2Е /*определить код точки на экране*/ #define V 0х56 /*определить код символа " V" для экрана*/
/*используемые функции*/ void delay_100us(void); void ADC_convert(void); void delay_5ms (void);
void main(void) { printf(" HELLO\n"); /*вывести приветствие на экран*/ ATDCTL2 = 0х80; /*включить питание модуля, запретить */ /*прерывания от модуля*/ printf(" ADC\n"); delay_100us(); /*задержка 100мкс*/ printf(" warmed up\n"); ATDCTL3 = 0х00; /*обеспечить доступ к модулю в отладочном режиме*/ ATDCTL4 = 0х01; /*установить 2 такта для времени выборки*/ /*и коэффициент деления, равный 4*/ printf(" ready\n"); ADC_convert(); /*реализовать цифровой вольтметр*/ }
/*---------------------------------------------------------------------*/ /* Функция ADC_convert 4 измерения, усредняет их, вычисляет абсолютное */ /* значение напряжения, а затем преобразует результат в коды ASCII для */ /* вывода на экран */ /*---------------------------------------------------------------------*/ void ADC_convert(void) { unsigned int sumadr; unsigned int avg_bin_voltage; unsigned int int_voltage; unsigned int ones_int; unsigned int tenths_int; unsigned int hundreths_int; char ones; char tenths; char hundreths; ATDCTL5 = 0х06; /*4 преобразования в последовательности, канал 6*/ /* Ожидать завершения измерительной последовательности*/ while((ATDSTAT & 0х8000)! = 0х8000) { ; } /* Вывести коды преобразования на экран для контроля */ printf(" %x %x %х %х\n", ADR0H, ADR1H, ADR2H, АDR3Н); /* Взять среднее от 4 измерений для устранения шума*/ sumadr = ADR0H + ADR1H + ADR2H + ADR3H; avg_bin_voltage = sumadr/4; /*Преобразовать результат из двоичного кода к абсолютному значению, */ /* умноженному на 100 D, получится число в диапазоне от 0 до 500 D*/ int_voltage = (100*avg_bin_voltage/255) * 5; /*Выделить старший разряд результата и преобразовать в код ASCII */ /* Правило преобразования: десятичная цифра +48*/ ones_int = int_voltage/100; ones = (char) (ones_int + 48); /*Выделить второй разряд результата (десятые доли) и преобразовать в код*/ /* ASCII */ tenths_int = (int_voltage ones_int*100)/10; tenths = (char) (tenths_int + 48); /*Выделить третий разряд результата (сотые доли) и преобразовать в код*/ /* ASCII */ hundreths_int = (int_voltage ones_int*100 tenths_int*10) / 1; hundreths = (char) (hundreths_int + 48); /*Вывести значение измеренного напряжения на экран */ printf(" %c.%c%cV\n", ones, tenths, hundreths); }
/*-----------------------------------------------------------------------*/ /* Функция delay_100us формирует задержку в 100 мкс, частота тактирования*/ /* межмодульных магистралей МК составляет 8 МГц */ /*-----------------------------------------------------------------------*/ void delay_100us(void) { int i; for (i=0; i< 50; i++) { asm(" nop"); } }
/*------------------------------------------------------------------*/ /* Функция delay_5ms формирует задержку в 5мс, частота тактирования */ /* межмодульных магистралей МК составляет 8 МГц */ /*------------------------------------------------------------------*/ void delay_5ms(void) { int i; for (i=0; i< 50; i++) { delay_100us(); } } /*------------------------------------------------------------------*/
|