курсовой проект / Микроконтроллерный синтезатор частоты / kursach[listing]1-total
.doc5 РАЗРАБОТКА УПРАВЛЯЮЩЕЙ ПРОГРАММЫ
Ниже приведена часть программа управления скоростью вращения двух коллекторных электродвигателей с последовательным возбуждением для микроконтроллера PIC16F84, работающего на частоте 10мГц.
При записи программы в память микроконтроллера в слове конфигурации должны быть указаны: тип генератора - HS, Watchdog timer - ON, Power-up timer - ON.
LIST P=16F84
Описание встроенных в контроллер ресурсов
RTCC EQU 0x01
PCL EQU 0x02
PCLATH EQU 0x0A
TRISA EQU 0x85
TRISB EQU 0x86
OPTIONS EQU 0x81
STATUS EQU 3
RP0 EQU 5
PORTA EQU 0x05
PORTB EQU 0x06
EEDATA EQU 0x08
EEADR EQU 0x09
EECON1 EQU 0x88
EECON2 EQU 0x89
WREN equ 2
WR equ 1
RD equ 0
FSR EQU 4
F0 EQU 0
INTCON EQU 0x0B
C equ 0
Z equ 2
RBIF equ 0
RTIF equ 2
GIE equ 7
RBIE equ 3
Переменные и константы, используемые для вывода информации на индикатор
R_ST equ 3
C_ST equ 4
NumL EQU 0x0C
NumH EQU 0x0D
REZIM EQU 0x0E
Thou EQU 0x0F
Hund EQU 0x10
Tens EQU 0x11
Ones EQU 0x12
TEMP1 EQU 0x13
I EQU 0x14
J EQU 0x15
Переменные и константы, используемые в процедурах обработки прерываний и управления двигателями
Регистр программных флагов:
-
бит 0-устанавливается каждые 3.3с, сигнализирует о переполнении TimeL
-
бит 1-устанавливается после каждого нового измерения периода оборота
-
бит 2-Установлен если K_ZAP = 0%
-
бит 3-Установлен если K_ZAP = 100%
-
бит 4-Сбрасывается каждые 0.5с, для подавления "дребезга" при нажатии кнопок
-
бит 5-Устанавливается,если с момента последнего сохранения времени в EEROM прошло более 1 минуты
-
бит 7-Установлен,если включен режим стабилизации частоты вращения
FLAGS EQU 0x16
BACKUPW EQU 0x17
K_ZAP EQU 0x18
Ti12 EQU 0x19
Ti3 EQU 0x1A
T_KEY1 EQU 0x1B
N_STEP EQU 0x1C
TIMEA EQU 0x1D
TIMEL EQU 0x1E
TIME_IMPA EQU 0x1F
TIME_IMPL EQU 0x20
N_IMPULS EQU 0x21
F2L EQU 0x22
F2H EQU 0x23
FR_DOGT EQU 0x24
KF_ZAD EQU 0x25
F_REAL EQU 0x26
TIMER1 EQU 0x27
TIMER2 EQU 0x28
BACKUPS EQU 0x29
WTIMEL EQU 0x2A
WTIMEH EQU 0x2B
WI EQU 0x2C
Начальная инициализация контроллера и программы.
BSF STATUS, RP0 ;Устанавливаем страницу памяти 1
CLRF TRISA ;Настраиваем все линии порта А на вывод
MOVLW B'10000111'
GOTO BEGIN_PROG
Точка входа в процедуру обработки прерываний.
BCF INTCON, GIE ;Запрещаем прерывания
MOVWF BACKUPW ;Сохраняем содержимое рабочего регистра
MOVF STATUS, 0 ;и регистра STATUS
MOVWF BACKUPS
BTFSS INTCON, RTIF ;Определяем источник прерывания
GOTO L17 ;Иначе на обработку прерывания от датчика скорости CLRWDT ;Сбрасываем сторожевой таймер
Обработка прерывания от таймера. Выдача управляющих импульсов на транзисторы
;Шаг 1
MOVLW .1
SUBWF N_STEP, 0
BTFSS STATUS, Z
GOTO L28 ; не равно 1
MOVF Ti12, 0;Задаем выдержку времени до следующего шага
MOVWF RTCC
CALL GET_TIME ;Вызываем процедуру учета времени
INCF N_STEP
MOVLW .26;Дальше в зависимости от того, K_ZAP > 50% или K_ZAP < 50%
SUBWF K_ZAP, 0
BTFSC STATUS, C
GOTO L30 ;K_ZAP > 50%
; < 0.5
BTFSS FLAGS, 2 ;если K_ZAP = 0%,то импульс не выдаем
BSF PORTB, 4 ;Открываем VТ2
GOTO L27
; > 0.5
L30 BTFSS FLAGS, 3 ;если K_ZAP = 100%,то импульс не выдаем
BCF PORTB, 5 ;Закрываем VТ4
GOTO L27
;Шаг 2
L28 MOVLW .2
SUBWF N_STEP, 0
BTFSS STATUS, Z
GOTO L29
MOVF Ti12, 0 ;Задаем выдержку времени до следующего шага
MOVWF RTCC
CALL GET_TIME ;Вызываем процедуру учета времени
INCF N_STEP
MOVLW .26 ;Дальше в зависимости от того, K_ZAP > 50% или K_ZAP < 50%
SUBWF K_ZAP, 0
BTFSC STATUS, C
GOTO L65 ;K_ZAP > 50%
; < 0.5
BTFSS FLAGS, 3 ;если K_ZAP = 100%,то импульс не выдаем
BCF PORTB, 4 ;Закрываем VТ2
BTFSS FLAGS, 2 ;если K_ZAP = 0%,то импульс не выдаем
BSF PORTB, 5 ;Открываем VТ4
GOTO L27
; > 0.5
L65 BTFSS FLAGS, 3 ;если K_ZAP = 100%,то импульс не выдаем
BCF PORTB, 4 ;Закрываем VТ2
BTFSS FLAGS, 2 ;если K_ZAP = 0%,то импульс не выдаем
BSF PORTB, 5 ;Открываем VТ4
GOTO L27
;Шаг 3
L29 MOVF Ti3, 0 ;Задаем выдержку времени до следующего шага
MOVWF RTCC
CALL GET_TIME ;Вызываем процедуру учета времени
MOVLW .1
MOVWF N_STEP
MOVLW .26 ;Дальше в зависимости от того, K_ZAP > 50% или K_ZAP < 50%
SUBWF K_ZAP, 0
BTFSC STATUS, C
GOTO L31 ;K_ZAP > 50%
; < 0.5
BTFSS FLAGS, 3 ;если K_ZAP = 100%,то импульс не выдаем
BCF PORTB, 5 ;Запираем VТ4
GOTO L27
; > 0.5
L31 BTFSS FLAGS, 2 ;если K_ZAP = 0%,то импульс не выдаем
BSF PORTB, 4 ;Открываем VТ2
Опрос состояния кнопок управления
L27 BTFSC PORTB, 1 ;Проверка нажатия кнопки "Стоп"
GOTO L16
CLRF KF_ZAD ;Была нажата кнопка 3 ("Стоп"), K_ZAP:=0%
CLRF K_ZAP
BSF FLAGS, 2
BCF FLAGS, 3
Задержка перед повторным изменением KF_ZAD
L16 BTFSC FLAGS, 4
GOTO IRET
BSF FLAGS, 4
Обработка нажатия кнопок управления скоростью
BTFSS PORTB, 3 ;Назначение кнопок Вперед/Назад в зависимости
GOTO L46 ;от направления вращения привода
BTFSC PORTB, 2 ;Проверка нажатия кнопки "Вперед"
GOTO L18
BTFSC PORTB, 0 ;Проверка нажатия кнопки "Назад"
GOTO L15
GOTO IRET
L46 BTFSC PORTB, 2 ;Проверка нажатия кнопки "Вперед"
GOTO L15
BTFSC PORTB, 0 ;Проверка нажатия кнопки "Назад"
GOTO L18
GOTO IRET
;Увеличение KF_ZAD на 5(2)%
L15 MOVLW .100
SUBWF KF_ZAD, 0
BTFSC STATUS, Z
GOTO IRET ;KF_ZAD Уже достиг 100%
BTFSC FLAGS, 7 ;Если включен режим стабилизации,
MOVLW .5 ;то приращение KF_ZAD=5%
BTFSS FLAGS, 7 ;иначе приращение K_ZAP=2%
MOVLW .2
ADDWF KF_ZAD, 1
GOTO IRET
;Уменьшение KF_ZAD на 5(2)%
L18 MOVF KF_ZAD, 1
BTFSS STATUS, Z
GOTO L95
BTFSS PORTB, 3 ;KF_ZAD Уже достиг 0%
GOTO L96 ;Меняем направления вращения привода
BCF PORTB, 3
GOTO L15
L96 BSF PORTB, 3
GOTO L15
L95 BTFSC FLAGS, 7 ;Если включен режим стабилизации,
MOVLW .5 ;то приращение KF_ZAD=5%
BTFSS FLAGS, 7 ;иначе приращение K_ZAP=2%
MOVLW .2
SUBWF KF_ZAD, 1
Завершение обработки прерывания от таймера
IRET BCF INTCON, RTIF ;Сброс флага прерывания от таймера
MOVF BACKUPS, 0
MOVWF STATUS
MOVF BACKUPW, 0 ;Восстановление рабочего регистра
BSF INTCON, GIE ;Разрешение прерываний
RETFIE ;Возврат из обработки прерывания
Обработка прерывания от датчика частоты вращения двигателя
L17 BTFSS PORTB, 7
GOTO IRET2 ;Реагируем только на положительное изменение полярности
DECFSZ N_IMPULS, 1
GOTO IRET2
BCF INTCON, RBIE ;Запрещение прерываний от датчика скорости
MOVLW .2
MOVWF N_IMPULS
BTFSC FLAGS, 0 ;Произошло переполнение TIMEL, последнее измерение
GOTO L71 ;недействительно
Вычисляем время, прошедшее с начала отсчета импульсов от датчика скорости
MOVF TIME_IMPA, 0
SUBWF TIMEA, 0
BTFSS STATUS, C ;Проверяем на переполнение
INCF TIME_IMPL, 1
MOVWF TIME_IMPA
MOVF TIME_IMPL, 0
SUBWF TIMEL, 0
MOVWF TIME_IMPL
MOVLW .1 ;Учитываем текущее содержимое таймера RTCC
SUBWF N_STEP, 0
BTFSS STATUS, Z
GOTO L19
MOVF Ti3, 0
GOTO L75
L19 MOVF Ti12, 0
L75 SUBWF RTCC, 0
ADDWF TIME_IMPA, 1
BTFSS STATUS, C ;Проверяем на переполнение
INCF TIME_IMPL, 1
MOVF TIME_IMPA, 0
MOVWF F2L
MOVF TIME_IMPL, 0
MOVWF F2H
L71 BSF FLAGS, 1 ;Сигнализируем процедуре STABIL об окончании измерения
Завершение обработки прерывания от датчика частоты вращения
IRET2 MOVLW .40 ;Устанавливаем в программный таймер максимально
MOVWF FR_DOGT ;допустимую задержку до прихода следующего импульса
BCF INTCON, RBIF ;сброс флага прерываний от PORTB
MOVF BACKUPS, 0
MOVWF STATUS ;Восстановление регистра STATUS
MOVF BACKUPW, 0 ;Восстановление рабочего регистра
BSF INTCON, GIE ;Разрешение прерываний
RETFIE ;Возврат из обработки прерывания
Продолжение начальной инициализации
BEGIN_PROG
MOVWF TRISB ;Настраиваем входы 0, 1, 2, 7 порта В на ввод.
MOVLW B'01000111' ;Подключаем пределитель к таймеру и устанавливаем коэффициент
MOVWF OPTIONS ;деления 1:128, сигнал на таймер от внутреннего генератора
BCF STATUS, RP0 ;Устанавливаем страницу памяти 0
CLRF PORTB
CLRF F_REAL ;Инициализируем используемые в программе
CLRF K_ZAP ;переменные
CLRF KF_ZAD
MOVLW .40
MOVWF T_KEY1
CLRF TIMEA
CLRF TIMEL
MOVLW .1
MOVWF N_STEP
MOVLW .2
MOVWF N_IMPULS
MOVLW .20
MOVWF FR_DOGT
CLRF TIMER1
CLRF TIMER2
CLRF FLAGS
BSF FLAGS, 2
MOVLW .128
MOVWF Ti12
MOVWF Ti3
MOVLW .18
MOVWF WI
Загружаем из энергонезависимой памяти общее время работы системы
CALL LEEPROM
MOVLW .5
SUBWF REZIM, 0
BTFSC STATUS, Z
BSF FLAGS, 7
MOVLW B'10101000' ;Разрешаем прерывание от изменения на RB
MOVWF INTCON ;и переполнения таймера
Блок-схема алгоритма работы устройства представлена в приложении А.