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

Нетрудно установить, что V1min = –10 В, а V2min = + 10 В, в то время как V1max = 0 В, и V2max = 5 В. Подставим эти значения в нашу систему уравнений:

5 = 10 * K + В

0 = (–10) * K + В

В результате решения системы получим масштабный множитель K = 0.25, и напряжение смещения B = 2.5 В. Cоздадим схему на ОУ с коэффициентом передачи 0.25, и добавим напряжение смещения в 2.5 В.

При работе вольтметра после преобразования входного напряжения встроенным в МК АЦП, мы должны выполнить пересчет кода оцифровки, чтобы получить фактически измеренное входное напряжение для вывода его на дисплей. Эта операция выполняется с помощью программного обеспечения.

<p>7.3.4. Структура программы и блок-схема алгоритма</p>

Мы приводили структуру программы и блок-схему алгоритма для каждого из рассматриваемых проектов. Для этого проекта мы оставляем разработку структуры и блок схемы читателю в качестве домашней работы (задание 17).

<p>7.3.5. Программа управления </p>

/********************************************************************/

/* Имя файла: voltmeter2.с                                          */

/* Это программа для реализации простого вольтметра на базе АЦП,    */

/* встроенного в МК HC12. Приведенный программный код выполняет     */

/*одно преобразование и затем программа может вручную               */

/* перезапускаться пользователем для измерения другого напряжения   */

/********************************************************************/

#include 912b32.h

#include stdio.h

void delay_100us(void);

void ADC_convert(void);

void delay_5ms(void);

void main(void) {

 asm(" .area vectors (abs)\n" /*код инициализации вектора reset B32 */

  " .org 0xFFF8\n"

  " .word 0x8000, 0x8000, 0x8000, 0x8000\n"

  " .text");

 initialize_LCD; /*инициализация ЖК дисплея */

 ATDCTL2 = 0x80; /*подача питания на АЦП, разрешение прерываний */

 delay_5ms; /*ожидание входа АЦП в рабочий режим */

 ATDCTL3 = 0x00;

 ATDCTL4 = 0x01; /*8-разрядный результат, время выборки 2 АЦП */

                 /*clk, коэффициент деления 4 */

 ADC_convert; /*АЦП преобразование */

}

/********************************************************************/

/* void ADC_convert(void): функция, осуществляющая одно преообразо- */

/* вание и сохраняющая доступ пользователя к нему. Затем функция    */

/* преобразует текущий результат в цифровое значение. Таким образом */

/* каждое отдельное число может быть выделено, преобразовано в ASCII*/

/* код и выведено на ЖКД                                            */

void ADC_convert {

 unsigned int sumadr;

 unsigned int avg_bin_voltage;

 unsigned int int_voltage;

 unsigned int tens_int;

 unsigned int ones_int;

 unsigned int tenths_int;

 unsigned int hundredths_int;

 double voltage, abs_voltage;

 char tens;

 char ones;

 char tenths;

 char hundredths;

 ATDCTL5 = 0x06; /*проводится 4 преобразования, канал 6 */

 while((ATDSTAT 0x8000)!= 0x8000) {

  /*Подождите окончания преобразования */

 }

 /*усреднение по четырем результатам */

 sumadr = ADR0H + ADR1H + ADR2H + ADR3H;

 avg_bin_voltage = sumadr/4;

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже