Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Программный код




 

В этом разделе, мы представляем программу для управления парящим роботом на языке Си. Программа была первоначально написана Джоулом Перлином, одним из наших студентов, и скорректирована авторами настоящей книги.

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

// filename: flying.с

// Описание программы: Эта программа запускает четыре двигателя и затем

// управляет скоростью вращения каждого из них. После взлета робота

// программа проверяет каждый из датчиков для определения положения

// робота. При обнаружении преграды или крыши, скорости вращения двигателей

// корректируются, чтобы обеспечить правильное направление движения.

//

// Авторы: Джоэль Перлин, Даниэль Пак, Стив Барретт

// Дата создания: 27 июля 2004

// используемая память: программа - 0x1000, данные - 0x3000 и

// стек - 0x4000

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

#include <stdio.h>

#include "hcs12dp256.h"

 

#pragma abs_address 0x3000

unsigned int count1; //счетчики переменных

unsigned int count2;

unsigned int sensor;

char sensoravg; //сохраняют данные датчиков в виде 8-разрядных чисел

volatile unsigned p; // текущий счетчик

#pragma end_abs_address

 

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

void main(void) {

//Инициализация робота

PWME = 0x00; //запрет ШИМ

DDRA = 0xFF; //конфигурирование портов A и В как выходных

DDRB = 0xFF;

PORTA = 0xAA; //подача питания на датчики

PORTB = 0xFF; //индикация режима программы на линейке светодиодов

//Инициализация модуля ATD

PORTAD1 = 0x00; //конфигурирование портов как входных

ATD1CTL2 = 0xC2; //инициализация ATD с установкой флагов

//преобразования в каналах

ATD1CTL3 = 0x00; // функция установки ATD

ATD1CTL4 = 0x80; //установить 8-разрядный режим

PORTB = 0xFE; //показать состояние программы на линейке

// светодиодов

// Инициализация режима входного захвата

TSCR1 = 0x80; //включение таймера (нормальный режим)

TSCR2 = 0x80; //установить период переполнения счетчика временной

// базы 8.192 мс, коэффициент деления = 1

TIOS = 0x00; //установить каналы таймера в режим входного захвата

TMSK1 = 0xE0;//биты разрешения прерывания по событиям на линиях [7:5]

TFLG1 = 0xE0; //очистить флаги прерываний TFLG1

PORTB = 0xFC; // показать состояние программы на линейке светодиодов

// инициализация ШИМ

PWMCTL = 0x00; //установить 8-разрядный режим

PWMCAE = 0x10; //установить фронтовую ШИМ

PWMPOL = 0x5F; //выбрать активным высокий логический уровень

//назначить режим ШИМ для каналов 0,1,2,3,4 и 6



PWMCLK = 0x50; //каналы 0,1,4 тактируются CLOCK_A и каналы

//2,3,6 - CLOCK_В

PWMSCLA = 0x20; //период A 0x20 = 4.1 мс

PWMSCLB = 0x04; //период B 0x02 = 255 мкс, выбрать

// наибольший коэффициент заполнения для всех каналов

PWMPER0 = 255;

PWMPER1 = 255;

PWMPER2 = 255;

PWMPER3 = 255;

//Запуск двигателей

PWME = PWME | 0x5F; // разрешения режима ШИМ для каналов 0,1,2,3,4 и 5

PWMDTY0 = 80; // установить коэффициенты заполнения

// для каналов 0,1,2 и 3

PWMDTY1 = 80;

PWMDTY2 = 80;

PWMDTY3 = 80;

// Взлет

while (PWMTY0 < 200) {

PWMDTY0 = PWMDTY0 + 1;

PWMDTY1 =PWMDTY1 + 1;

PWMDTY2 = PWMDTY2 + 1;

PWMDTY3 = PWMDTY3 + 1;

}

P = 20;

// установить коэффициенты заполнения для двигателей на режим полета

while (battery == 1) //проверить включение батареи

{

// двигатель 1

ATD0CLT5 = 0x04; //режим оцифровки многоканальный

while ((ATD0STAT0 & 0x80) == 0);

sensoravg = ATD0DR4H; //установить PAD00 для датчика 1

if ((int)sensoravg > 80) {

PWMDTY0 = PWMDTY0 + 20;

delay2();

for (i=0; i<p; i++) PWMDTY0--;

}

// двигатель 2

ATD0CLT5 = 0x04;

while ((ATD0STAT0 & 0x80) == 0);

sensoravg = ATD0DR5H; //установить PAD00 для датчика 2

if ((int)sensoravg > 80) {

PWMDTY1 = PWMDTY1 + 20;

delay2();

for (i=0; i<p; i++) PWMDTY1--;

}

// двигатель 3

ATD0CLT5 = 0x04;

while ((ATD0STAT0 & 0x80) == 0);

sensoravg = ATD0DR6H; //установить PAD00 для датчика 3

if ((int)sensoravg > 80) {

PWMDTY2 = PWMDTY2 + 0;

delay2();

for (i=0; i<p; i++) PWMDTY2--;



}

// двигатель 4

ATD0CLT5 = 0x04;

while ((ATD0STAT0 & 0x80) == 0);

sensoravg = ATD0DR7H; //установить PAD00 для датчика 4

if ((int)sensoravg > 80) {

PWMDTY7 = PWMDTY7 + 20;

delay2();

for (i=0; i<p; i++) PWMDTY7--;

}

} //конец while

// снизить скорость двигателей для посадки

while (PWMDTY0 > 80) {

PWMDTY0--;

PWMDTY1--;

PWMDTY2--;

PWMDTY3--;

delay1();

}

// остановить двигатели

PWME = 0x00;

}

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

 


.

mylektsii.ru - Мои Лекции - 2015-2019 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал