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 мс чтобы позволить двигателю*/
{ /* отреагировать*/
}
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; i<0xFFFF; i++) { /* Задержка в 1,25 с перед движением назад*/
for(j=0; j<15; j++) {
;
}
}
lcd_print("Back Up\n");
break;
default: /*по умолчанию движение вперед, малая скорость */
PWDTY0 = 63; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 250;
PWDTY3 = 63;
lcd_print("Error\n");
break;
}
}
/********************************************************************/
/*lcd_init(): инициализация режима работы ЖК дисплея */
/*Последовательность команд инициализации определяется изготовителем*/
/*PORTA: магистраль данных, PORTB[2:1]: линия R/S, линия разрешения E*/
/********************************************************************/
void lcd_init() {
DDRA=0xff; /*порт PORTA на вывод */
DDRB=0x06; /* порт PORTB [2:1] на вывод */
/*последовательности команд для инициализации ЖК дисплея */
putcommand(0x38);
putcommand(0x38);
putcommand(0x38);
putcommand(0x38);
putcommand(0x0f);
putcommand(0x01);
putcommand(0x06);
putcommand(0x00);
/*очистка дисплея, возврат курсора */
putcommand(0x00);
}
/********************************************************************/
/*putchar(char c): вывод символа на дисплей */
/********************************************************************/
int putchar(char c) {
PORTA=C;
PORTB= PORTB |0x04;
PORTB= PORTB |0x02;
PORTB= PORTB&0xfd;
for (i=0; i<100; i++); /*задержка на *150 мкс до того, как ЖКД */
/* сможет принять информацию */
return с;
}
/********************************************************************/
/********************************************************************/
/*putcommand(char c): выдача команды управления для ЖК дисплея */
/********************************************************************/
int putcommand(char с) {
PORTA= с;
PORTB= PORTB&0xfb;
PORTB= PORTB|0x02;
PORTB= PORTB&0xfd;
for (i=0; i<100; i++) /* задержка на *150 мкс до того, как ЖКД сможет*/
/*принять информацию */
{
;
}
return c;
}
/********************************************************************/
/*delay_25(): задержка на 2.5 с */
/********************************************************************/
void delay_25() {
for (i=0; i<0xFFFF; i++) {
for (j=0; j<30; j++) {
;
}
}
}
/********************************************************************/
/*lcd_print(): вывод строки символов на дисплей. */
/********************************************************************/
void lcd_print(char *string) {
putcommand(0x02); /*возврат курсора ЖКД */
while (*(string) != '\0') {
putchar(*string);
string++;
}
}
/********************************************************************/
В этом разделе, мы описываем разработку и построение встроенной системы управления для лазерного проектора. Вы вероятно видели такую систему, на концерте или в планетарии. Аналогичный подход может быть использован при разработке точного лазера для медицинских целей или для технологических установок, например, чтобы управлять лазером для точной гравировки.
Читать дальше