Чтение онлайн

ЖАНРЫ

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

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

Шрифт:

Линейный датчик формирует аналоговое выходное напряжение, пропорциональное измеряемому магнитному потоку. И именно такой прибор мы будем использовать для обнаружения «мин».

Рис. 7.5. Датчик Холла HAL114 компании Micronas

Датчики Холла поставляются несколькими изготовителями. Мы выбрали простой датчик с тремя выводами HAL114 фирмы Micronas, схема включения которого содержит два резистора R, RL и конденсатор C, как показано на рис. 7.5. Как и ранее, график зависимости выходного напряжения от расстояния до стенки лабиринта

может быть получен экспериментально. Выходной сигнал с датчика подается на канал АЦП микроконтроллера 68HC12. Полная схема интерфейса связи МК 68HC12 с аппаратными средствами робота показана на рис. 7.6. Закончив на этом краткий обзор аппаратных средств, мы перейдем к обзору программного обеспечения робота.

Рис. 7.6. Интерфейс между аппаратными средствами робота и 68HC12

7.1.4. Структура программы и блок-схема алгоритма

Рабочая программа для этого проекта разработана Томом Шеи, бывшим студентом университета штата Вайоминг, с помощью компилятора ImageCraft ICC12. Прежде чем представить полный текст программы, рассмотрим структуру основной программы и блок-схему ее алгоритма, представленные на рис. 7.7. Мы просим читателя, самостоятельно разработать блок-схему алгоритма для каждой из функций в качестве домашней работы (см. задание 12).

а) Структура программы

б) Блок-схема алгоритма UML

Рис. 7.7. К программе управления роботом, движущимся вдоль стенок лабиринта

7.1.5. Программный код

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

/*имя файла: robot.c */

/* Система управления роботом, движущимся в лабиринте: это система */

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

/* относительно стенок лабиринта. */

/* опорного напряжения, то стенка находится в непосредственной близости*/

/* от робота.Основываясь на информации, получаемой от пяти датчиков,*/

/* робот может определять, какое направление дальнейшего движения */

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

/* Датчик Холла позволяет роботу обнаружить магниты или "скрытые мины",*/

/* установленные под полом лабиринта. Робот имеет также ЖК дисплей */

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

/* полинга для считывания результатов АЦП.Сигнал модуля ШИМ */

/* управляет драйвером двигателей колес робота. */

/*Автор: Томас Шеи. Дата создания: 18 октября 2002 */

/*Последняя редакция: 4 декабря 2002 */

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

/* Включенные файлы*/

#include <912b32.h>

#include <stdio.h>

/*Пороги
датчиков были определены экспериментально*/

#define opto_threshold 0x50 /* порог оптического датчика */

#define hes_threshold 0x80 /* порог датчика Холла */

#define forward 0

#define half_left 1

#define half_right 2

#define left_turn 3

#define right_turn 4

#define back_up 5

/*глобальные переменные*/

unsigned int i=0,j=0; /*переменные для программной задержки */

unsigned char sens[6]={0, 0, 0, 0, 0, 0};/*массив результатов АЦП */

/*прототипы функций*/

void init_adc(void); /*инициализация АЦП */

void read_adc(void); /*считывание значений АЦП */

void decision(void); /*передача решения о повороте, основанного на */

/*данных АЦП* /

void init_pwm(void); /*инициализация ШИМ */

void pwm_motors(const char a); */активация ШИМ для пересылки */

void lcd_init(void); /* инициализация дисплея */

int putchar(char c); /*вывод символа на дисплей */

int putcommand(char с); /*вывод команды на дисплей */

void delay_25(void); /*подпрограмма задержки на 2,5 с */

void lcd_print(char *string); /*вывод строки на ЖК дисплей */

void main {

 asm(".area vectors(abs)\n" /*инициализация вектора сброса МК */

" org 0xFFF8\n"

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

".text");

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

 lcd_print("LCD initialized");

 void delay_25(void); /* задержки на 2,5 с */

 init_adc; /*инициализация АЦП */

 lcd_print("ADC initialized");

 void delay_25(void); /* задержки на 2,5 с */

 init_pwm; /*инициализация ШИМ */

 lcd_print("PWM initialized");

 void delay_25(void); /* задержки на 2,5 с */

 while(1) / *непрерывный цикл */

 {

read_adc; /* считать текущее значение из АЦП */

decision; /* принять решение о направлении движения */

 }

} /*конец программы main*/

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

/*initialize_adc: инициализация АЦП контроллера 68HC12 */

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

Поделиться с друзьями: