- •Работа № 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;
}
Таймер Т0 в данной программе работает в качестве источника пилообразного сигнала, для этого он инициализируется в режим быстрого ШИМ установкой в регистре TCCR0 значения 0x4B. В этом случае таймер работает в режиме ШИМ с частотой f = (fclk/64)/256=488Гц.
Аналогово-цифровой преобразователь инициализируется на работу в 8-битном режиме с предделителем частоты clk/128. При готовности результата АЦП формируется прерывание АЦП.
После завершения процедуры инициализации устройств программа попадает в бесконечный цикл while(1) в котором продолжает работать до снятия напряжения питания. В основном цикле формируется управление разрешением на работу преобразователя:
if((PINA&0x0 4)==0x04)
{
TCCR0=0x4B;
}
else
{
TCCR0=0x00;
TCNT0=0x00;
PORTB=0x00;
}
Если разрешение подано, то запускается таймер Т0, а если разрешение снято, то требуется остановить таймер Т0 и обнулить все биты на PORTB.
При готовности результата преобразования АЦП формируется прерывание,
которое вызывает функцию adc_isr () :
CLI();
adc_result=ADCH;
if(adc_result<=5) adc_result=5;
else if(adc_result>=250) adc_result=250;
OCR0=adc_result;
ADCSRA|=0x40;
SEI() ;
Здесь происходит считывание результата преобразования АЦП из регистра ADCH и его ограничение на минимальном и максимальном уровне, которые соответствует
минимальной и максимальной скважности. После этого результат выводится в регистр сравнения таймера ТО OCR0.
6. Таймер ТО формирует в счетном регистре TCNT0 нарастающий пилообразный сигнал с дискретным задним фронтом. Этот сигнал изменяется от нуля до максимального значения 255, при этом происходит сравнение с регистром уставки OCRO. При равенстве TCNT0=OCR0 формируется прерывание по совпадению ТО, а при обнулении регистра TCNT0 формируется прерывание по переполнению ТО. При наступлении прерывания по совпадению Т0 происходит включение транзисторов VT2 или VT4, в зависимости от выбранного направления вращения, и выключение транзисторов VT1 и VT3:
CLI();
if((PINA&0x02)==0x02)
{
PORTB=0x08;
}
else
{
PORTB=0x02;
}
SEI() ;
При наступлении прерывания по переполнению Т0 происходит включение транзисторов VT1 или VT3, в зависимости от направления вращения. Таким образом формируется широтно-импульсное управление транзисторами и формирование напряжения на выходе преобразователя:
CLI();
if((PINA&0x0 2)==0x0 2)
{
PORTB=0x09;
}
else
{
PORTB=0x06;
}
SEI() ;
Так, если в результате преобразования АЦП в регистр OCR0 было записано число 5, то при равенстве TCNT0=OCR0=5 и движении вперед включится транзистор VT4, а при переполнении таймера, то есть при TCNT0=255 происходит включение транзистора VT1, который будет выключен уже при TCNT0=5. Таким образом сформируется скважность выходного напряжения γ=5/256=0.02, и напряжение на выходе преобразователя будет минимально.
Синтез программы симметричного управления широтно-импульсным преобразователем
При симметричном способе управления работают все 4 транзистора К1...К4. При этом транзисторы К1 и К4 работают в противофазе с транзисторами К2 и К3.
В результате при скважности γ=0,5 обеспечивается нулевое напряжение на выходе преобразователя, при скважности γ=1 - максимальное положительное, а при скважности γ=0,5 - максимальное отрицательное напряжение.
Пример 2. Реализовать систему управления широтно-импульсным преобразователем постоянного тока в симметричном режиме управления. Напряжение на выходе преобразователя пропорционально величине сигнала задания, подаваемого на микроконтроллер с выхода потенциометра RP1 модуля микроконтроллера.
//
//Входы:
//PA0 - сигнал задания на ШИП
//PA1 - задание направления вращения
//PA2 - разрешение на работу преобразователя
//Выходы:
//PB0 - управление транзистором VT1 (вход А1)
//PB1 - управление транзистором VT2 (вход B1)
//PB2 - управление транзистором VT3 (вход C1)
//PB3 - управление транзистором VT4 (вход D1)
//Подключение стандартных бибилиотек:
#include <iom32v.h>
#include <macros.h>
//Объявление переменных:
unsigned char adc_result=0;
unsigned char delay=0;
//Функция инициализации портов ввода/вывода:
void port_init(void)
{
PORTA = 0xFE; //Порт А инициализируется на ввод данных
DDRA = 0x00;
PORTB = 0xF0; //Порт В инициализируется на вывод данных
DDRB = 0x0F;
PORTC = 0xFF;
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x0 0;
}
//Функция инициализации таймера Т0 в режиме ШИМ:
void timer0_init(void)
{
TCCR0 = 0x00;
TCNT0 = 0x00;
OCR0 = 0x7F; //В таймере Т0 задается среднее значение 127
TCCR0 = 0x00; //Запуск таймера - при записи TCCR0=0x4B
}
//Функция инициализации аналого-цифрового преобразователя: