Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Цифровой вольтметр






 

Программный фрагмент 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();

}

}

/*------------------------------------------------------------------*/

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.