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

ЖАНРЫ

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

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

Шрифт:

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) определяются экспериментально.*/

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

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; i<0xFFFF; i++){ /*задержка вращения двигателя */

for(j=0; j<15; 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);

 }

 /*если стенки спереди и справа, поворачивает налево */

 else if((sens[2]>opto_threshold)&&(sens[4]>opto_threshold)) {

pwm_motors(left_turn);

 }

 /*если стенка спереди справа, делает полуповорот направо*/

else if(sens[1]>opto_threshold) {

pwm_motors(half_right);

 }

 /*если стенка спереди слева, делает полуповорот налево */

 else if(sens[3] > opto_threshold) {

pwm_motors (half_left) ;

 }

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

 else {

pwm_motors(forward);

 }

}

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

/*init_pwm: инициализация ШИМ контроллера 68HС12 */

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

void init_pwm {

 PWTST= 0x00;

 PWCTL= 0x00; /*Режим фронтовой ШИМ */

 WCLK= 0x3F; /*Каналы без каскадного соединения, E_CLK/128 */

 PWPOL= 0x0F; /*set pins high then low transition */

 DDRP = 0xFF; /*Порт PORT T на вывод */

 PWEN = 0x0F; /*Активизировать выход ШИМ */

 PWPER0 = 250; /*Установить частоту ШИМ 250 Гц */

 PWPER1 = 250;

 PWPER2 = 250;

 PWPER3 = 250;

 PWDTY0 = 0; /*начальная установка ШИМ на отсутствие движения*/

 PWDTY1 = 0;

 PWDTY2 = 0;

 PWDTY3 = 0;

}

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

/*pwm_motors: /*выполнение определенного поворота */

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

void pwm_motors(const char a) {

 for (i = 0;i<2000;i++) /*задержка на 3 мс чтобы позволить двигателю*/

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