/*если стенки спереди и справа, поворачивает налево */
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;i2000;i++) /*задержка на 3 мс чтобы позволить двигателю*/
{ /* отреагировать*/
}
switch(a) { /*определение вида поворота */
case 0: /* движение вперед */
PWDTY0 = 200; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 250;
PWDTY3 = 200;
lcd_print("Forward\n");
break;
case 1: /*полуповорот налево */
PWDTY0 = 0; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 250;
PWDTY3 = 125;
lcd_print("Half Left\n");
break;
case 2: /*полуповорот направо*/
PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 250;
PWDTY3 = 0;
lcd_print("Half Right\n");
break;
case 3: /*поворот налево*/
PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 0;
PWDTY3 = 125;
lcd_print("Left Turn\n");
break;
case 4: /*поворот направо*/
PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 0;
PWDTY2 = 250;
PWDTY3 = 125;
lcd_print("Right Turn\n");
break;
case 5: /*задний ход*/
PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 0;
PWDTY2 = 0;
PWDTY3 = 125;
for(i=0; i0xFFFF; i++) { /* Задержка в 1,25 с перед движением назад*/
for(j=0; j15; j++) {
;
}
}
lcd_print("Back Up\n");
break;