Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа 3.docx
Скачиваний:
10
Добавлен:
04.06.2015
Размер:
55.49 Кб
Скачать

Void adc_init (void)

{

ADCSRA = 0x00;

ADMUX = 0x60;

ADCSRA = 0x00;

ADCSRA = 0xCF; //АЦП - в режиме однократного преобразования

} //в 8-битном режиме с предделителем 128

//Обработка прерывания готовности АЦП:

#pragma interrupt_handler adc_isr:iv_ADC

void adc_isr(void)

{

CLI(); //Запрет всех прерываний

adc_result=ADCH; //Считывание результата преобразования АЦП

adc_result>>=1; //Деление результата пополам и ограничение

if(adc_result<=5) adc_result=5; //на минимальном

else if(adc_result>=122) adc_result=122; //и максимальном уровнях

if((PINA&0x02)==0x02) //При движении «Вперед»

{

OCR0=0x7F+adc_result; //уставка таймера больше 127

}

else //При движении «Назад»

{

OCR0=0x7F-adc_result; //уставка таймера меньше 127 }

ADCSRA|=0x40; //Перезапуск АЦП

SEI(); //Разрешение всех прерываний

}

//Обработка прерывания по совпадению таймера Т0:

#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP

void timer0_comp_isr(void)

{

CLI(); //Запрет всех прерываний

PORTB=0x00; //Выключение транзисторов

for (delay=0;delay<5;delay++){;} //Защита от короткого замыкания

PORTB=0x09; //Включение VT1 и VT4

SEI(); //Разрешение всех прерываний

}

//Обработка прерывания по переполнению таймера Т0:

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF

void timer0_ovf_isr(void)

{

CLI(); //Запрет всех прерываний

PORTB=0x0 0; //Выключение транзисторов

for(delay=0;delay<5;delay++) {;} //Защита от короткого замыкания

PORTB=0x0 6; //Включение VT2 и VT3

SEI(); //Разрешение всех прерываний

}

//Функция инициализации периферийных устройств:

void init_devices(void)

{

CLI(); //Запрет всех прерываний

port_init(); //Вызов функции инициализации портов

timer0_init(); //Вызов функции инициализации таймера Т0

adc_init(); //Вызов функции инициализации АЦП

MCUCR = 0x00;

GICR = 0x0 0; //Запрет внешних прерываний

TIMSK = 0x03; //Разрешение прерываний по совпадению и

SEI(); //переполнению таймера Т0

}

//Основная функция программы:

Void main(void)

{

init_devices(); //Вызов функции инициализации устройств

while(1)

{

if((PINA&0x04)==0x04) //При подаче сигнала разрешения на работу {

TCCR0=0x4B; //Запуск таймера Т0

}

else //Иначе

{

TCCR0 = 0x00; //Остановка таймера Т0

TCNT0=0x00;

PORTB=0x00; //И выключение транзисторов.

}

}

}

//

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