Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 100 101 102 103 104 105 106 107 108 ... 150
Перейти на страницу:

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

/*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 мс чтобы позволить двигателю*/

 {                      /* отреагировать*/

 }

 switch(a) { /*определение вида поворота */

 case 0: /* движение вперед */

  PWDTY0 = 200; /*регистры коэффициента заполнения ШИМ */

  PWDTY1 = 250;

  PWDTY2 = 250;

  PWDTY3 = 200;

  lcd_print("Forwardn");

  break;

 case 1: /*полуповорот налево */

  PWDTY0 = 0; /*регистры коэффициента заполнения ШИМ */

  PWDTY1 = 250;

  PWDTY2 = 250;

  PWDTY3 = 125;

  lcd_print("Half Leftn");

  break;

 case 2: /*полуповорот направо*/

  PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */

  PWDTY1 = 250;

  PWDTY2 = 250;

  PWDTY3 = 0;

  lcd_print("Half Rightn");

  break;

 case 3: /*поворот налево*/

  PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */

  PWDTY1 = 250;

  PWDTY2 = 0;

  PWDTY3 = 125;

  lcd_print("Left Turnn");

  break;

 case 4: /*поворот направо*/

  PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */

  PWDTY1 = 0;

  PWDTY2 = 250;

  PWDTY3 = 125;

  lcd_print("Right Turnn");

  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 Upn");

  break;

 default: /*по умолчанию движение вперед, малая скорость */

  PWDTY0 = 63; /*регистры коэффициента заполнения ШИМ */

  PWDTY1 = 250;

  PWDTY2 = 250;

  PWDTY3 = 63;

  lcd_print("Errorn");

  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) != '') {

  putchar(*string);

  string++;

 }

}

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

7.2. Лазерный проектор

В этом разделе, мы описываем разработку и построение встроенной системы управления для лазерного проектора. Вы вероятно видели такую систему, на концерте или в планетарии. Аналогичный подход может быть использован при разработке точного лазера для медицинских целей или для технологических установок, например, чтобы управлять лазером для точной гравировки.

7.2.1. Описание проекта

Система имеет семь образцов изображений, которые проектируются лазером на стену или киноэкран. Мы выбираем один из них для проекции, нажав соответствующую кнопку. Как только изображение выбрано, подсвечивается светодиод, соответствующий выбранному варианту. Затем система управления открывает лазерный затвор, позволяя лазерному лучу пройти на пару гальванометрических зеркал. Микроконтроллер 68HC12 генерирует сигналы управления, позволяющие изменять угол поворота зеркал, чтобы создать предварительно записанное в памяти изображение с помощью внешних по отношению к МК цифро-аналоговых преобразователей (ЦАП). Выбранное изображение выводится однократно при каждом нажатии кнопки. Конструкция системы приведена на рис. 7.8.

Рис.7.8. Встроенная система управления лазерным проектором

1 ... 100 101 102 103 104 105 106 107 108 ... 150
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт.
Комментарии