Вы находитесь на странице: 1из 21

7/12.

Защита нагрузки импульсного стабилизатора от "бяки" в случаях выхода


контролируемого параметра за пределы "зоны" стабилизации ("полуавтомат" и
"автомат"). "Снятие сливок".

Итак, имеется некий "рабочий" (расчетный) диапазон Uрег., на работу внутри которого
"ориентировано" устройство стабилизации.
А что если реальное значение Uрег. выйдет за "границы" этого диапазона, ведь в
жизни всякое бывает?
В этом случае, будет иметь место быть скачкообразное изменение скважности, что,
мягко говоря, совсем не есть "зер гут" (да и обидно до слез: "за что кровь пролита"?).
Значит, нужно не допустить этого, то есть, в случае выхода Uрег. за пределы
диапазона стабилизации, нужно, в простейшем случае, заблокировать работу устройства.
В случае срабатывания блокировки, с целью защиты нагрузки КК от "надрыва пупка",
нужно надежно закрыть транзистор ключевого каскада (погасить лампочку).
Такую блокировку можно осуществить, если работать с двумя источниками аналогового
сигнала.
Например, на аналоговый вход AN0, подается сигнал управления, уровень которого
зависит от величины Uрег., а на аналоговый вход AN1 подается некое напряжение
фиксированного уровня.
В этом случае, можно вычислить абсолютную разницу, и что самое главное,
сформировать, с обеих сторон от "рабочей зоны", "аварийные зоны", в пределах
которых знак результата вычитания будет противоположен знаку результата вычитания,
произведенного в пределах "рабочей зоны".
Вот Вам и критерий блокировки, обеспечивающий частичную (будет "расшифровано"
ниже) "нейтрализацию бяки".
В "железе", это выглядит так:

1
Это устройство осуществляет "мертвую" блокировку ШИМ-модулятора (на выходе - ноль)
при первом же попадании Uрег. в любую из двух "зон блокировки".
Слово "мертвая" означает то, что, после срабатывания блокировки, устройство
перестает реагировать на любые изменения Uрег. и разблокировать его можно только
при помощи кнопки "Разблокировка" (с нормально замкнутыми контактами).
Если, после разблокировки, имеет место быть все та же "бяка", то ШИМ-модулятор
опять заблокируется.
Таким образом, имеет место быть случай типа "пока есть бяка, нагрузка отдыхает".
Между прочим, это достаточно актуально (защита от тех, кто думает, что, например,
между 220 и 127/380 вольтами нет разницы).
При разблокировке, применен сброс по включению питания (POR).
В этом случае, к левому (по схеме) выводу кнопки КН, не желательно подключать
электролитический конденсатор емкостью более 10 мкф, а лучше вообще обойтись без
него.
В противном случае, при размыкании кнопки КН, какую-то часть времени (зависит от
емкости конденсатора) устройство будет запитано от этого конденсатора, что, при
кратковременном (быстром) нажатии/отжатии кнопки, приводит к отсутствию сброса
(проверено на практике. Использовал С = 100 Мкф).
Ниже Вы видите "разрисовку" "вышележащей" задумки:

На рис. 2 прекрасно видно, что, в результате работы с двумя источниками аналогового


сигнала, один из которых (делитель напряжения R10/R11) формирует фиксированный
уровень напряжения (подается на вход AN1), с обеих сторон от "рабочей зоны",
"рождаются" две одинаковые по ширине, "зоны блокировки" ("Авария").
"Рабочая зона" это диапазон напряжений, в пределах которого осуществляется
стабилизация.
Понятие "диапазон изменения Uупр." является двуединым, что "порждает" некую
двусмысленность.
1. Расчетный диапазон изменения Uупр. есть диапазон напряжений выбранного
сектора (в данном случае, 2-го: 1,28 … 2,56 в.).

2
Расчетный диапазон изменения Uупр. вычисляется после того, как определены
битность АЦП и величина опорного напряжения, а также выбран сектор.
После этого, ему "присваивается статус эталона".
Расчетный диапазон изменения Uупр. существует только "на бумаге и в головах".
Его уровни не управляют ШИМ-модулятором, но к ним "жестко привязана"
длительность импульсов.
На рис. 2 (а также и на других рисунках), указан расчетный диапазон изменения
Uупр.
2. ШИМ-модулятором управляют уровни реального диапазона изменения Uупр.
В данном случае, реальный диапазон изменения Uупр. формируется на выходе
операционного усилителя.
Задача конструктора состоит в том, чтобы, в контексте решаемой задачи, программно –
аппаратными средствами, привести реальный диапазон изменения Uупр. в соответствие
расчетному диапазону изменения Uупр. (наложить первое на второе или "подвести
реалии под эталон").
На рис. 2 (а также и на других рисунках), реальный диапазон изменения Uупр. не
указан, а указан заданный диапазон изменения Uрег.
Любое изменение диапазона Uрег. должно заканчиваться его преобразованием в
реальный диапазон изменения Uупр., "рабочая зона" которого располагается
внутри расчетного диапазона изменения Uупр.
"Геморройно"? Вне всякого сомнения.
Но другого не дано, так как это "епархия аналоговой техники", а в ней все какое-то не
квадратное и не перпендикулярное, а "шаляй-валяйное".
Так бы и "выпорол ремнем", да толку от этого абсолютно никакого, так как эта "особа"
есть типичная "женщина", которую невозможно перевоспитать (природа как следует
постаралась).
Остается только "закрыть глаза на ее природные недостатки" (воевать с природой -
наиглупейшее занятие) и "могуче ее любить", так как "румяных детишек" очень
хочется.
Вернусь к своим "котлетам".
Значение Uan1 можно задать любым (в пределах расчетного диапазона изменения
Uупр., в данном случае, 2-го сектора).
Величина этого напряжения определяет ширину обеих "зон блокировки".
Для определенности, я "привязался" к Uan1 = 1,4 в., но можно выбрать и другое
значение.
Надписи, выделенные синим цветом, это практический результат работы "железяки",
который соответствует расчетному:
Количество "квантовок" в "рабочей зоне" = (2,56 – 1,4)/0,005 = 232.
Количество "квантовок" в "зоне блокировки" = (1,4 – 1,28)/0,005 в. = 24
(или 256 – 232 = 24).
Это означает то, что имеют место быть "квантовки" с №№ 0 … 23 (0 входит в "зону
блокировки").
Примечание: 232 это номер "граничной квантовки", "выше которой не прыгнешь",
следовательно, про "импульсогубительные, подлые квантовки" с №№252 … 255 можно
"забыть".
Теперь нужно вычислить величину расчетного Uупр., при котором будет иметь место
быть "меандр".
В "рабочей зоне" находится 232 "квантовки".
Это 232 х 0,005 = 1,16 в.
Составляем пропорцию: 232 à 1,16 в.
128 à Х
Cледовательно, Х = (128 х 1,16)/232 = 0,64 в.
1,4 в. + 0,64 в. = 2,04 в.
Это и есть то расчетное Uупр., которое соответствует "меандру".
Теперь смотрим что получилось.
В границах "рабочей зоны", получилось нарушение симметрии, ведь 2,04 – 1,4 = 0,64, а
2,56 – 2,04 = 0,52 в.
В случае, если требуется, чтобы при Uрег. = 10,75 в., генерировался "меандр"
(я "привязался" к этому случаю), получается то, что Вы видите на рис. 2.
3
При этом, по сравнению со случаем, рассмотренным в предыдущем подразделе, в
части касающейся расчетного Uупр., ширина "рабочей зоны" уменьшилась на величину
Uan1, то есть, в данном случае, на 0,12 в., то есть, часть "ресурса" выделена под
"аварийные дела".
В пересчете на Uрег., при прочих равных условиях, это соответствует уменьшению
ширины диапазона Uрег. примерно на 9 … 10%.
Ничего страшного в этом нет, так как ничто не мешает скомпенсировать эти "потери"
путем изменения реального Uупр.
Изменяя (по-умному, под конкретную задачу, а не абы как) настройки
дифференциального усилителя, можно расширить/сузить диапазон изменения Uрег.
и/или сместить этот диапазон (а соответственно и его середину) относительно
расчетного диапазона изменения Uупр., ведь "привязка к меандру" условна.
Вариантов - "тьма". Нужно только как следует прочувствовать "механизм" этой работы
и на бумаге, и в "железе".
Программа под устройство, принципиальная схема которого изображена на рис. 1,
называется Stabil_2.asm (прилагается).

;********************************************************************************
; Stabil_2.asm Импульсный стабилизатор мощности с блокировкой ШИМ-сигнала в
; случаях выхода управляющего напряжения за пределы "рабочей зоны".
; Вариант №1 ("полуавтомат").
;--------------------------------------------------------------------------------
; "Связка" модуль АЦП / модуль CCP работает в режиме ШИМ-модулятора.
; 8-битный результат АЦП и его правое выравнивание.
; Номер "квантовки" отображается в линейке
; из 3-х 7-сегментных индикаторов.
; Незначащие нули гасятся в двух десятичных разрядах (кроме младшего).
; Индикация - динамическая.
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; Функции выводов порта А:
; RA0 - вход 1-го канала АЦП,
; RA1 - вход 2-го канала АЦП,
; остальные выводы порта А не задействованы.
; Функции выводов порта В:
; RB0...RB7 - управление секторами A,B,C,D,E,F,H,G.
; Функции выводов порта С:
; RC2 - выход модуля CCP (выход ШИМ),
; RC0, RC1, RC3 - выходы дешифратора,
; RC4 - сигнал выхода за границы рабочего сектора ("Авария"),
; остальные выводы порта C не задействованы.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Опорное напряжение -> Uпит. ПИКа.
; Частота импульсов -> 1000 Гц.
; Используется PIC16F873A.
;----------------------------------------------
; Объем программы: 190 слов в памяти программ.
;================================================================================
LIST p=16F873A ; "Привязка" к типу микроконтроллера.
__CONFIG 3F31H ; XT-генератор, PWRT вкл., защита выкл., сброс
; BOR запрещен, LVP выкл., DEBUG выкл.
;================================================================================
; Регистры специального назначения.
;================================================================================
IndF equ 00h ; Доступ к памяти через FSR.
PCL equ 02h ; Счетчик команд.
Status equ 03h ; Регистр Status.
FSR equ 04h ; Регистр косвенной адресации.
PortB equ 06h ; Регистр защелок порта B.
PortC equ 07h ; ----------"---------- C.

4
TrisB equ 06h ; Регистр выбора направлений работы
; выводов порта В (банк 1).
TrisC equ 07h ; ----------"---------- C (банк 1).
;-------------------------------------
; Регистры, обеспечивающие АЦП.
;-------------------------------------
AdresL equ 1Eh ; Регистр младшего байта результата АЦП
; (банк 1).
Adcon0 equ 1Fh ; Регистр настройки модуля АЦП.
Adcon1 equ 1Fh ; Регистр настройки модуля АЦП (банк 1).
;-------------------------------------
; Регистры, обеспечивающие ШИМ.
;-------------------------------------
PIR1 equ 0Ch ; Регистр флагов прерываний
; от периферийных модулей.
T2CON equ 12h ; Регистр управления модулем таймера TMR2.
CCP1CON equ 17h ; Регистр управления модулем CCP.
CCPR1L equ 15h ; Регистр младшего байта CCP.
PR2 equ 12h ; Регистр периода (банк 1).
;================================================================================
; Регистры общего назачения.
;================================================================================
LED0 equ 20h ; Регистр хранения результатов преобразований
; 1-го двоично-десятичного разряда.
LED1 equ 21h ; ------- 2-го -------------------------
LED2 equ 22h ; ------- 3-го -------------------------
Index equ 23h ; Счетчик количества малых колец индикации.
Temp equ 24h ; Многофункциональный регистр.
Mem equ 25h ; Регистр оперативной памяти
; 2/10 преобразования.
Count equ 26h ; Регистр счетчика.
Temp_1 equ 27h ; Регистр результата 1-го АЦП.
Temp_2 equ 28h ; Регистр результата 2-го АЦП.
Flag equ 29h ; Указатель каналов.
G_Kaput equ 2Ah ; Регистр блокировки.
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;================================================================================
; Присвоение битам названий.
;================================================================================
C equ 0 ; Флаг переноса-заема.
Z equ 2 ; Флаг нулевого результата.
RP0 equ 5 ; Бит выбора банка.
GO equ 2 ; Бит статуса модуля АЦП.
TMR2IF equ 1 ; Флаг прерывания по переполнению TMR2.
;================================================================================
org 0 ; Начать выполнение программы
;с 0-го адреса PC.
;********************************************************************************

;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
; "Противодребезговая" адержка 0,5 сек. (без 2-х мкс.)
;------------------------------------------------------------
movlw .85 ;
movwf LED0 ; Чтобы не "размножать"
movlw .138 ; количество регистров
movwf LED1 ; общего назначения,
movlw .3 ; используются LEDы.
movwf LED2 ;
5
WR decfsz LED0,F ;
goto WR ; Стандартный,
decfsz LED1,F ; 3-байтный,
goto WR ; вычитающий
decfsz LED2,F ; счетчик.
goto WR ;
;------------------------------------------------------------
; Перевод в пассивное состояние всех выходов дешифратора (для
; исключения "мелькания" при включении питания), подготовка
; к работе регистров указателя каналов и блокировки.
;------------------------------------------------------------
bsf PortC,0 ; Предустановка состояний
bsf PortC,1 ; выходов дешифратора
bsf PortC,3 ; RC0, RC1, RC3.
clrf Flag ; Подготовка указателя каналов.
clrf G_Kaput ; Сброс регистра блокировки
; (для обеспечения разблокировки).
;-------------------------------------------
; Задание длительности периода сигнала ШИМ
; и настройка направлений работы.
;-------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
clrf TrisC ; Все выводы порта С работают на выход.
clrf TrisB ; Все выводы порта В работают на выход.
movlw .62 ; Задание длительности
movwf PR2 ; периода (.62).
;-------------------------------------------
; Работа с регистром Adcon1.
;-------------------------------------------
movlw b'10000100' ; Диапазон квантования напряжения от -Vss до
movwf Adcon1 ; +Vdd, AN0,AN1,AN3-аналоговые входы,
; AN2,AN4 - цифровые каналы ввода/вывода,
; правое выравнивание.
bcf Status,RP0 ; Переход в 0-й банк.
;------------------------------------------
; Настройка модуля CCP.
;------------------------------------------
movlw b'00001111' ; Включение
movwf CCP1CON ; режима ШИМ.
;------------------------------------------
; Настройка модуля TMR2.
;------------------------------------------
movlw b'00000111' ; TMR2 включен, Кдел.предделителя = 16,
movwf T2CON ; Кдел.выходного делителя = 1.

;################################################################################
; Циклическая подпрограмма "оцифровки" уровней аналоговых сигналов,
; присутствующих на выводах RA0, RA1, и перевода результатов этой "оцифровки"
; в длительность импульса.
;################################################################################
; Сначала производится "оцифровка" (задействуется модуль АЦП).
;********************************************************************************
; Проверка блокировки и работа с регистром Adcon0.
;-------------------------------------------------
; 1-й сценарий АЦП.
;-------------------
SNOVA_1 btfss G_Kaput,0 ; Блокировка есть или нет ?
goto $+3 ; Если блокировки нет, то обход 2-х следующих
; команд.
clrf CCP1CON ; Если блокировка есть, то выключение модуля
goto Bin2_10 ; CCP и переход в ПП Bin2_10.

movlw b'01000001' ; Включение модуля АЦП, выбор канала AN0


movwf Adcon0 ; (RA0), источник тактового сигнала Fosc/8,
; состояние ожидания, конденсатор подключен к
6
; выбранному аналоговому входу и начал
; перезаряжаться.
goto PAUSE ; Обход сценария 2-го АЦП.
;-------------------
; 2-й сценарий АЦП.
;-------------------
SNOVA_2 incf Flag,F ; Flag+1=нечетное число (Flag,0=1).
bsf Adcon0,3 ; Выбор канала AN1 (RA1). Остальные
; настройки Adcon0 не меняются.
;------------------------------------------------
; Задержка для перезаряда конденсатора.
;------------------------------------------------
PAUSE movlw .6 ; Стандартный,
movwf Count ; вычитающий,
decfsz Count,F ; однобайтный
goto $-1 ; счетчик.
;-------------------------------------------
; Начало аналого-цифрового преобразования.
;-------------------------------------------
bsf Adcon0,GO ; Включение преобразования. Конденсатор
; отключается от аналогового входа на время
; преобразования.
;-------------------------------------------
; Ожидание окончания АЦП ("плавающая" задержка).
;-------------------------------------------
btfsc Adcon0,GO ; Ожидание окончания аналого-цифрового
goto $-1 ; преобразования.
;----------------------------------------------
; АЦП закончено. Результат - в AdresH/AdresL.
; AdresH не задействуется, т.к. "битность" = 8.
;----------------------------------------------
; Выбор сценария копирования результата.
;-------------------------------------------
btfsc Flag,0 ; Если Flag,0 = 0, то результат 1-го АЦП
goto OBHOD ; копируется в Temp_1, а если = 1, то
; результат 2-го АЦП копируется в Temp_2.
;-------------------------------------------
; Копирование результата в Temp_1.
;-------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
movf AdresL,W ; AdresL --> W.
bcf Status,RP0 ; Переход в 0-й банк.
movwf Temp_1 ; W --> Temp_1.

goto SNOVA_2 ; Переход на начало 2-го АЦП.


;-------------------------------------------
; Копирование результата в Temp_2.
;-------------------------------------------
OBHOD bsf Status,RP0 ; Переход в 1-й банк.
movf AdresL,W ; AdresL --> W.
bcf Status,RP0 ; Переход в 0-й банк.
movwf Temp_2 ; W --> Temp_2.
;-------------------------------------------
; Теперь модуль АЦП можно выключить.
;-------------------------------------------
clrf Adcon0 ; Для снижения потребляемого устройством тока,
; модуль АЦП выключается до конца отработки
; текущего полного цикла программы.
;---------------------------------------------------------
; ИТОГ: в Temp_1 "лежит" результат 1-го АЦП,
; в Temp_2 "лежит" результат 2-го АЦП.
;================================================================================
; Вычисление абсолютной разницы и определение знака.
;================================================================================
bcf PortC,4 ; "Аварийный" светодиод гасится.
;------------------------------------------
7
; Temp_2 больше Temp_1 или наоборот ?
;------------------------------------------
movf Temp_1,W ; Temp_2 - Temp_1 = ...
subwf Temp_2,W ; Результат - в W.
btfsc Status,C ; Результат "+" или "-" ?
goto $+2 ; Если "+" или =0.
goto $+5 ; Если "-".
;------------------------
; Temp_2 больше Temp_1
;------------------------
bsf G_Kaput,0 ; Блокировка.
bsf PortC,4 ; "Загорание" светодиода ("Авария").
clrf Temp_2 ; Имитация нулевого результата вычисления
; абсолютной разницы.
goto CCP ; Выход из процедуры вычисления с
; "горящим" светодиодом "Авария".
;------------------------
; Temp_1 больше Temp_2
;------------------------
movf Temp_2,W ; Temp_1 - Temp_2 = ...
subwf Temp_1,W ; Результат - в W.
movwf Temp_2 ; W --> Temp_2.
; Выход из процедуры вычисления с
; "погашенным" светодиодом "Авария".

;********************************************************************************
; Далее производится перевод абсолютной разницы в длительность импульса.
;********************************************************************************
; "Загрузка" результата АЦП, из Temp_2, в CCPR1L/CCP1CON,5,4.
;================================================================================
; Определение момента начала "загрузки" в CCPR1L/CCP1CON,5,4.
;------------------------------------------------------------
CCP bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.

btfss PIR1,TMR2IF ; Проверка состояния флага


goto $-1 ; прерывания по переполнению TMR2.
;------------------------------------------------------------
; Сохранение содержимого Temp_2 в Temp (для ПП Bin2_10).
;------------------------------------------------------------
movf Temp_2,W ; Temp_2 --> Temp.
movwf Temp ;
;------------------------------------------------------------
; "Загрузка" Temp_2,1,0 в CCP1CON,5,4 (1-->5, 0-->4).
;------------------------------------------------------------
btfsc Temp_2,1 ;
goto $+3 ; Бит №1 регистра Temp_2
bcf CCP1CON,5 ; копируется в бит №5
goto $+2 ; регистра CCP1CON.
bsf CCP1CON,5 ;

btfsc Temp_2,0 ;
goto $+3 ; Бит №0 регистра Temp_2
bcf CCP1CON,4 ; копируется в бит №4
goto $+2 ; регистра CCP1CON.
bsf CCP1CON,4 ;
;------------------------------------------------------------
; "Загрузка" Temp_2,7...2 в CCPR1L,5...0.
;------------------------------------------------------------
rrf Temp_2,F ; Содержимое Temp_2 сдвигается
rrf Temp_2,F ; вправо на 2 бита.

movf Temp_2,W ; Содержимое Temp_2


movwf CCPR1L ; "загружается" в CCPR1L.
;------------------------------------------------------------
; Сброс CCPR1L,7,6.
;------------------------------------------------------------
8
bcf CCPR1L,6 ; В двух старших разрядах
bcf CCPR1L,7 ; устанавливаются нули.

bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.

;********************************************************************************
; ГРУППА ПОДПРОГРАММ ПРЕОБРАЗОВАНИЯ 2-БАЙТНЫХ ДВОИЧНЫХ ЧИСЕЛ В 3-РАЗРЯДНЫЕ
; ДЕСЯТИЧНЫЕ ЧИСЛА
;********************************************************************************
----------------------
;********************************************************************************
; Подпрограмма гашения незначащих нулей.
;********************************************************************************
----------------------
;********************************************************************************
; ПОДПРОГРАММА ДИНАМИЧЕСКОЙ ИНДИКАЦИИ
;********************************************************************************
----------------------
goto SNOVA_1 ; Переход на новый цикл преобразования.
;********************************************************************************
end ; Конец программы.

Красным цветом выделены "нововведения".


Темно – красным цветом выделено то, что относится к процедуре АЦП.
Синим цветом выделено то, что относится к формированию ШИМ-сигнала.
Фиолетовым цветом выделено то, что относится к вычислению абсолютной разницы.
Темно – синим цветом выделен "стандартный набор" ПП (2/10 преобразования,
гашения незначащих нулей и динамической индикации).

Программа Stabil_2.asm "сконструирована" из "кусков" ранее составленных программ.


Под блокировку, "прописан" (назначен) регистр с интригующим названием G_Kaput.
В процедуре вычисления абсолютной разницы и определения знака, производится
проверка знака результата операции Temp_2 – Temp_1 = ….
Причем, в данном случае, если имеет место быть положительный или нулевой
результат, то с вычисленной абсолютной разницей ничего делать не нужно ("холостой
выстрел"), а нужно заблокироваться (по "знаковому критерию").
Почему именно так, а не по-другому?
Потому, что имеет место быть аппаратная инверсия.
В случае наличия отрицательного результата, абсолютная разница вычисляется
"штатно".
Если бы аппаратной инверсии не было, то все было бы наоборот.
В случае наличия положительного или нулевого результата, осуществляется не сама
блокировка, а только подготовка к ней.
Эта подготовка заключается в том, что в бите №0 регистра G_Kaput, выставляется 1
(в начале программы, он сбрасывается в 0).
После этого, "зажигается" светодиод "Авария".
Для того чтобы, в текущем полном цикле программы, на выходе модуля CCP,
установить нулевой уровень (закрыть транзистор КК) и обеспечить выведение на
индикацию символа "0", в регистр Temp_2 записывается 0.
Далее, программа отрабатывается "штатно", и только что сказанное будет сделано.
После отработки текущего, полного цикла программы, осуществляется переход на
новый, полный цикл программы (goto SNOVA_1).
В его начале, производится проверка состояния бита №0 регистра G_Kaput.
Если блокировка имеет место быть (G_Kaput,0 = 1), то модуль CCP выключается (при
этом, выход модуля CCP отключается от вывода RC2, и к нему подключается выход
защелки), после чего, на базе транзистора КК, "намертво" устанавливается нулевой
уровень, формируемый, по умолчанию, на выходе защелки вывода RC2.
После этого, транзистор КК будет гарантированно заперт вплоть до разблокировки, так
как состояние выхода защелки вывода RC2 не меняется (она всегда в нуле).
Это и есть сама блокировка.
После этого, осуществляется переход в ПП Bin2_10.
9
Это сделано для того чтобы, в случае блокировки, на индикацию был выведен символ
"0".
Он будет выведен на индикацию по причине того, что ранее, содержимое регистра
Temp_2 было сброшено в 0, и он был скопирован в регистр Temp.
Этот "0" будет выводиться на индикацию вплоть до разблокировки.
В принципе, это "архитектурное излишество" не нужно, так как есть светодиод
"Авария", но я, чтобы "добру не пропадать", сделал так, а не иначе.
Если кто-то из Вас пожелает сделать "иначе", то замените команду goto Bin2_10 на
команду goto SNOVA_1.
В этом случае, в течение всего времени блокировки, линейка 7-сегментных
индикаторов будет "мертвой".
Как разблокироваться?
Я применил сброс по включению питания (POR).
В этом случае, питание +5 в подается через кнопку "Разблокировка" (см. рис. 1).
После того, как эта кнопка будет нажата и отжата, программа начнет исполняться со
своего начала.
В данном случае, она начнет исполняться с "противодребезговой" задержки 0,5 сек.
Можно сделать и меньше. Можно даже вообще без нее обойтись, но желательно,
чтобы она была (кнопки разные бывают).
После ее отработки, содержимое регистра блокировки G_Kaput сбрасывается в 0
(снятие блокировки), и отрабатывается текущий, полный цикл программы.
Если уровень Uрег. будет находиться в пределах "рабочей зоны", то блокировки не
произойдет, а если выйдет за эти пределы, то произойдет.
Вот такая "железобетонная" логика.
Но у такого принципа блокировки есть два "прокола".
1. Нужен кто-то "жмущий" на кнопку (получается что-то типа "полуавтомата").
2. При наличии быстрых (резких) изменений Uрег., может произойти "перескок
аварийной зоны" (всегда нужно ориентироваться на худшее). На рис. 1, это
обозначено словом "Бяка".
От нее вполне можно избавиться, например, подключив параллельно резистору R3
электролитический конденсатор (сглаживание резких "скачков"), но это есть лишняя
инерционность, которая, в случае "задирания планки требований", не есть "зер гут".
Значит, нужно придумать что-то "бесконфузное", быстрое, да еще и полностью
автоматическое.
Вопрос: "Означает ли это то, что работа проделана зря"?
Ответ: не в коем разе, так как очередная "порция" полезной и нужной информации "в
одно ухо влетела и … заимела большущие проблемы с поиском другого уха", да и
объективно сравнить следующий "чудо-юдо-аппарат" будет с чем.
Сие есть приобретение знаний и опыта (в "чистом виде") со всеми вытекающими …
Так что, все в полном порядке, и для печали нет причин, так как процесс умственного
развития идет и даже бежит (это как на войне - за один месяц три дают).
Ищу "стратегическую лазейку", "просочившись" в которую, можно было бы обеспечить
отсутствие неучтенных и подлых "Гитлер капутов".
Примечание: все "Гитлер капуты" (даже малюсенькие) должны быть строго плановыми
(учет строгий и поштучный).
Все остальные "Гитлер капуты" должны быть "осуждены за шпионаж" и "изолированы
от общества".
"Убивать" не нужно. Это не умно. А вдруг понадобятся?
Ведь когда "заклинит", то мозговитые люди "клин клином выбивают".
Первым делом, на ум приходит вариант с тремя источниками аналогового сигнала:
Uупр. и два фиксированных (после настройки), "граничных" уровня напряжений
("верхний" и "нижний").
Но и в этом случае, вышеупомянутая "бяка" как была, так и останется, так как
разделение на секторы никто не отменял, да и "геморройно" это.
Приплыли?
Так точно. Если "лапки сложить".
В этом случае, "счастья не видать". Такая перспектива вообще не прельщает.
Значит, нужно искать "счастье" там, "где Макар телят не гонял".
"Не гонял он их" в регистре AdresH.
10
И в самом деле, ранее он был просто проигнорирован со ссылкой на то, что имеет
место быть 8-битный результат АЦП.
В связи с этим, возникает насущнейший вопрос: "Что происходит в регистре AdresH, с
учетом того, что АЦП как было 10-разрядным, так оно им и останется до гробовой
доски"?
После такой "лобовой наводки", не трудно догадаться, что, при правом выравнивании
результата АЦП, активны будут два младших бита регистра AdresH, и в зависимости
от того сектора, в котором происходит работа, в этих двух битах будет "лежать":
- либо .0 (работа в 1-м секторе),
- либо .1 (работа в 2-м секторе),
- либо .2 (работа в 3-м секторе),
- либо .3 (работа в 4-м секторе).
Из этого следует "гениальный, как амёба", вывод: содержимое регистра AdresH и
есть критерий блокировки/разблокировки.
Что это дает?
Это позволяет "превратить" "полуавтомат" в "автомат" (избавиться от кнопки), плюс,
освобождается вывод порта А, плюс, имеют место быть высокостабильные "граничные"
уровни, задаваемые банальным назначением "рабочего" сектора (нужно выставить
константу и все дела. Значение константы - см. выше), который "автоматически"
совпадает c "рабочей зоной".
В данном случае, "рабочим" сектором является 2-й сектор, и зависимость длительности
импульсов от Uрег. будет точно такой же, как и зависимость, изображенная на рис. 3
предыдущего подраздела.
Принципиальная схема устройства:

11
Как видите, принципиальная схема упростилась (по сравнению с рис. 1), и она мало
чем отличается от принципиальной схемы, изображенной на рис. 2 предыдущего
подраздела.
Разница только в том, что задействован вывод RC4.
Кнопка разблокировки отсутствует, так как устройство "само выбирает", когда ему
заблокироваться, а когда разблокироваться ("автомат").
"Мертвой" блокировки, о которой ранее шла речь, нет.
Этот выбор зависит от того, находится ли текущий уровень Uрег. в пределах 2-го
сектора или не находится.
Если, после блокировки (во время блокировкии, транзистор КК заперт), Uрег. "вернется"
в пределы 2-го сектора, то устройство автоматически разблокируется (нагрузка КК
запитается и мощность будет застабилизирована).
Программа под это устройство называется Stabil_3.asm (прилагается).

;********************************************************************************
; Stabil_3.asm Импульсный стабилизатор мощности с блокировкой ШИМ-сигнала в
; случаях выхода управляющего напряжения за пределы "рабочей зоны"
; Вариант №2 ("автомат").
;--------------------------------------------------------------------------------
; "Связка" модуль АЦП / модуль CCP работает в режиме ШИМ-модулятора.
; 8-битный результат АЦП и его правое выравнивание.
; Номер "квантовки" отображается в линейке
; из 3-х 7-сегментных индикаторов.
; Незначащие нули гасятся в двух десятичных разрядах (кроме младшего).
; Индикация - динамическая.
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; Функции выводов порта А:
; RA0 - вход канала АЦП,
; остальные выводы порта А не задействованы.
; Функции выводов порта В:
; RB0...RB7 - управление секторами A,B,C,D,E,F,H,G.
; Функции выводов порта С:
; RC2 - выход модуля CCP (выход ШИМ),
; RC0, RC1, RC3 - выходы дешифратора,
; RC4 - сигнал выхода за границы рабочего сектора ("Авария"),
; остальные выводы порта C не задействованы.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Опорное напряжение -> Uпит. ПИКа.
; Частота импульсов -> 1000 Гц.
; Используется PIC16F873A.
;----------------------------------------------
; Объем программы: 159 слов в памяти программ.
;================================================================================
LIST p=16F873A ; "Привязка" к типу микроконтроллера.
__CONFIG 3F31H ; XT-генератор, PWRT вкл., защита выкл., сброс
; BOR запрещен, LVP выкл., DEBUG выкл.
;================================================================================
; Регистры специального назначения.
;================================================================================
IndF equ 00h ; Доступ к памяти через FSR.
PCL equ 02h ; Счетчик команд.
Status equ 03h ; Регистр Status.
FSR equ 04h ; Регистр косвенной адресации.
PortB equ 06h ; Регистр защелок порта B.
PortC equ 07h ; ----------"---------- C.
TrisB equ 06h ; Регистр выбора направлений работы выводов
; порта В (банк 1).
TrisC equ 07h ; ----------"---------- C (банк 1).
;-------------------------------------
; Регистры, обеспечивающие АЦП.
12
;-------------------------------------
AdresH equ 1Eh ; Регистр старшего байта результата АЦП.
AdresL equ 1Eh ; Регистр младшего байта результата АЦП
; (банк 1).
Adcon0 equ 1Fh ; Регистр настройки модуля АЦП.
Adcon1 equ 1Fh ; Регистр настройки модуля АЦП (банк 1).
;-------------------------------------
; Регистры, обеспечивающие ШИМ.
;-------------------------------------
PIR1 equ 0Ch ; Регистр флагов прерываний
; от периферийных модулей.
T2CON equ 12h ; Регистр управления модулем таймера TMR2.
CCP1CON equ 17h ; Регистр управления модулем CCP.
CCPR1L equ 15h ; Регистр младшего байта CCP.
PR2 equ 12h ; Регистр периода (банк 1).
;================================================================================
; Регистры общего назачения.
;================================================================================
LED0 equ 20h ; Регистр хранения результатов преобразований
; 1-го двоично-десятичного разряда.
LED1 equ 21h ; ------- 2-го -------------------------
LED2 equ 22h ; ------- 3-го -------------------------
Index equ 23h ; Счетчик количества малых колец индикации.
Temp equ 24h ; Многофункциональный регистр.
Mem equ 25h ; Регистр оперативной памяти
; 2/10 преобразования.
Count equ 26h ; Регистр счетчика.
Temp_L equ 27h ; Регистр 8-разрядного результата АЦП.
Temp_H equ 28h ; Регистр признака блокировки.
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;================================================================================
; Присвоение битам названий.
;================================================================================
C equ 0 ; Флаг переноса-заема.
Z equ 2 ; Флаг нулевого результата.
RP0 equ 5 ; Бит выбора банка.
GO equ 2 ; Бит статуса модуля АЦП.
TMR2IF equ 1 ; Флаг прерывания по переполнению TMR2.
;================================================================================
org 0 ; Начать выполнение программы
; с 0-го адреса PC.
;********************************************************************************

;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
; Перевод в пассивное состояние всех выходов дешифратора
; (для исключения "мелькания" при включении питания).
;-------------------------------------------------------
bsf PortC,0 ; Предустановка состояний
bsf PortC,1 ; выходов дешифратора
bsf PortC,3 ; RC0, RC1, RC3.
bcf PortC,4 ; "Гашение" светодиода "Авария".
;-------------------------------------------
; Задание длительности периода сигнала ШИМ
; и настройка направлений работы.
;-------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
clrf TrisC ; Все выводы порта С работают на выход.
clrf TrisB ; Все выводы порта В работают на выход.
13
movlw .62 ; Задание длительности
movwf PR2 ; периода (.62).
;-------------------------------------------
; Работа с регистром Adcon1.
;-------------------------------------------
movlw b'10001110' ; Диапазон квантования напряжения от -Vss до
movwf Adcon1 ; + Vdd, AN0-аналоговый вход, AN1...AN4-
; цифровые каналы ввода/вывода,
; правое выравнивание.
bcf Status,RP0 ; Переход в 0-й банк.
;------------------------------------------
; Настройка модуля CCP.
;------------------------------------------
movlw b'00001111' ; Включение
movwf CCP1CON ; режима ШИМ.
;------------------------------------------
; Настройка модуля TMR2.
;------------------------------------------
movlw b'00000111' ; TMR2 включен, Кдел.предделителя = 16,
movwf T2CON ; Кдел.выходного делителя = 1.

;################################################################################
; Подпрограмма "оцифровки" уровней аналогового сигнала, присутствующего на
; выводе RA0 и перевода результатов этой "оцифровки" в длительность импульса.
;################################################################################
; Сначала производится "оцифровка" (задействуется модуль АЦП).
;********************************************************************************
; Работа с регистром Adcon0.
;-------------------------------------------
SNOVA movlw b'01000001' ; Включение модуля АЦП, выбор канала AN0
movwf Adcon0 ; (RA0), источник тактового сигнала Fosc/8,
; состояние ожидания, конденсатор подключен к
; выбранному аналоговому входу и начал
; перезаряжаться.
;------------------------------------------------
; Задержка для перезаряда конденсатора.
;------------------------------------------------
movlw .6 ; Стандартный,
movwf Count ; вычитающий,
decfsz Count,F ; однобайтный
goto $-1 ; счетчик.
;-------------------------------------------
; Начало аналого-цифрового преобразования.
;-------------------------------------------
bsf Adcon0,GO ; Включение преобразования. Конденсатор
; отключается от аналогового входа на время
; преобразования.
;-------------------------------------------
; Ожидание окончания АЦП ("плавающая" задержка).
;-------------------------------------------
btfsc Adcon0,GO ; Ожидание окончания аналого-цифрового
goto $-1 ; преобразования.
;-------------------------------------------
; АЦП закончено. Результат - в AdresH/AdresL.
; Копирование результата в Temp_H/Temp_L.
;-------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
movf AdresL,W ; AdresL --> W.
bcf Status,RP0 ; Переход в 0-й банк.
movwf Temp_L ; W --> Temp_L.

movf AdresH,W ; AdresH --> W.


movwf Temp_H ; W --> Temp_H.
;-------------------------------------------
; Теперь модуль АЦП можно выключить.
;-------------------------------------------
14
clrf Adcon0 ; Для снижения потребляемого устройством тока,
; модуль АЦП выключается до конца отработки
; текущего полного цикла программы.
;-------------------------------------------------------------------------------
; ИТОГ: в Temp_H/Temp_L "лежит" результат 10-РАЗРЯДНОГО АЦП: в Temp_L "лежит"
; 8-РАЗРЯДНЫЙ РЕЗУЛЬТАТ АЦП, а в Temp_H "лежит" 2-РАЗРЯДНЫЙ ПРИЗНАК БЛОКИРОВКИ.
;================================================================================
; Выбор сценария "БЛОКИРОВКИ НЕТ" или "БЛОКИРОВКА ЕСТЬ".
;================================================================================
movlw 1 ; Проверка типа "выход
subwf Temp_H,W ; из рабочей зоны есть
btfsc Status,Z ; или нет"?
goto $+4 ; Если нет, то обход следующих 3-х команд.
; Если есть, то:
bsf PortC,4 ; - "загорание" светодиода "Авария",
clrf Temp_L ; - имитация нулевого результата АЦП.
goto CCP ; - переход в ПП CCP.

bcf PortC,4 ; "Гашение" светодиода "Авария".


;********************************************************************************
; Перевод 8-разрядного результата АЦП в длительность импульса.
;********************************************************************************
; "Загрузка" результата АЦП, из Temp_L, в CCPR1L/CCP1CON,5,4.
;================================================================================
; Определение момента начала "загрузки" в CCPR1L/CCP1CON,5,4.
;------------------------------------------------------------
CCP bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.

btfss PIR1,TMR2IF ; Проверка состояния флага


goto $-1 ; прерывания по переполнению TMR2.
;------------------------------------------------------------
; Сохранение содержимого Temp_L в Temp (для ПП Bin2_10).
;------------------------------------------------------------
movf Temp_L,W ; Temp_L --> Temp.
movwf Temp ;
;------------------------------------------------------------
; "Загрузка" Temp_L,1,0 в CCP1CON,5,4 (1-->5, 0-->4).
;------------------------------------------------------------
btfsc Temp_L,1 ;
goto $+3 ; Бит №1 регистра Temp_L
bcf CCP1CON,5 ; копируется в бит №5
goto $+2 ; регистра CCP1CON.
bsf CCP1CON,5 ;

btfsc Temp_L,0 ;
goto $+3 ; Бит №0 регистра Temp_L
bcf CCP1CON,4 ; копируется в бит №4
goto $+2 ; регистра CCP1CON.
bsf CCP1CON,4 ;
;------------------------------------------------------------
; "Загрузка" Temp_L,7...2 в CCPR1L,5...0.
;------------------------------------------------------------
rrf Temp_L,F ; Содержимое Temp_L сдвигается
rrf Temp_L,F ; вправо на 2 бита.

movf Temp_L,W ; Содержимое Temp_L


movwf CCPR1L ; "загружается" в CCPR1L.
;------------------------------------------------------------
; Сброс CCPR1L,7,6.
;------------------------------------------------------------
bcf CCPR1L,6 ; В двух старших битах
bcf CCPR1L,7 ; устанавливаются нули.

bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15
; ГРУППА ПОДПРОГРАММ ПРЕОБРАЗОВАНИЯ 2-БАЙТНЫХ ДВОИЧНЫХ ЧИСЕЛ
; В 3-РАЗРЯДНЫЕ ДЕСЯТИЧНЫЕ ЧИСЛА
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
----------------------
;================================================================================
; Подпрограмма гашения незначащих нулей (в LED0, ноль не гасится).
;================================================================================
----------------------
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ПОДПРОГРАММА ДИНАМИЧЕСКОЙ ИНДИКАЦИИ
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
----------------------
goto SNOVA ; Переход на новый цикл преобразования.
;********************************************************************************
end ; Конец программы.

Темно – красным цветом выделено то, что относится к процедуре АЦП.


Синим цветом выделено то, что относится к формированию ШИМ-сигнала.
Фиолетовым цветом выделено то, что относится к выбору сценария блокировки или
разблокировки.
Темно – синим цветом выделен "стандартный набор" ПП (2/10 преобразования,
гашения незначащих нулей и динамической индикации).

Программа упростилась за счет того, что все, что связано с вторым каналом АЦП,
вычислением абсолютной разницы и определением знака, а также и с "кнопочной
разблокировкой", удалено.
2-му сектору соответствует, "лежащее" в регистре Temp_H, число .1 (оно в него
скопировано из регистра AdresH).
В данном случае, наличие/отсутствие (в Temp_H) числа .1 и есть критерий
разблокировки/блокировки соответственно.
1. Если в регистре Temp_H "лежит" число .1, то это считается признаком "нормальной"
работы.
При этом, содержимое регистра Temp_L (8-битный результат АЦП) не изменяется, и
светодиод "Авария" не "загорается" (наоборот, "гасится").
2. Если в регистре Temp_H "лежит" число отличное от .1, то это считается признаком
"аварийной" работы.
При этом, содержимое регистра Temp_L изменяется (8-разрядный результат АЦП
заменяется на ноль), и "загорается" светодиод "Авария".
Оба сценария заканчиваются переходом в ПП CCP, и далее программа отрабатывается
"штатно".
В результате этого, в случае отработки 1-го сценария, будет осуществлена
стабилизация мощности, и на индикацию будет выведен номер соответствующей
"квантовки".
Светодиод "Авария" будет "погашен".
В случае отработки 2-го сценария, транзистор КК закроется нулевым уровнем, так
как в регистре Temp_L "лежит" .0.
По этой же причине, на индикацию будет выведен символ "0".
Светодиод "Авария" "загорится".
Если, на последующих "витках" полного цикла программы, выхода из "аварийной зоны"
не произойдет, то в течение всего интервала времени "торчания" в ней, будет
многократно отрабатываться 2-й сценарий.
Если же это событие произойдет, то начнет отрабатываться 1-й сценарий.
Примечание: "аварийная зона" это все то, что находится за пределами, в данном
случае, 2-го сектора, и поэтому никаких "перескоков в бяку" не будет, так как "бяки"
нет. "Моль съела".
Таким образом, имеет место быть достаточно "шустрое", автоматическое слежение за
"аварийной ситуацией", с "моментальными оргвыводами" по поводу ее наличия или
отсутствия.
"Граница (нагрузка) может спать спокойно".

16
Эта автоматическая "штуковина" заблокирует любую попытку "несанкционированного
вторжения" (чем-то на брехучую и бдительную собаку смахивает).
А вот к этому, даже при желании, уже трудно придраться, и это, "в контексте
угрызений совести", как "бальзам на душу" (халтура "не просочилась").
Теперь можно заняться тем, что выше названо "моментальными оргвыводами".
Если быть объективным, то "с точки зрения микромира", эти "оргвыводы" совсем не
моментальные, так как имеет место быть довольно-таки "массивный", полный цикл
программы.
За счет чего "массивный"?
За счет "индикаторных прибамбасов".
Для "учебно – тренировочного" устройства, это плюс, а для устройства, от которого
требуется быстрая реакция, это минус.
Так как в жизни всякие случаи бывают, но нужно озаботиться и этим.
В принципе, на фоне предыдущих, "кровавых катаклизмов", имеет место быть
банальный "звук му": нужно только избавиться от "индикаторных прибамбасов".
Нет ничего проще, чем "обкарнать" то, что понятно.
Получилось вот что:

;********************************************************************************
; Stabil_4.asm Импульсный стабилизатор мощности с блокировкой ШИМ-сигнала в
; случаях выхода управляющего напряжения за пределы "рабочей зоны"
; Вариант №3 (быстрый "автомат").
;--------------------------------------------------------------------------------
; "Связка" модуль АЦП / модуль CCP работает в режиме ШИМ-модулятора.
; 8-битный результат АЦП и его правое выравнивание.
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; Функции выводов порта А:
; RA0 - вход канала АЦП,
; остальные выводы порта А не задействованы.
; Функции выводов порта В:
; Выводы порта В не задействованы.
; Функции выводов порта С:
; RC2 - выход модуля CCP (выход ШИМ),
; RC4 - сигнал выхода за границы рабочего сектора ("Авария"),
; остальные выводы порта C не задействованы.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Опорное напряжение -> Uпит. ПИКа.
; Частота импульсов -> 1000 Гц.
; Используется PIC16F873A.
;----------------------------------------------
; Объем программы: 57 слов в памяти программ.
;================================================================================
LIST p=16F873A ; "Привязка" к типу микроконтроллера.
__CONFIG 3F31H ; XT-генератор, PWRT вкл., защита выкл., сброс
; BOR запрещен, LVP выкл., DEBUG выкл.
;================================================================================
; Регистры специального назначения.
;================================================================================
Status equ 03h ; Регистр Status.
PortC equ 07h ; ----------"---------- C.
TrisC equ 07h ; Регистр выбора направлений работы
; выводов порта C (банк 1).
;-------------------------------------
; Регистры, обеспечивающие АЦП.
;-------------------------------------
AdresH equ 1Eh ; Регистр старшего байта результата АЦП.
AdresL equ 1Eh ; Регистр младшего байта результата АЦП
; (банк 1).
Adcon0 equ 1Fh ; Регистр настройки модуля АЦП.

17
Adcon1 equ 1Fh ; Регистр настройки модуля АЦП (банк 1).
;-------------------------------------
; Регистры, обеспечивающие ШИМ.
;-------------------------------------
PIR1 equ 0Ch ; Регистр флагов прерываний
; от периферийных модулей.
T2CON equ 12h ; Регистр управления модулем таймера TMR2.
CCP1CON equ 17h ; Регистр управления модулем CCP.
CCPR1L equ 15h ; Регистр младшего байта CCP.
PR2 equ 12h ; Регистр периода (банк 1).
;================================================================================
; Регистры общего назачения.
;================================================================================
Count equ 26h ; Регистр счетчика.
Temp_L equ 27h ; Регистр 8-разрядного результата АЦП.
Temp_H equ 28h ; Регистр признака блокировки.
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;================================================================================
; Присвоение битам названий.
;================================================================================
Z equ 2 ; Флаг нулевого результата.
RP0 equ 5 ; Бит выбора банка.
GO equ 2 ; Бит статуса модуля АЦП.
TMR2IF equ 1 ; Флаг прерывания по переполнению TMR2.
;================================================================================
org 0 ; Начать выполнение программы с PC=0.
;********************************************************************************

;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
bcf PortC,4 ; "Гашение" светодиода "Авария".
;-------------------------------------------
; Задание длительности периода сигнала ШИМ
; и настройка направлений работы.
;-------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
clrf TrisC ; Все выводы порта С работают на выход.
movlw .62 ; Задание длительности
movwf PR2 ; периода (.62).
;-------------------------------------------
; Работа с регистром Adcon1.
;-------------------------------------------
movlw b'10001110' ; Диапазон квантования напряжения от -Vss до
movwf Adcon1 ; + Vdd, AN0-аналоговый вход, AN1...AN4-
; цифровые каналы ввода/вывода,
; правое выравнивание.
bcf Status,RP0 ; Переход в 0-й банк.
;------------------------------------------
; Настройка модуля CCP.
;------------------------------------------
movlw b'00001111' ; Включение
movwf CCP1CON ; режима ШИМ.
;------------------------------------------
; Настройка модуля TMR2.
;------------------------------------------
movlw b'00000111' ; TMR2 включен, Кдел.предделителя = 16,
movwf T2CON ; Кдел.выходного делителя = 1.

;################################################################################
18
; Подпрограмма "оцифровки" уровней аналогового сигнала, присутствующего на
; выводе RA0 и перевода результатов этой "оцифровки" в длительность импульса.
;################################################################################
; Сначала производится "оцифровка" (задействуется модуль АЦП).
;********************************************************************************
; Работа с регистром Adcon0.
;-------------------------------------------
SNOVA movlw b'01000001' ; Включение модуля АЦП, выбор канала AN0
movwf Adcon0 ; (RA0), источник тактового сигнала Fosc/8,
; состояние ожидания, конденсатор подключен к
; выбранному аналоговому входу и начал
; перезаряжаться.
;------------------------------------------------
; Задержка для перезаряда конденсатора.
;------------------------------------------------
movlw .6 ; Стандартный,
movwf Count ; вычитающий,
decfsz Count,F ; однобайтный
goto $-1 ; счетчик.
;-------------------------------------------
; Начало аналого-цифрового преобразования.
;-------------------------------------------
bsf Adcon0,GO ; Включение преобразования. Конденсатор
; отключается от аналогового входа на время
; преобразования.
;-------------------------------------------
; Ожидание окончания АЦП ("плавающая" задержка).
;-------------------------------------------
btfsc Adcon0,GO ; Ожидание окончания аналого-цифрового
goto $-1 ; преобразования.
;-------------------------------------------
; АЦП закончено. Результат - в AdresH/AdresL.
; Копирование результата в Temp_H/Temp_L.
;-------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
movf AdresL,W ; AdresL --> W.
bcf Status,RP0 ; Переход в 0-й банк.
movwf Temp_L ; W --> Temp_L.

movf AdresH,W ; AdresH --> W.


movwf Temp_H ; W --> Temp_H.
;-------------------------------------------
; Теперь модуль АЦП можно выключить.
;-------------------------------------------
clrf Adcon0 ; Для снижения потребляемого устройством тока,
; модуль АЦП выключается до конца отработки
; текущего полного цикла программы.
;-------------------------------------------------------------------------------
; ИТОГ: в Temp_H/Temp_L "лежит" результат 10-РАЗРЯДНОГО АЦП: в Temp_L "лежит"
; 8-РАЗРЯДНЫЙ РЕЗУЛЬТАТ АЦП, а в Temp_H "лежит" 2-РАЗРЯДНЫЙ ПРИЗНАК БЛОКИРОВКИ.
;================================================================================
; Выбор сценария "БЛОКИРОВКИ НЕТ" или "БЛОКИРОВКА ЕСТЬ".
;================================================================================
movlw 1 ; Проверка типа "выход
subwf Temp_H,W ; из рабочей зоны есть
btfsc Status,Z ; или нет"?
goto $+4 ; Если нет, то обход следующих 3-х команд.
; Если есть, то:
bsf PortC,4 ; - "загорание" светодиода "Авария",
clrf Temp_L ; - имитация нулевого результата АЦП.
goto CCP ; - переход в ПП CCP.

bcf PortC,4 ; "Гашение" светодиода "Авария".


;********************************************************************************
; Перевод 8-разрядного результата АЦП в длительность импульса.
;********************************************************************************
19
; "Загрузка" результата АЦП, из Temp_L, в CCPR1L/CCP1CON,5,4.
;================================================================================
; Определение момента начала "загрузки" в CCPR1L/CCP1CON,5,4.
;------------------------------------------------------------
CCP bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.

btfss PIR1,TMR2IF ; Проверка состояния флага


goto $-1 ; прерывания по переполнению TMR2.
;------------------------------------------------------------
; "Загрузка" Temp_L,1,0 в CCP1CON,5,4 (1-->5, 0-->4).
;------------------------------------------------------------
btfsc Temp_L,1 ;
goto $+3 ; Бит №1 регистра Temp_L
bcf CCP1CON,5 ; копируется в бит №5
goto $+2 ; регистра CCP1CON.
bsf CCP1CON,5 ;

btfsc Temp_L,0 ;
goto $+3 ; Бит №0 регистра Temp_L
bcf CCP1CON,4 ; копируется в бит №4
goto $+2 ; регистра CCP1CON.
bsf CCP1CON,4 ;
;------------------------------------------------------------
; "Загрузка" Temp_L,7...2 в CCPR1L,5...0.
;------------------------------------------------------------
rrf Temp_L,F ; Содержимое Temp_L сдвигается
rrf Temp_L,F ; вправо на 2 бита.

movf Temp_L,W ; Содержимое Temp_L


movwf CCPR1L ; "загружается" в CCPR1L.
;------------------------------------------------------------
; Сброс CCPR1L,7,6.
;------------------------------------------------------------
bcf CCPR1L,6 ; В двух старших битах
bcf CCPR1L,7 ; устанавливаются нули.
bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.

goto SNOVA ; Переход на новый цикл преобразования.


;********************************************************************************
end ; Конец программы.

Темно – красным цветом выделено то, что относится к процедуре АЦП.


Синим цветом выделено то, что относится к формированию ШИМ-сигнала.
Фиолетовым цветом выделено то, что относится к выбору сценария блокировки или
разблокировки.

"Масса" программы Stabil_4.asm всего 57 слов (!!!), причем, первую команду программы
(bcf PortC,4) можно убрать. Ее я поставил "для порядка".
Время задержки перезаряда конденсатора Hold можно смело сократить на 9 м.ц.
(вместо .6, выставить .3), так как операционный усилитель имеет малое Rвых.
В случае наличия такой необходимости, за счет перехода на более высокую Fшим
(при сохранении 8-битного результата АЦП), можно увеличить скорость (уменьшить
инерционность).
Эта программа четко работает в "железе", причем, можно использовать схему,
изображенную на рис. 3 (можно не отключать линейку).
Нужно только сменить "прошивку".
В части касающейся скорости, разница между программами Stabil_3 и _4.asm
заключается в том, что стабилизатор, работающий по программе Stabil_4.asm, гораздо
более "шустёр" (быстр), чем стабилизатор, работающий по программе Stabil_3.asm.
Принципиальная схема, "адаптированная" под программу Stabil_4.asm, изображена на
рис. 4 (см. ниже).
Она довольно-таки существенно упростилась, вплоть до того, что можно перейти на 8-
выводной ПИК (например, на PIC12F675).
20
Что получилось?
Получилось "базовое" устройство ("румяный карапуз"), которое можно использовать при
организации импульсной стабилизации напряжения, тока или мощности.
Это без разницы, так как, в конечном итоге, все сводится к работе с уровнями
напряжения (только на разные лады).
А если хорошенько подумать, то его можно использовать и для достижения других,
весьма заманчивых целей.
Именно к такому устройству, я сознательно и стремился.
Его особенность такова, что оно относительно простое, но эта простота обманчива.
Для того чтобы четко представлять себе, что произойдет, если слегка изменить
настройку, нужно как следует потрудиться.
А если нужно, на этой основе, что-то сконструировать, то нужно потрудиться еще
больше.

То что Вы прочитали в подразделах, посвященных модулю АЦП, есть "база", от


которой реально можно "плясать", а это, на мой взгляд, уже не мало.
Надеюсь на то, что, после прочтения "вышележащего", в Ваших глазах, "голый зад
АЦП/ССP-проблемы" потеряет свой изначально вольяжный и грозный вид.
Даже "на каждого мудреца довольно простоты", а на каждую "железяку", и подавно.
Подрастай, "карапуз", на горе "голому заду проблемы" и на радость всем остальным.
Ты пока еще мал, глуп и соплив, но "большими дядьками" сразу не рождаются.
Ими становятся.

"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

21

Оценить