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; i67; 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) определяются экспериментально.*/
/********************************************************************/
void decision {
if (sens[5] hes_threshold) { /* датчик Холла нашел "мину", */
pwm_motors(back_up); /* робот движется назад и определяются */
/* дальнейшие действия/*
if (sens[0] opto_threshold) pwm_motors(right_turn);
else pwm_motors(left_turn);
for(i=0; i0xFFFF; i++){ /*задержка вращения двигателя */
for(j=0; j15; j++) {
;
}
}
}
/*если обнаруживает три стенки (тупик), то движется назад */
else if((sens[2]opto_threshold) (sens[0]opto_threshold)
(sens[4]opto_threshold)) {
pwm_motors(back_up);
}
/*если стенки спереди и слева, поворачивает направо */
else if((sens[0]opto_threshold)(sens[2]opto_threshold)) {
pwm_motors(right_turn);
}