Проектирование микропроцессорной системы управления (МКС)

курсовая работа

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

}

Делись добром ;)