Проектирование микропроцессорной системы управления (МКС)
3.5 Функцияanalog( )
Функция analog( ) выполняет ввод и обработку аналоговой информации, поступающей в МКС от датчиков. Блок-схема алгоритма этой программы была приведена на рисунке 1.5.
С помощью АЦП, входящего в состав микроконтроллера, аналоговые сигналы U1-U5 преобразуются в 10-разрядные двоичные коды W1-W5. Эти коды должны в ячейках памяти данных (ПД) для дальнейшего использования в программе. Далее вычисляется функция g(W1, W2, W3, K1, K2, K3), которая затем сравнивается с константой Q (уставкой), хранящейся в программной памяти МК.
В зависимости от результата сравнения вырабатываются управляющие сигналы Y2 или Y3, представляющие собой одиночные импульсы длительностью t2 или t3. В блоке 10 вычисляется функция e(W4,K4), которая используется для формирования сигнала Y4 на выходе RC2 микроконтроллера, представляющегося собой импульсную последовательность ШИМ. В блоке 12 вычисляется функция h(W5, K5), которая используется для формирования импульсной последовательности ШИМ на выводе RC1. Из нее путем фильтрации получается сигнал Y5, поступающий на исполнительные. По условию коэффициенты К1-К5, Q - это двухбайтные целые числа, хранящиеся в программной памяти микроконтроллера.
Рассмотрим пример реализации функции analog( ). Предположим, что требуется вычислить функции
g()=9•W1+max{K1+W2; (W3+K3)/8};
e() = 3•W4/K4;
h() = 7•W5/K5.
Коэффициенты К1 =5 , К2 =7 , К3 =10 , К4 = 5, К5 =4 , Q =20.
Длительность импульсов t2 = 16мс, t3 = 58мс.
/*Глобальные переменные, используемые в функции analog() */
//переменные для хранения кодов АЦП
unsignedintW1;
unsignedint W2;
unsignedint W3;
unsignedint W4;
unsignedintW5;
//размещение констант в памяти программ
constcodeintK1 = 5;
const code int K2 = 7;
const code int K3 = 10;
const code int K4 = 5;
const code int K5 = 4;
const code int Q = 20;
intM;
intN;
sbitY2 atRE1_bit; //битовая переменная Y2 на линии порта RE1
sbitY3 atRE2_bit; //битовая переменная Y3 на линии порта RE2
voidanalog()
{
intg; //двухбайтные переменные для хранения
inte; //результатов вычисления
inth; //функцийg(), e(), h()
charDC; //переменная для рабочего цикла ШИМ
//чтение кодов АЦП
W1 = ADC_Read(0); //аналоговый канал 0 (сигнал U1)
W2 = ADC_Read(1); //аналоговый канал 0 (сигнал U2)
W3 = ADC_Read(2); //аналоговый канал 0 (сигнал U3)
W4 = ADC_Read(3); //аналоговый канал 0 (сигнал U4)
W5 = ADC_Read(4); //аналоговый канал 0 (сигнал U5)
N=K1+W2; //вычисление функции g()
M=(W3+K3)/8;
if (N>M)
g =9•W1+N;
else
g =9•W1+M;
if(g>=Q)
{
Y3=1; //выводсигнала Y3
Delay_ms(58);
Y3=0;
}
else
{
Y2 = 1;
Delay_ms(16);
Y2 = 0;
}
e=3•W4/K4; //вычислениефункцииe()
DC=e; //определить величину рабочего цикла
PWM1_Set_Duty(DC); //установить текущий рабочий цикл для //PWM1
h = 7•W5/K5; //вычисление функции h()
DC = h; //определить величину рабочего цикла
PWM2_Set_Duty(DC); //установить текущий рабочий цикл для //PWM2
}