Вход/Регистрация
Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
вернуться

Пак Дэниэл Дж.

Шрифт:

Мы рассмотрим программную реализацию действий по управлению модулем аналого-цифрового преобразования на примере простейшего цифрового вольтметра.

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

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

  • Читать дальше
  • 1
  • ...
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: