
- •Работа № 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 = 0x0 0;
ADMUX = 0x6 0; //АЦП инициализируется на работу с входом ADC0
ADCSRA = 0x0 0;
ADCSRA = 0xCF; //АЦП запускается в одиночном режиме
} //с предделителем 128
//Подпрограмма обработки прерывания готовности АЦП:
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
CLI(); //Запрет всех прерываний
adc_result=ADCH; //Считывание результата преобразования АЦП
if(adc_result<=5) adc_result=5; //Минимальная скважность
else if(adc_result>=250) adc_result=250; //Максимальная скважность
OCR0=adc_result; //Выдача результата на ШИМ таймера Т0
ADCSRA|=0x4 0; //Перезапуск АЦП
SEI(); //Разрешение всех прерываний
}
//Подпрограмма обработки прерывания по совпадению таймера Т0:
#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
void timer0_comp_isr(void)
{
CLI(); //Запрет всех прерываний
if((PINA&0x02)==0x02) //При движении «Вперед» {
PORTB=0x08; //включается транзистор VT4
}
else //При движении «Назад»
{
PORTB=0x02; //Включается транзистор VT2
}
SEI(); //Разрешение всех прерываний
}
//Подпрограмма обработки прерывания по переполнению таймера Т0:
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
CLI(); //Запрет всех прерываний
if((PINA&0x02)==0x02) //При движении «Вперед» {
PORTB=0x09; //Включаются транзисторы VT1 и VT4
}
else //При движении «Назад»
{
PORTB=0x06; //Включаются транзисторы VT2 и VT3
}
SEI(); //Разрешение всех прерываний
}
//Функция инициализации периферийных устройств контроллера:
void init_devices(void)
{
CLI(); //Запрет всех прерываний
port_init(); //Вызов функции инициализации портов
timer0_init(); //Вызов функции инициализации таймера Т0
adc_init(); //Вызов функции инициализации АЦП
MCUCR = 0x0 0;
GICR = 0x0 0; //Запрет всех внешних прерываний
TIMSK = 0x03; //Разрешение прерываний по совпадению и
//переполнению таймера Т0
SEI(); //Разрешение всех прерываний
}
//Главная функция программы:
Void main(void)
{
init_devices(); //Вызов функции инициализации устройств контроллера
while(1) //Бесконечный цикл
{
if((PINA&0x04)==0x04) //При подаче сигнала разрешения {
TCCR0=0x4B; //Запускается таймер Т0 в режиме ШИМ
}
else //При снятии сигнала разрешения
{
TCCR0=0x00; //Таймер Т0 останавливается
TCNT0=0x00;
PORTB=0x00; //управляющие импульсы снимаются
}
}
}
//
Рассмотрим программу более подробно.
Сначала подключаются основные библиотеки, необходимые для работы программы и глобальные переменные:
#include <iom32v.h>
#include <macros.h>
unsigned char adc_result=0;
После этого происходит переход на выполнение главной функции main (), из которой происходит вызов функции инициализации периферийных устройств контроллера init_devices():
CLI();
port_init() ;
timer0_init();
adc_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x03;
SEI();
Функция инициализации периферийных устройств последовательно вызывает функции инициализации портов ввода/вывода, таймера Т0 и АЦП:
Void port_init (void) {
PORTA = 0xFE;
DDRA = 0x00;
PORTB = 0xF0;
DDRB = 0x0F;
PORTC = 0xFF;
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x00;
}
void timer0_init(void)
{
TCCR0 = 0x00;
TCNT0 = 0x00;
OCR0 = 0x00;
TCCR0 = 0x00;
}