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

7/7.

Использование модуля 10-разрядного АЦП, в "связке" с модулем CCP,


работающим в режиме ШИМ, для осуществления преобразования "напряжение –
скважность". Устройство управления скважностью с помощью переменного
резистора (диапазон изменения коэффициента заполнения от 0% до 100%).

Теперь можно "пристегнуть" модуль АЦП к процессу формирования ШИМ-сигнала.


В простейшем случае, речь идет об устройстве, формирующем импульсную
последовательность с заданной (фиксированной) частотой/периодом и изменяющейся,
при помощи переменного/подстроечного резистора, скважностью.
Это есть "база", на основе которой можно "вешить великие дела".
Сие "сооружение" выглядит так:

Практическая рекомендация: для того, чтобы не делать лишней работы, линейку из 3-х
7-сегментных индикаторов, которая применялась ранее, можно не отключать (она будет
нужна в дальнейшем), так как "нижележащие" программы составлены таким образом,
что все выводы портов В и С, за исключением RC2, работают "на вход" (линейка
просто не будет работать).
В этом случае, нужно только "освободить" вывод RC2 для того, чтобы подключить к
нему контрольный светодиод (см. рис. 1).
Как видите, применяется все тот же "легендарный" делитель напряжения (с
регулируемым коэффициентом деления), выход которого подключен к аналоговому
входу модуля АЦП, который назначен активным (в данном случае, AN0).
Удобнее всего квантовать диапазон напряжений от 0 в. до Uпит. ПИКа, что и сделано.
В этом случае, внешний источник Uоп. не нужен.
Если крутить движок R1 "туда – сюда", то уровень напряжения на выводе аналогового
входа модуля АЦП будет меняться как раз в указанном выше диапазоне.
Это есть "накладка" диапазона квантования по уровню, на диапазон изменения уровней
внешнего (по отношению к ПИКу), аналогового сигнала, типа "зер гут".
Uпит. ПИКа не обязательно делать = 5,12 в (а можно и сделать), так как
настоятельной, практической необходимости в "привязке" "шага" квантования по уровню
именно к 5-ти милливольтам, нет.
Короче, Uпит. ПИКа может быть любым (в пределах дозволенного & разумного).
У PIC16F873A, выходом модуля CCP, работающего в режиме ШИМ, является вывод RC2.
К нему подключен контрольный светодиод, по интенсивности свечения которого можно
судить ("грубо") о значении скважности.

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

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

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

3
; Сначала производится "оцифровка" (задействуется модуль АЦП).
;********************************************************************************
; Работа с регистром 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.
;-------------------------------------------
; В Temp_H/Temp_L "лежит" результат АЦП.
;-------------------------------------------
; Теперь модуль АЦП можно выключить.
;-------------------------------------------
clrf Adcon0 ; Для снижения потребляемого устройством тока,
; модуль АЦП выключается до конца отработки
; текущего полного цикла программы.
;********************************************************************************
; Далее производится перевод результата "оцифровки" в длительность импульса
; (задействуется модуль CCP, работающий в режиме ШИМ).
;********************************************************************************
; "Загрузка" результата АЦП, из Temp_H/Temp_L, в CCPR1L/CCP1CON,5,4.
;================================================================================
; Определение момента начала "загрузки" в CCPR1L/CCP1CON,5,4.
;------------------------------------------------------------
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 ;
4
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.
;------------------------------------------------------------
; "Загрузка" Temp_H,1,0 в CCPR1L,7,6.
;------------------------------------------------------------
btfsc Temp_H,1 ;
goto $+3 ; Бит №1 регистра Temp
bcf CCPR1L,7 ; копируется в бит №7
goto $+2 ; регистра CCP1CON.
bsf CCPR1L,7 ;

btfsc Temp_H,0 ;
goto $+3 ; Бит №0 регистра Temp
bcf CCPR1L,6 ; копируется в бит №6
goto $+2 ; регистра CCP1CON.
bsf CCPR1L,6 ;

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


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

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


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

Стратегия программы.
В начале 1-го "витка" полного цикла программы, производятся те настройки, которые
достаточно сделать только один раз.
Начиная со 2-го "витка" полного цикла программы, эти настройки обходятся, а рабочая
точка программы "закольцовывается" в циклической подпрограмме "оцифровки"
уровня аналогового сигнала, присутствующего на выводе RA0, и перевода
результата этой "оцифровки" в длительность импульса (ПП SNOVA).
Сначала, для того чтобы заиметь исходные данные для формирования длительности
импульса, с помощью модуля АЦП, производится "оцифровка" уровня напряжения,
присутствующего на активном, аналоговом входе модуля АЦП (вывод RA0).
Результат этой "оцифровки" записывается в 2-байтный регистр оперативной памяти
Temp_H/Temp_L.
Этот результат является 10-разрядным.
Это как раз то, что нужно для модуля CCP, работающего в режиме ШИМ.
Таким образом, между модулями АЦП и CCP, возникает "жизнепорождающая, числовая
любовь (& согласие), позволяющая зачать здоровое и румяное дитё".
"Оплодотворение" происходит не сразу, а тогда, когда "природа позволит" (у женщин с
этим делом строго, то есть, периодически).
Вопрос: "Когда природа позволит"?
Ответ: тогда, когда поднимется флаг TMR2IF, то есть, тогда, когда произойдет
совпадение типа "TMR2 = PR2".
А если еще проще, то тогда, когда начнется формирование "нового" периода ШИМ-
сигнала.
До этого момента, не о каком "оплодотворении" и речи идти не может, так как
рабочая точка программы "мотает витки" в "плавающей" задержке, расположенной в

5
самом начале процедуры "загрузки" результата АЦП, из Temp_H/Temp_L, в
CCPR1L/CCP1CON,5,4.
Когда флаг TMR2IF поднимется, тогда, как говорится, "милости просим": в
CCPR1L/CCP1CON,5,4 копируется результат АЦП, и он будет использоваться при
формировании длительности импульса.
Далее - переход на следующий цикл преобразования "напряжение – скважность", и т.д.

Тактика программы.
В "подготовительных операциях" произведена только настройка направления работы
вывода RC2 (выход модуля CCP, работающего в режиме ШИМ).
Направления работы остальных выводов портов определяются настройками по
умолчанию (по умолчанию, все выводы портов работают "на вход").
Неиспользуемые модули также отключать не нужно, так как они отключены по
умолчанию.
В целях обеспечения "единообразия", я "привязался" к ранее выбранной длительности
периода = 1000 мкс. (F = 1000 Гц).
Значит, в регистр периода PR2, нужно записать число .249.
Все эти дела делаются в 1-м банке.
Чтобы не "размножать" количество переходов из банка в банк, разумнее всего, "за
один присест" ("оптом") сделать все то, что нужно сделать в 1-м банке.
Этим и определяется "место дислокации" группы команд работы с регистром Adcon1.
После перехода в 0-й банк, модуль CCP включается и переводится в режим ШИМ.
Далее, одновременно, разрешается счет TMR2, и производится вторая часть настройки
длительности периода (выбор Кдел. предделителя модуля TMR2).
Так как необходимости в смене скважности, через каждые 2 … 16 импульсов, нет, то
выставляется Кдел. выходного делителя модуля TMR2 равный 1.
Что касается всего остального, то я, изначально, не мудрствуя лукаво, просто
"передрал" те процедуры, работа которых была детально "расписана" ранее.
Хотя все это "сооружение" и прекрасно работает, но "червь сомнения активизировался"
(очень хлопотный, но и очень полезный "организм". Советую его "холить и лелеять").
А вдруг то, что в одном "месте" уместно, в другом "месте" не вполне уместно?
Включаю "рентгеновский аппарат" и "упираюсь" в достаточно "громоздкую" процедуру
"загрузки" результата АЦП, из Temp_H/Temp_L, в CCPR1L/CCP1CON,5,4.
А если, вместо правого выравнивания, применить левое?
Итог: "сокрушительный зер гут".
"Убито" аж 12 команд!!!. Время "загрузки" результата АЦП, в CCPR1L/CCP1CON,5,4,
существенно сократилось.
Программа стала более быстрой и качественной.
Этот "шедевр" называется Schim_6.asm (прилагается):

;********************************************************************************
; Schim_6.asm Регулятор скважности
; (вариант с левым выравниванием)
;--------------------------------------------------------------------------------
; Задействуется модуль АЦП и модуль ССP, работающий в режиме ШИМ.
; Скважность регулируется переменным резистором.
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; Функции выводов порта А:
; RA0 - активный входной канал АЦП,
; остальные выводы порта А не задействованы.
; Функции выводов порта В:
; выводы порта В не задействованы.
; Функции выводов порта С:
; RC2 - выход модуля CCP (выход ШИМ),
; остальные выводы порта C не задействованы.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Опорное напряжение -> Uпит. ПИКа.
6
; Частота импульсов -> 1000 Гц.
; Используется PIC16F873A.
;----------------------------------------------
; Объем программы: 44 слова в памяти программ.
;================================================================================
LIST p=16F873A ; "Привязка" к типу микроконтроллера.
__CONFIG 3F31H ; XT-генератор, PWRT вкл., защита выкл., сброс
; BOR запрещен, LVP выкл., DEBUG выкл.
;================================================================================
; Регистры специального назначения.
;================================================================================
Status equ 03h ; Регистр Status.
TrisC equ 07h ; Регистр выбора направлений работы
; выводов порта C (банк 1).
;-------------------------------------
; Регистры, обеспечивающие АЦП.
;-------------------------------------
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).
;================================================================================
; Регистры общего назачения.
;================================================================================
Count equ 20h ; Регистр счетчика.
Temp_L equ 21h ; Регистр младшего разряда 2-байтного
; двоичного числа.
Temp_H equ 22h ; Регистр старшего разряда 2-байтного
; двоичного числа.
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;================================================================================
; Присвоение битам названий.
;================================================================================
RP0 equ 5 ; Бит выбора банка.
GO equ 2 ; Бит статуса модуля АЦП.
TMR2IF equ 1 ; Флаг прерывания по переполнению TMR2.
;================================================================================
org 0 ; Начать выполнение программы
; с 0-го адреса PC.
;********************************************************************************

;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
; Задание длительности периода сигнала ШИМ
; и подготовка к работе вывода RC2.
;-------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
movlw .249 ; Задание длительности
movwf PR2 ; периода (.249).
7
bcf TrisC,2 ; RC2 работает на выход.
;-------------------------------------------
; Работа с регистром Adcon1.
;-------------------------------------------
movlw b'00001110' ; Диапазон квантования напряжения от -Vss до +
movwf Adcon1 ; Vdd, AN0-аналоговый вход, AN1...AN4-цифровые
; каналы ввода/вывода, левое выравнивание.
bcf Status,RP0 ; Переход в 0-й банк.
;------------------------------------------
; Настройка модуля CCP.
;------------------------------------------
movlw b'00001111' ; Включение
movwf CCP1CON ; режима ШИМ.
;------------------------------------------
; Настройка модуля TMR2.
;------------------------------------------
movlw b'00000101' ; TMR2 включен, Кдел.предделителя = 4,
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.
;-------------------------------------------
; В Temp_H/Temp_L "лежит" результат АЦП.
;-------------------------------------------
; Теперь модуль АЦП можно выключить.

8
;-------------------------------------------
clrf Adcon0 ; Для снижения потребляемого устройством тока,
; модуль АЦП выключается до конца отработки
; текущего полного цикла программы.
;********************************************************************************
; Далее производится перевод результата "оцифровки" в длительность импульса
; (задействуется модуль CCP, работающий в режиме ШИМ).
;********************************************************************************
; "Загрузка" результата АЦП, из Temp_H/Temp_L, в CCPR1L/CCP1CON,5,4.
;================================================================================
; Определение момента начала "загрузки" в CCPR1L/CCP1CON,5,4.
;------------------------------------------------------------
bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.

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


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

btfsc Temp_L,6 ;
goto $+3 ; Бит №6 регистра Temp_L
bcf CCP1CON,4 ; копируется в бит №4
goto $+2 ; регистра CCP1CON.
bsf CCP1CON,4 ;
;------------------------------------------------------------
; "Загрузка" Temp_H в CCPR1L.
;------------------------------------------------------------
movf Temp_H,W ; Содержимое Temp_H
movwf CCPR1L ; "загружается" в CCPR1L.

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


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

Вывод: при работе модуля АЦП с модулем CCP (в режиме ШИМ), выгоднее
применить левое выравнивание результата АЦП.
"Ковыляю" дальше. Предположим, что:
- числовой результат 1-го АЦП = Х,
- числовой результат 2-го АЦП = Y,
- числовой результат 3-го АЦП = Z.
Тогда:

9
Эта картинка иллюстрирует эффект буферизации, о наличии которого говорилось
ранее (при "разборках" с модулем CCP, работающим в режиме ШИМ).
Суть этого эффекта заключается в том, что, в текущем цикле ШИМ, формируется
импульс, длительность которого задает не то число, которое загружается, в регистр
CCPR1L/CCPCON,5,4, в этом, текущем цикле ШИМ, а то число, которое загрузилось, в
CCPR1L/CCPCON,5,4, в предыдущем цикле ШИМ (оно переписывается в буфер).
Чем это "распрекрасно"?
Это "распрекрасно" тем, что можно не опасаться "вранья" и сбоев в случае
формирования коротких импульсов.
На практике же, это означает то, что можно, без проблем ("мертвых зон" нет),
обеспечить диапазон изменения коэффициента заполнения от 0% до 100%.
Длительность самого короткого импульса будет 1 мкс., а самого длинного - 999 мкс.
("шаг" - 1 мкс. или 0,1% от длительности периода).
Коэффициенту заполнения 0% соответствует нулевой уровень ШИМ-сигнала (импульсов
нет), а коэффициенту заполнения 100% соответствует единичный уровень ШИМ-сигнала
(импульсов также нет).
Если рассуждать более "глобально" и ориентироваться на достижение минимальной
инерционности преобразования, то не желательно допускать того, чтобы суммарное
время отработки процедуры копирования содержимого Temp_H/Temp_L в
CCPR1L/CCP1CON,5,4 (на рис. 2 закрашено ярко – желтым цветом) и отработки
процедуры АЦП (на рис. 2 закрашено темно – синим цветом) превышало длительность
периода.
В противном случае, период начнет формироваться до окончания АЦП.
Это не приведет к изменению времени периода (модулю CCP, работающему в режиме
ШИМ, это "по барабану". Он "тупо делает свое дело", так как длительность периода
зафиксирована в настройках), но это приведет к увеличению инерционности отклика
устройства на быстрые изменения управляющего напряжения.
Это актуально при выборе высокой частоты ШИМ-сигнала и/или введении в полный
цикл программы каких-то дополнительных, программных "наворотов", затягивающих
время исполнения полного цикла программы.
В зависимости от "массивности врезки", изменение длительности импульса будет
происходить не в каждом периоде, а например, через 2, 3, 4 и т.д. периода.
Если такая инерционность приемлема, то и проблемы нет, а если не приемлема
(нужен малоинерционный отклик), то нужно стремиться к тому, чтобы интервал времени
исполнения одного полного цикла программы (за исключением времени отработки
"плавающей" задержки, в которой задействован флаг TMR2IF) был меньше интервала
времени периода ШИМ-сигнала.
Если это условие не выполняется, то нужно либо увеличить период (уменьшить
частоту) ШИМ-сигнала таким образом, чтобы это условие выполнялось, либо
качественно "обкарнать" программу (сократить время отработки ее полного цикла).
Первое гораздо проще, и поэтому применяется чаще.
Второе - "епархия оптимизаторов", работающих в "чистом" ассемблере, и поэтому
применяется реже.
Что касается учебного устройства, принципиальная схема которого изображена на
рис. 1, то оно обеспечивает малоинерционный отклик, и в этом смысле, является
"быстрым".
Еще обязательно нужно упомянуть/напомнить о том, что, во время отработки
процедуры АЦП, модуль CCP работает, что есть огромный "зер гут".
Проще говоря, два дела делаются одновременно.
Почему?
Потому, что, в основном, они делаются аппаратно (еще раз: разработчикам - слава!).
В этом случае, программа нужна только для того, чтобы обеспечить:
- "правильные" настройки,
- определенный, "правильный" и достаточно простой порядок действий, определяемый
логикой работы модулей и заданной функциональностью устройства,
- соблюдение приемлемых, временных соотношений между исполняемыми процедурами.

10
Трудоемкость этой работы гораздо ниже, чем в случае отказа от "услуг"
специализированных (периферийных) модулей, а качество - выше.
Мало того, существует большое количество технических задач, решение которых, без
применения специализированных модулей, либо весьма затруднительно, либо вообще
невозможно.
Для того чтобы в этом убедиться, можно, например, попытаться сделать то, о чем
говорилось в этом подразделе, на PIC16F84A или даже на PIC16F628A.
По поводу "связок".
Можно организовать "связки" из различных модулей.
При этом, знания того, как работает тот или иной модуль, маловато будет.
Нужно еще обеспечить "любовь и согласие" между ними.
Только в этом случае будут "румяные и крепкие детишки".
Вопрос: "Что делать"?
Ответ: постигать "искусство любви".
По моему, это, во всех отношениях, очень актуально и жизненно.

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

11