Нетрудно установить, что 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 В.
При работе вольтметра после преобразования входного напряжения встроенным в МК АЦП, мы должны выполнить пересчет кода оцифровки, чтобы получить фактически измеренное входное напряжение для вывода его на дисплей. Эта операция выполняется с помощью программного обеспечения.
7.3.4. Структура программы и блок-схема алгоритма
Мы приводили структуру программы и блок-схему алгоритма для каждого из рассматриваемых проектов. Для этого проекта мы оставляем разработку структуры и блок схемы читателю в качестве домашней работы (задание 17).
7.3.5. Программа управления
/********************************************************************/
/* Имя файла: 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;