- •Работа № 3. Построение разомкнутой цифровой системы управления широтно-импульсным преобразователем, работающим на двигатель постоянного тока
- •Синтез программы несимметричного управления широтно-импульсным преобразователем
- •Void adc_init(void) {
- •Void main(void)
- •Void port_init (void) {
- •Void adc_init(void)
- •Синтез программы симметричного управления широтно-импульсным преобразователем
- •Void adc_init (void)
- •Void main(void)
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; //И выключение транзисторов.
}
}
}
//
В процессе выполнения работы необходимо разобраться с данной программой самостоятельно, показать достоинства и недостатки симметричного и несимметричного управления, написать свою программу управления шаговым электродвигателем.