Рябов В.Т. - Разработка и отладка программного обеспечения микропроцессорной системы управления на базе однокристальных микроЭВМ, страница 9
Описание файла
PDF-файл из архива "Рябов В.Т. - Разработка и отладка программного обеспечения микропроцессорной системы управления на базе однокристальных микроЭВМ", который расположен в категории "". Всё это находится в предмете "системы автоматического управления (сау) (мт-11)" из 8 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "системы автоматического управления (сау)" в общих файлах.
Просмотр PDF-файла онлайн
Текст 9 страницы из PDF
Такой двигательимеет 4 фазы, шаг перемещения 1/200 оборота. Максимальная частота вращения 3000об/мин.Типовая схема аппаратного подключения шагового двигателя показано на рисунке 6.Рис. 6. Типовая схема подключения шагового двигателя.На рисунке показано, что каждая фаза двигателя включается ключом на биполярномтранзисторе VT1 через оптронную развязку DA1. Резистор R2 ограничивает темновой токвыходного фототранзистора оптопары, а резистор R3 отводит его от базы ключевого транзистора.
Диоды VD1 и VD2 шунтируют ЭДС самоиндукции фазовой обмотки шагового двигателя при ее включении и выключении.В нашем микроконтроллере фазы двигателя управляются от младших четырех битовпорта Р1 микроконтроллера, которые подключены к базе ключевого транзистора через буферК1565АП5 без использования оптронной развязки.Это допустимо при коротких линиях связи. Кроме шагового двигателя к лабораторномумикроконтроллеру подключено четыре кнопки, сигналы которых могут читаться также портом Р1 (рис. 7).- 29 -Рис. 7.
Схема лабораторного микроконтроллера управления шаговым двигателем.9. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ УПРАВЛЕНИЯ ШДКонтроллер, изображенный на рис.7, должен вращать с переменной скоростью в ту илииную сторону шаговый двигатель. Обеспечить необходимый алгоритм работы должно программное обеспечение контроллера. На примере разработки ПО мы убедимся, как удобнопрограммировать под управлением диспетчера задач реального времени.Наше ПО удобно представить двумя квантами:Шаг шагового двигателя «STEP».Опрос клавиатуры «KLAV».Первый синхроквант будем запускать через переменную задержку времени, так какдвигатель должен вращаться с переменной скоростью. Второй синхроквант – опрос клавиатуры будем запускать через 100 мс.
Вряд ли кто сможет нажать на кнопку более одного разаза это время.9.1. Программа двухфазного вращения шагового двигателяЗадача программы – переключать биты в соответствии с заданной последовательностью1100 – 0110 – 0011 – 1001 и т.д. Моменты переключения жестко привязаны ко времени. Каждое переключение – это 1/200 оборота для двигателя ДШИ-200.Определите, какова будет скорость вращения, если задержка между переключениями составляет 1 мс?Для вращения в обратную сторону последовательность нужно изменить последовательность подачи тетрад 1001 - 0011 – 0110 – 1100.
Да при всем этом, не нужно искажать содержимое старшей тетрады порта Р1. Она у нас, судя по схеме на рис. 9, будет использоваться длясвязи с четырьмя управляющими кнопками. Одна из них будет включать или выключать, есливключен, шаговый двигатель, вторая реверсировать направление вращения. Все время, поканажата третья кнопка, двигатель будет увеличивать скорость своего вращения. Четвертаякнопка, наоборот, будет замедлять двигатель.Для управления отдельными битами применяют прием маскирования. Управление осуществляется при помощи команды «исключающее ИЛИ» XOR .
Для этого заводят переменную FASA - значение младшей тетрады порта Р1 и переменную MASKA, которой присваи- 30 -вается значение 1010.В этом случае подпрограмма выполнения шага будет выглядеть так:XOR FAZA, MASKA;исключающее ИЛИ маски и фазы, результат в фазуINV MASKA;инверсия маски, значения каждого битаЗадержка.;меняется на противоположноеВ цифровом виде это будет выглядеть: исходно MASKA=1010, FAZA=1100.Первый вход в подпрограмму11001010 «исключающее ИЛИ c MASKA»Второй вход в подпрограмму0110 «Результат в FAZA»0101 «исключающее ИЛИ c инверсией MASKA»0011 «Результат в FAZA»1010 «исключающее ИЛИ c инверсией MASKA»1001 «Результат в FAZA»Жирным шрифтом здесь выделены последовательные значения в переменной FAZA.Видно, что две единицы поехали вправо, т.е.
двигатель начал вращаться.Чтобы вращать двигатель в другую сторону перед входом в программу шага нужнопредварительно инвертировать маску.Реально на конкретном ассемблере MCS51 программа из-за ряда ограничений будет выглядеть более сложно. Наш шаговый двигатель подключен к младшим четырем битам(младшей тетраде) порта P1. Программа управления двигателем при своей работе не должнапортить старшей тетрады порта, к этим битам могут быть подключены другие элементы объекта управления (у нас, набор кнопок). Манипулируя байтовыми переменными FAZA иMASKA, мы изменяем, все восемь бит.
Управляют отдельными битами, используя приеммаскирования. Далее приведен текст программы с комментариями.Прежде всего, квант «STEP» нужно прописать в зоне векторов запуска синхроквантов:;--------------------USER PROGRAMM MEMORY---------------------ORG 149h;-------name thread0-------------LJMP STEPПрисвоим ему наивысший приоритет при запуске. Чтобы квант стал нормально работать,нужно заранее подготовить его переменные MASKA, FASA, задержка и установить статус кванта.
Это сделаем в подпрограмме начальной настройки пользователя START и активизируем ее вектор162h.ORG 162h;-------name user-start program--LJMP STARTДалее приведен текст кванта START. Набирается он в зоне -USER PROGRAMMпрограммы диспетчера. В стартовой подпрограмме мы должны определить и задать начальные значения всем переменным, которые нам понадобятся в квантах STEP и KLAV.При написании программы на ассемблере есть возможность использовать символические переменные и макоопределения, что улучшает читабельность программы.
С другойстороны, использование символических переменных не дает возможности применить неявную адресацию через регистры контроллера, что приводит к увеличению длины программного кода и снижению быстродействия. Читабельность программы можно улучшить подробным комментированием. В комментариях к кванту объявим все используемые переменные.Используемые переменные, требующие инициализации, приведены в таблице 6Таблица 6.АдресПеременные пользователяАдресСистемная переменная диспетчераR1Задержка кванта STEP20h.0hСтатус кванта STEPR2MASKA – маска для коммутации фаз 20h.1hСтатус кванта KLAVR3FAZA - фазы двигателя22h.0-7h Разрядности тиков задержкиквантов28hПрошлые состояния клавиш- 31 -;----------------------USER PROGRAMM---------------------------;-----------------------user start programm-------------------------START: MOVR3,#0Ch;00001100 в ФАЗУMOVR2,#0Ah;00001010 в МАСКУMOVP1,R3;фазу в портCLR20h.0h;снять статус кванта STEPMOVR1,#20h;задержка кванта STEP 32 - тикаMOV08h,R1;переписать ее в регистр задержек кванта STEPSETB 20h.1h;установить статус кванта KLAVMOV09h,#80h;записать 128 в регистр задержек кванта KLAVMOV28h,#0FFh;клавиши не нажималисьMOV22h,#00;все задержки в коротких тикахRET;возврат из ППТекст кванта START реализует описанную выше идею с исключающим ИЛИ, но выглядит посложнее.;-----------------------Step_SM--------------------------STEP:CLRA;очистить аккумуляторORLA,P1;фазу в аккумуляторXRLA,R2;исключающее ИЛИ фазы и маскиMOVP1,A;результат в портXRL02h,#0Fh;исключающее ИЛИ маски и 0FhMOV08h,R1;установить задержку кванту из R1MOVR3,A;новую фазу в R3RET; возврат из ППДокажите, что этот квант ни как не искажает содержимое старшей тетрады порта Р1.9.2.
Программа опроса кнопок и управления шаговым двигателемКнопки через однонаправленный буфер BF подключены к старшей тетраде порта Р1(рис.7). Если кнопка не нажата, на бит буфера через пары резисторов R1-R5…R4-R8 поступает напряжение +5В и единица на соответствующий бит порта. При нажатии на кнопку, на соответствующей линии будет фиксироваться нуль.Распределим фукции кнопок.Кнопка К4 «Вкл-Выкл», подключенная к порту Р1.7, будет у нас включать и выключатьдвигатель.
Если двигатель выключен, нажатие на нее должно приводить к включению, есливключен и вращается – к выключению.Кнопка К3 «Реверс» должна реверсировать вращение шагового двигателя. При нажатиина нее шаговый двигатель должен остановиться и начать крутиться в другую сторону с той жескоростью, что и до реверса.Кнопка К2 «Быстрее» должна при нажатии на нее приводить к уменьшению задержкимежду шагами шагового двигателя и ускорению его вращения.Кнопка К1 «Медленее» должна при нажатии на нее приводить к увеличению задержкимежду шагами шагового двигателя и замедлению его вращения.Не заметили принципиальной разницы между кнопками? Первые две должны реагироватьна каждое нажатие и обнаруживать спад сигнала на соответствующей линии: прошлый опросбыла единица, а теперь ноль, вот событие, которое должна фиксировать такая кнопка. Этокнопка однократного нажатия.Кнопки К1 и К2 – кнопки с автоповтором.
Действие, связанное с этой кнопкой выполняется всякий раз, как только будет обнаружено ее нажатие. Ноль в цикле опроса вне зависимости от прошлого состояния – вот событие, фиксируемое такой кнопкой.В управляющей программе, прежде всего, пропишем процесс опроса кнопок в зоне векторов квантов с единичным приоритетом. Старший нулевой приоритет пусть занял квант STEP.- 32 -ORG 14Ch;-------name thread1----------LJMP KLAVДля того, чтобы считывать состояние выводов порта Р1, а не состояние защелок этих выводов, необходимо в защелки старшей тетрады порта предварительно записать единицы. Этовыполняется первым оператором «ИЛИ».
Далее анализируется состояние кнопки однократного нажатия «ВКЛ-ВЫКЛ» (р1.7). При условии: в прошлом опросе была единица, а теперь –ноль, запускается подпрограмма включения выключения PUSK_STOP.В ней просто инвертируется статус кванта STEP и квант включается, если был выключенили выключается, если был включен. При выключении не только снимается с диспетчирования сам процесс, но и отключается напряжение с фазных катушек ШД. При этом процесс чтения состояния кнопок не нарушается, поскольку единичные биты старшей тетрады порта Р1восстанавливаются всякий раз при обращении к процессу чтения.;------------------------KLAV-------------------------KLAV:ORLP1,#0F0h;-------------------------p1.7----------------P1_7:JBP1.7,N_P1_7JNB28h.7h,P1_6LCALL PUSK_STOPINV7:CPL28h.7hSJMP P1_6N_P1_7:JB28h.7h,P1_6SJMP INV7;------------------------p1.6------------------P1_6:JBP1.6,N_P1_6JNB28h.6h,P1_5LCALL REVERSINV6:CPL28h.6hSJMP P1_5N_P1_6:JB28h.6h,P1_5SJMP INV6;------------------------p1.5------------------P1_5:JBP1.5,P1_4LCALL FASTER;------------------------p1.4------------------P1_4:JBP1.4,EKLLCALL SLOWLYEKL:RET;----------------------------------------------PUSK_STOP:CPL20h.0hMOVP1,#0F0hJNB20h.0h,ENDPSMOVP1,R3ENDPS:RET;----------------------------------------------REVERS:XRL02,#0FhRET;----------------------------------------------SLOWLY:INCR1RET;---------------------------------------------FASTER:DECR1RET;---------------------------------------------END;Конец всей программы.- 33 -10.