Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
Пара ИК излучатель-приемник. В паре ИК излучатель-приемник объединены источник и приемник инфракрасного (ИК) излучения. Источником является светоизлучающий диод с соответствующей схемой, а приемником — фототранзистор, чувствительный к ИК-диапазону излучения с собственной схемой, показанной на рис. 7.4. Для питания ИК диода используются электрические цепи, описанные ранее в разделе, посвященном светодиодам. Фототранзистор имеет светочувствительный переход база-база-эмиттер. Когда свет соответствующей длины волны падает на переход, в нем возникает базовый ток. В цепь эмиттера включен резистор нагрузки, сопротивление которого позволяет обеспечить необходимую величину выходного напряжения. Часто вместо резистора с фиксированным сопротивлением используется 10-оборотный измерительный потенциометр, позволяющий индивидуально подстраивать чувствительность каждого приемника. График зависимости выходного напряжения от расстояния до стенки лабиринта может быть получен экспериментально. Выходной сигнал каждого приемника подается на канал АЦП микроконтроллера 68HC12.
Рис. 7.4. Пара излучатель-приемник — ИК-локатор
Резистор (Re) ограничивает ток ИК излучателя на уровне номинального значения (Ie). Ток приемника формирует на резисторе Rd выходное напряжение приемника (Vout)
Датчики Холла, как и показывает их название, используют эффект Холла, чтобы генерировать напряжение, пропорциональное напряженности обнаруженного магнитного поля. На рынке имеются датчики Холла двух типов: (1) переключатели и (2) линейные датчики. Датчик переключающегося типа, обнаружив присутствие магнитного поля, фиксируется во включенном состоянии. Он остается в этом состоянии, даже если магнитное поле исчезает.
Линейный датчик формирует аналоговое выходное напряжение, пропорциональное измеряемому магнитному потоку. И именно такой прибор мы будем использовать для обнаружения «мин».
Рис. 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 0xFFF8n"
" .word 0x8000, 0x8000, 0x8000, 0x8000n"
".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 */
/*******************************************************************/
void init_adc() {
ATDCTL2 = 0x80; /*Установить бит ADPU для подачи питания на АЦП */
ATDCTL3 = 0x00;
ATDCTL4 = 0x7F; /* частоту P_CLK установить на 125 кГц */
/* время преобразования: 32 ATD CLK, */
/*1 считывание каждые 256 мкс /*
for(i=0; i<67; i++) /*задержка 100 мкс при 8 МГц E_CLK */
{
;
}
}
/********************************************************************/
/********************************************************************/
/*read_adc: считывание результатов из АЦП */
/********************************************************************/
void read_adc() {
ATDCTL5 = 0x50; /*Установить АЦП на режим многоканального,*/
/* преобразования 8 каналов */
while((ATDSTAT & 0x8000) == 0)/* проверка бита SCF для окончания */
/*преобразования */
{
;
}
/* сохранения результата в глобальном массиве */
sens[0] = ADR7H; /*дальний левый датчик */
sens[l] = ADR6H; /*средний правый датчик */
sens[2] = ADR5H; /*центральный датчик */
sens[3] = ADR4H; /* средний правый датчик */
sens[4] = ADR3H; /* дальний правый датчик */
sens[5] = ADR2H; /*датчик Холла*/
}
/********************************************************************/
/*decision(): решение о повороте основано на информации, полученной от*/
/* пяти датчиков. Порог датчика Холла (hes_threshold) и порог */
/* оптического датчика (opto_threshold) определяются экспериментально.*/