Академический Документы
Профессиональный Документы
Культура Документы
Работа с
внешним источником опорного напряжения. Измеритель тока (от 0 до 999 ма.,
разрешающая способность 1 ма., с возможностью изменения этих параметров).
Теперь, "на повестке дня", вопрос о принципе измерения тока и его практической
реализации.
Этот принцип очень прост: ток переводится в напряжение.
Уровень этого напряжения и измеряется.
Значит, в разрыв цепи соединяющей блок питания с нагрузкой, нужно включить
резистор, причем, низкоомный.
Чем меньше напряжения на нем "падает", тем лучше.
А раз это так, то и уровень того напряжения, которое нужно измерить, будет низок.
Следовательно, "квантовка" от GND до U источника питания ПИКа не подойдет.
Нужно перейти на более "узкий" диапазон квантования.
От какого уровня?
От нуля, так как нижний "предел" значения тока = 0.
До какого уровня?
А вот тут нужно подумать.
Во-первых, нужно определиться с номиналом измерительного резистора (Rизм.).
Обычно, его номинал либо 0,1 ом, либо 1 ом, либо 10 ом.
При прочих, равных условиях, Rизм.= 0,1 ом, конечно же, гораздо лучше, чем
Rизм.= 1 ом, а тем более Rизм.= 10 ом, но уровень падения напряжения на нем
маловат.
Это вовсе "не смертельно", но достаточно специфично.
Для начала, с целью "въезда в механику действа", лучше "привязаться" к одному ому,
а там, глядишь, и "до специфики рукой подать" (опыт в этом деле "на дороге не
валяется").
Так и сделаю.
С учетом того, что имеется 3 десятичных разряда, максимальная величина показаний
составляет 999.
Для разнообразия, "убью" десятичную запятую (надоела).
"Привяжусь" к разрешающей способности 1 ма., что, с учетом номинала Rизм. = 1 ом.,
соответствует "шагу" квантования 1 мв.
Уровней квантования 1024 штуки (10-разрядное АЦП), следовательно, с учетом того,
что замер происходит от нуля, верхняя "граница" диапазона квантования по уровню
должна быть равна 1 мв. х 1024 = 1,024 вольта.
Это значительно меньше чем Uпит. ПИКа.
Значит, хочешь – не хочешь, а на внешний источник опорного напряжения перейти
придется.
Вывод: внешний источник опорного напряжения должен "выдавать" напряжение = 1,024 в.
и это напряжение должно быть подано на вывод RA3.
Соответственно, выбираю настройку строки №6 (см. таблицу подраздела 7/1) - 0101.
Примечание: в данном случае, можно выбрать или настройку строки №6, или
настройку строки №2.
Так как верхняя "граница" диапазона квантования определяется не значением
напряжения источника питания, а тем, что "выдает" источник опорного напряжения, то
Uпит. ПИКа вовсе не обязательно делать равным 5,12 в. (как в предыдущих
случаях/подразделах).
В простейшем и самом распространенном случае, источник опорного напряжения есть
обычный, резисторный делитель напряжения, вход которого подключен к Uпит. ПИКа.
На вывод RA3 подается напряжение с его нижнего плеча.
Это напряжение и есть опорное напряжение, значение которого можно точно задать.
Если напряжение источника питания ПИКа стабильно, то, наряду с возможностью
точного задания значения опорного напряжения, имеет место быть и вполне
приемлемая стабильность его уровня.
Если делитель напряжения состоит из однотипных, постоянных резисторов с
одинаковыми температурными коэффициентами сопротивления, то, в идеале, при
1
изменении температуры, номиналы резисторов будут "синхронно" увеличиваться или
уменьшаться, а коэффициент деления (Uвых. делителя) останется неизменным.
Реально же, зависимость Uвых делителя от температуры имеется, но, с учетом
сказанного, ее можно минимизировать.
Можно сформировать опорное напряжение с помощью стабилитрона, но в этом случае,
трудно точно подобрать нужное значение опорного напряжения, да и стабилитрон на
такое низкое напряжение, как 1 вольт, найти сложновато.
Естественно, имеются и другие, более сложные, источники опорного напряжения (в том
числе и на м/схемах), которые вполне можно применить, но, на мой взгляд, в данном,
"первородном" случае, усложнять устройство не стоит.
Идеальный источник опорного напряжения имеет выходное сопротивление стремящееся
к нулю.
Естественно, что "в жизни такого не бывает", но к этому нужно стремиться (в
разумных пределах).
В связи с этим, резисторный делитель напряжения, формирующий опорное напряжение,
должен состоять из резисторов с относительно малыми номиналами.
Дело в том, что при старте преобразования (при поднятии флага статуса модуля
АЦП), потребление тока от источника опорного напряжения возрастает до 1 ма.
за 8 … 20 нс.
Источник опорного напряжения должен "выдерживать" такую нагрузку в том смысле,
чтобы эта "бяка" не приводила к сколь либо существенному уменьшению заданной
величины опорного напряжения.
По этой причине, нужно ориентироваться на значение тока, протекающего через
делитель, равное 8 … 10 ма., плюс, подключить к выводу RA3 конденсатор
"вольтдобавки" с малым током утечки (он же - блокировочный для помех).
С учетом сказанного, "родилось сие творение":
;********************************************************************************
; Analog_4.asm 3-разрядный измеритель тока
; (с гашением незначащих нулей в двух левых индикаторах).
;--------------------------------------------------------------------------------
; Задействуется модуль АЦП.
; Для индикации показаний применена линейка из трех 7-сегментных индикаторов
; (общий катод).
; Индикация - динамическая.
; Диапазон измерения от 0 мА. до 999 мА.
; Разрешающая способность 1 мА., поэтому десятичная запятая не выставляется.
; Номинал измерительного R = 1 ом.
; Uref = 1,024 вольта.
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; Функции выводов порта А:
; RA0 - активный входной канал АЦП,
; RA3 - вход Uref (на него подается опорное напряжение).
; остальные выводы порта А не задействованы.
; Функции выводов порта В:
; RB0...RB7 - управление секторами A,B,C,D,E,F,H,G.
; Функции выводов порта С:
; RC0...RC2 - выходы дешифратора,
; остальные выводы порта C не задействованы.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Используется PIC16F873A.
;----------------------------------------------
; Объем программы: 120 слов в памяти программ.
;================================================================================
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).
AdresH equ 1Eh ; Регистр старшего байта результата АЦП.
AdresL equ 1Eh ; Регистр младшего байта результата АЦП
; (банк 1).
Adcon0 equ 1Fh ; Регистр настройки модуля АЦП.
Adcon1 equ 1Fh ; Регистр настройки модуля АЦП (банк 1).
;================================================================================
; Регистры общего назачения.
;================================================================================
LED0 equ 20h ; Регистр хранения результатов преобразований
; 1-го двоично-десятичного разряда.
LED1 equ 21h ; ------- 2-го -------------------------
LED2 equ 22h ; ------- 3-го -------------------------
Index equ 24h ; Счетчик количества малых колец индикации.
3
Count equ 25h ; Счетчик количества больших колец индикации.
Temp equ 26h ; Регистр временного хранения данных.
Mem equ 27h ; Регистр оперативной памяти.
Temp_L equ 28h ; Регистр младшего разряда 2-байтного
; двоичного числа.
Temp_H equ 29h ; Регистр старшего разряда 2-байтного
; двоичного числа.
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;================================================================================
; Присвоение битам названий.
;================================================================================
C equ 0 ; Флаг переноса-заема.
Z equ 2 ; Флаг нулевого результата.
RP0 equ 5 ; Бит выбора банка.
GO equ 2 ; Бит статуса модуля АЦП.
;================================================================================
org 0 ; Начать выполнение программы
; с 0-го адреса PC.
;********************************************************************************
;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
; Перевод в пассивное состояние всех выходов дешифратора
; (для исключения "мелькания" при включении питания).
;-------------------------------------------------------
movlw b'11111111' ; Предустановка состояний выходов дешифратора
movwf PortC ; RC2...RC0 (RC7..3 устанавливаются в 1
; "за компанию").
;-------------------------------------------
; Настройка направлений работы.
;-------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
clrf TrisB ; Все выводы порта В работают на выход.
clrf TrisC ; Все выводы порта С работают на выход.
;-------------------------------------------
; Работа с регистром Adcon1.
;-------------------------------------------
movlw b'10000101' ; Диапазон квантования напряжения от GND до
movwf Adcon1 ; +Uref, AN0,AN1-аналоговые входы, AN2,AN4-
; цифровые каналы ввода/вывода, AN3-вход Uref,
; правое выравнивание.
bcf Status,RP0 ; Переход в 0-й банк.
;================================================================================
; Циклическая подпрограмма измерения уровня аналогового сигнала, присутствующего
; на выводе RA0, обработки результата измерения и его вывода на индикацию.
;================================================================================
; Работа с регистром Adcon0.
;-------------------------------------------
SNOVA movlw b'01000001' ; Включение модуля АЦП, выбор канала AN0
movwf Adcon0 ; (RA0), источник тактового сигнала Fosc/8,
; состояние ожидания, конденсатор подключен к
; выбранному аналоговому входу и начал
; перезаряжаться.
;------------------------------------------------
; Задержка для перезаряда конденсатора.
;------------------------------------------------
movlw .6 ; Стандартный,
4
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.
;================================================================================
; Запись в регистр FSR адресов регистров LED0...1 для дальнейшей косвенной
; адресации к ним в ПП adjBCD.
; Переход к обработке следующего LED - после возврата по стеку.
;================================================================================
adjDEC movlw LED0 ; Запись в регистр FSR, через регистр W,
movwf FSR ; адреса регистра LED0 с дальнейшим переходом
call adjBCD ; в ПП adjBCD (адрес следующей команды
; закладывается в стек).
;---> Возврат по стеку из ПП adjBCD.
movlw LED1 ; -----------------------------
movwf FSR ; То же самое для регистра LED1.
call adjBCD ; -----------------------------
;---> Возврат по стеку из ПП adjBCD.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ГРУППА КОМАНД ПРЕОБРАЗОВАНИЯ ДВОИЧНО-ДЕСЯТИЧНОГО КОДА
; В КОД 7-СЕГМЕНТНОГО ИНДИКАТОРА.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TABLE addwf PCL,F ; Содержимое счетчика команд PC увеличивается
; на величину содержимого W.
retlw b'00111111' ; ..FEDCBA = 0
retlw b'00000110' ; .....CB. = 1
retlw b'01011011' ; .G.ED.BA = 2
retlw b'01001111' ; .G..DCBA = 3
retlw b'01100110' ; .GF..CB. = 4
retlw b'01101101' ; .GF.DC.A = 5
retlw b'01111101' ; .GFEDC.A = 6
retlw b'00000111' ; .....CBA = 7
retlw b'01111111' ; .GFEDCBA = 8
retlw b'01101111' ; .GF.DCBA = 9
retlw 0 ; ........ = гашение всех сегментов.
;================================================================================
; Подпрограмма гашения незначащих нулей (в LED0, ноль не гасится).
;================================================================================
GASH movf LED2,W ; Если содержимое LED2=0, то в него
6
movlw .10 ; записывается число.10
btfss Status,Z ; (сценарий гашения всех сегментов).
goto DINAM ; Если оно не=0, то рабочая точка программы
movwf LED2 ; "улетает" в ПП динамической индикации.
movf LED1,W ;
movlw .10 ; То же самое,
btfss Status,Z ; только для
goto DINAM ; LED1.
movwf LED1 ;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ПОДПРОГРАММА ДИНАМИЧЕСКОЙ ИНДИКАЦИИ
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Подготовка счетчика количества малых колец индикации
; Index к началу полного цикла динамической индикации.
;------------------------------------------------------
DINAM clrf Index ; Сброс в 0 содержимого счетчика малых колец
; индикации Index.
;--------------------------------------------------------------------------------
; Запись в регистр Count количества больших колец индикации, которые
; должны быть отработаны за один полный цикл динамической индикации.
;--------------------------------------------------------------------------------
movlw .60 ; .60 --> W.
movwf Count ; W --> Count.
8
Калибровка очень проста: изменяя величину напряжения внешнего блока питания (или
значение сопротивления нагрузки), нужно добиться того, чтобы "эталонный" амперметр
показал 500 ма. (середина диапазона измерения).
Затем, вращая движок резистора R4, нужно добиться точно такого же показания в
линейке 7-сегментных индикаторов.
После этого, сопротивление переменного резистора R4 замеряется, и вместо него
устанавливается постоянный резистор соответствующего номинала.
Естественно, что номинал резистора R1 должен как можно точнее соответствовать
одному ому.
Устройство имеет хорошую линейность, в наличии которой можно убедиться,
сверившись с показаниями "эталонного" амперметра в различных точках диапазона
измерения тока.
Можно также убедиться в том, что, после проведения калибровки, на выводе RA3
будет присутствовать напряжение 1,024 вольта или близкое к этому значению (степень
расхождения зависит от степени соответствия номинала резистора R1 одному ому, с
учетом шунтирования нижнего плеча делителя напряжения входным сопротивлением
измерительного прибора).
Изменив номинал резистора R1 на 0,1 ом или 10 ом, можно сузить или расширить
диапазон измерения токов (увеличить или уменьшить разрешающую способность).
В этих случаях, нужно выставить десятичную запятую.