Определение емкости батарей
В статье рассмотрено применение микроконтроллера HT46R63 в устройстве определения
емкости батарей. Идея заключается, во-первых, в преобразовании емкости батареи в аналоговый сигнал, затем — в преобразовании этого сигнала посредством встроенного в HT46R63 аналого-цифрового преобразователя в цифровой. Этот цифровой сигнал и будет индицировать емкость батареи с помощью восьми светодиодов: если емкость батареи выше самого высокого уровня, все светодиоды будут гореть; если емкость батареи ниже минимально допустимой величины, светодиоды будут отключены.
Микроконтроллер HT46R63 представляет собой 8-разрядный однократнопрограммируемый (ОТР) прибор фирмы Holtek нового поколения со встроенным АЦП и драйвером ЖКИ. Его структура и параметры были приведены в предыдущем номере нашего журнала («Цифровой вольтметр на базе микроконтроллера HT46R63», с. 98–100).
Принцип работы
Измерение емкости батареи — это не просто измерение ее напряжения. Параллельно с батареей до начала измерения должен быть установлен соответствующий резистор. Если резистор не используется, то полностью заряженная и практически разряженная батарея будут иметь одно и то же напряжение. В качестве примера возьмем батарею с напряжением 1,5 В.
Если батарея полностью заряжена и параллельно к ней подключен резистор сопротивлением 100 Ом, ток через резистор составит 15 мА, а измеренное напряжение на выводах батареи — 1,5 В. При разряженной батарее напряжение, измеренное при таких условиях, будет значительно меньше 1,5 В. Это происходит потому, что разряженная батарея может отдать меньшую мощность, нежели заряженная. Таким образом, если разряженная батарея должна обеспечить ток 15 мА, сохранить при этом напряжение 1,5 В она не способна. При таком способе измерения обеспечивается четкое разграничение между заряженной и разряженной батарей. Надо отметить, что нагрузочный резистор должен быть определенного сопротивления.
Рис. 1. Схема измерителя емкости батарей
При слишком большом сопротивлении ток через резистор мал и напряжение практически любой батареи будет около 1,5 В. Если же сопротивление слишком мало (то есть ток велик), напряжение любой батареи будет низким.
Для эксперимента автор использовал сильно разряженную батарею с номинальным напряжением 1,5 В. Без резистора напряжение батареи составляло 1,0 В, которое снижалось до 0,1 В при подключении резистора 100 Ом. Таким образом, сопротивление нагрузочного резистора было выбрано 100 Ом. После подключения резистора измерялось напряжение батареи, которое потом поступало на АЦП микроконтроллера HT46R63 для преобразования в соответствующее цифровое значение. После программной обработки результат измерения отображался восемью светодиодами, которые подключались к выходам микроконтроллера. Так как разрядность микроконтроллера HT46R63 составляет 8 бит, емкость батареи может быть определена 256 уровнями. Однако для удобства будут использоваться только восемь уровней. Когда напряжение батареи равно 1,5 В, то гореть будут все восемь светодиодов, что означает полную емкость. Если же напряжение батареи около нуля, то все светодиоды будут погашены.
INCLUDE HT46R63.INC
;-----------------------------------------------------------------------------
;HT46R63 battery energy capacity detector
;-----------------------------------------------------------------------------
DATA. SECTION AT 30H 'DATA' ;data start
CLR_MEM_COUNTER DB question ;declare
CLR_MEM_COUNTER register
AD_VALUE DB question ;declare AD_VALUE register
VARIABLE DB question ;declare VARIABLE register
;-----------------------------------------------------------------------------
CODE. SECTION AT 0 'CODE' ;program start
ORG 00H
JMP START
START:
MOV A, 0FFH-30H
MOV CLR_MEM_COUNTER, A
MOV A, 31H
MOV MP0, A
CLR_MEM:
CLR R0
INC MP0
SDZ CLR_MEM_COUNTER
JMP CLR_MEM
MAIN:
MOV A, 48H
MOV ADCR, A
;set AN0 as analog input, use an
;analog channel only
SET ADCR.7
CLR ADCR.7 ;A/D converter in action
LOOP:
SZ ADCR.6 ;when EOCB=0, A/D conversion is
;completed
JMP LOOP ;when EOCB=1, jump LOOP to
;convert
CLR PAC ;set PA OUTPUT
CLR PA ;set PA LOW VOLTAGE
NOP
MOV A, ADR
MOV AD_VALUE, A ;put A/D conversion value into
;AD_VALUE register
MOV VARIABLE, A
MOV A, 0AH
SUB A, VARIABLE
SNZ C
;compare 0AH with VARIABLE
;register value
JMP LOOP1
SZ Z ;judge whether 0AH and VARIABLE
;are the same
JMP LOOP1 ;if they are the same, jump to
;LOOP1
JMP MAIN ;if they are not the same, jump
;to MAIN
LOOP1:
SET PA0
MOV A, AD_VALUE
MOV VARIABLE, A
MOV A, 13H
SUB A, VARIABLE
SNZ C ;compare 13H with VARIABLE
;register value
JMP LOOP2
SZ Z ;judge whether 13H and VARIABLE
;are the same
JMP LOOP2 ;if they are the same, jump to
;LOOP2
JMP MAIN
LOOP2:
SET PA0
SET PA1
MOV A, AD_VALUE
MOV VARIABLE, A
MOV A, 1DH
SUB A, VARIABLE
SNZ C ;compare 1DH with VARIABLE
;register value
JMP LOOP3
SZ Z ;judge whether 1DH and VARIABLE
;are the same
JMP LOOP3 ;if they are the same, jump to
;LOOP3
JMP MAIN
LOOP3:
SET PA0
SET PA1
SET PA2
MOV A, AD_VALUE
MOV VARIABLE,A
MOV A, 26H
SUB A,VARIABLE
SNZ C ;compare 26H with VARIABLE
;register value
JMP LOOP4
SZ Z ;judge whether 26H and VARIABLE
;are the same
JMP LOOP4 ;if they are the same, jump to
;LOOP4
JMP MAIN
LOOP4:
SET PA0
SET PA1
SET PA2
SET PA3
MOV A, AD_VALUE
MOV VARIABLE, A
MOV A, 2FH
SUB A, VARIABLE
SNZ C ;compare 2FH with VARIABLE
;register value
JMP LOOP5
SZ Z ;judge whether 2FH and VARIABLE
;are the same
JMP LOOP5 ;if they are the same, jump to
;LOOP5
JMP MAIN
LOOP5:
SET PA0
SET PA1
SET PA2
SET PA3
SET PA4
MOV A, AD_VALUE
MOV VARIABLE, A
MOV A, 38H
SUB A, VARIABLE
SNZ C ;compare 38H with VARIABLE
;register value
JMP LOOP6
SZ Z ;judge whether 38H and VARIABLE
;are the same
JMP LOOP6 ;if they are the same, jump to
;LOOP6
JMP MAIN
LOOP6:
SET PA0
SET PA1
SET PA2
SET PA3
SET PA4
SET PA5
MOV A, AD_VALUE
MOV VARIABLE, A
MOV A, 41H
SUB A,VARIABLE
SNZ C ;compare 41H with VARIABLE
;register value
JMP LOOP7
SZ Z ;judge whether 41H and VARIABLE
;are the same
JMP LOOP7 ;if they are the same, jump to
;LOOP7
JMP MAIN
LOOP7:
SET PA0
SET PA1
SET PA2
SET PA3
SET PA4
SET PA5
SET PA6
MOV A, AD_VALUE
MOV VARIABLE, A
MOV A, 4DH
SUB A, VARIABLE
SNZ C ;compare 4DH with VARIABLE
;register value
JMP LOOP8
SZ Z ;judge whether 4DH and VARIABLE
;are the same
JMP LOOP8 ;if they are the same, jump to
;LOOP8
JMP MAIN
LOOP8:
SET PA0
SET PA1
SET PA2
SET PA3
SET PA4
SET PA5
SET PA6
SET PA7
JMP MAIN
END
|
Приложение. Исходный код программы
Аппаратная реализация
Разработанная схема измерителя емкости батареи представлена на рис. 1 и содержит микроконтроллер и несколько внешних элементов. RC-фильтр, установленный между плюсом питания и аналоговым входом, предназначен для устранения помех. При разработке схемы использовались средства разработки TICE46SER0000A и HT-IDE3000.
Аналого-цифровое преобразование
Чтобы использовать аналого-цифровой преобразователь микроконтроллера HT46, необходимо выполнить следующее:
- Сконфигурировать каналы порта В установкой PCR2, PCR1 и PRC0.
- Выбрать канал для АЦ-преобразования установкой ACS2, ACS1 и ACS0. Выбранный канал должен быть сконфигурирован (шаг 1).
- Установить бит ADCR.7 = 0->1->0 для запуска АЦ-преобразования, ЕОС будет находиться в 1, пока будет идти процесс АЦ-преобразования.
- Ожидание 76 тактов АЦП для завершения АЦ-преобразования, после чего ЕОС устанавливается в 0 (завершение процесса). Если разрешено прерывание от АЦП, то устанавливается флаг запроса на прерывание
от АЦП.
- Чтение результата АЦ-преобразования в регистре ADR.
Определение частоты АЦ-преобразования
Каждое аналого-цифровое преобразование занимает 76 тактов, которые задаются ADCS1 и ADCS0 (см. таблицу).
Таблица
ADCS1 |
ADCS0 |
Частота АЦП |
0 |
0 |
FSYS/2 |
0 |
1 |
FSYS/8 |
1 |
0 |
FSYS/32 |
1 |
1 |
Не определено |
Блок-схема алгоритма программы показана на рис. 2, а исходный код программы — на предыдущей странице.
Рис. 2. Блок-схема алгоритма
Чиа Вей Шеу Перевод: Николай Ракович
|