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

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

Читать книгу Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С, Стивен Барретт . Жанр: Программирование.
Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
Название: Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
ISBN: -
Год: -
Дата добавления: 3 июль 2019
Количество просмотров: 162
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

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

Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - читать онлайн , автор Стивен Барретт
В книге последовательно рассматриваются все этапы создания встраиваемых систем на микроконтроллерах с применением современных технологий проектирования. Задумав эту книгу, авторы поставили перед собой задачу научить читателя искусству создания реальных устройств управления на однокристальных микроконтроллерах. Издание содержит материал, охватывающий все вопросы проектирования, включает множество заданий для самостоятельной работы, примеры программирования, примеры аппаратных решений и эксперименты по исследованию работы различных подсистем микроконтроллеров. Данная книга является прекрасным учебным пособием для студентов старших курсов технических университетов, которые предполагают связать свою профессиональную деятельность с проектированием и внедрением встраиваемых микропроцессорных систем. Книга также будет полезна разработчикам радиоэлектронной аппаратуры на микроконтроллерах.
Перейти на страницу:

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

/*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. Встроенная система управления лазерным проектором

Перейти на страницу:
Комментарии (0)