Цифровой термометр на базе MSP430
В этом примере описывается разработка цифрового термометра с использованием возможностей slope-аналогово-цифрового преобразования на базе модуля таймера-порта Timer Port микроконтроллеров MSP430x3xx. В общем плане можно рассматривать данную разработку как пример подключения резистивных датчиков и опорных резисторов к модулю таймера – порта Timer Port.
1 Введение
В этом примере описывается разработка цифрового термометра с использованием возможностей slope-аналогово-цифрового преобразования на базе модуля таймера-порта Timer Port микроконтроллеров MSP430x3xx. В общем плане можно рассматривать данную разработку как пример подключения резистивных датчиков и опорных резисторов к модулю таймера – порта Timer Port. Такой модуль входит в состав всех микроконтроллеров серии MSP430x3xx. Таймер – порт позволяет подключать несколько резистивных датчиков и опорных резисторов, как и сделано в данном приборе. Неиспользуемые выводы модуля могут быть использованы в качестве независимых выходов.
1.1 Краткое описание микроконтроллеров со сверхнизким энергопотреблением семейства MSP430
MSP430 это 16-разрядный микроконтроллер с RISC-архитектурой, обладающий дополнительными функциями, облегчающими разработку и ортогональной структурой, обеспечивающей ядру повышенную вычислительную мощность наряду с высокой гибкостью использования. Эти особенности позволяют микроконтроллеру MSP430 потреблять всего 400 мкA в активном режиме в типовой 3-вольтовой схеме. MSP430 потребляет только 2 мкA в спящем режиме и выходит из него в полностью синхронизированный активный режим не более, чем за 6 мкс. Подсемейства серии MSP430 включают различные наборы периферийных модулей, представляя собой высокоинтегрированные системы. На рис.1 показана блок-диаграмма микроконтроллеров MSP430x32x.
Рис. 1 Блок-схема микроконтроллеров серии MSP430x32x
1.2 Описание схемы
Схема состоит из термистора (Radio Shack #271–110), опорного резистора сопротивлением 10кОм и конденсатора 0.1 мкФ. Детали подключаются непосредственно к MSP430, как показано на рис.2. Если требуется визуальное отображение информации, то может быть подключен ЖКИ. Прибор осуществляет измерения путём заряда конденсатора до уровня примерно равного VCC, последующего разряда его через опорный резистор с одновременным подсчётом внутренних тактов до того момента, пока на входе CIN не появится лог. «0». Далее конденсатор снова заряжается до значения, близкого к VCC и разряжается через термистор, при этом также подсчитываются тактовые импульсы. Неизвестное сопротивление резистора вычисляется как отношение числа тактов при разряде конденсатора термистором к числу тактов при разряде через опорный резистор и последующим домножением на известное значение сопротивления опорного резистора. Программа вычисляет сопротивление термистора, переводит это значение в температуру, переводит её в градусы Фаренгейта и отображает значение на ЖКИ. Несмотря на то, что текущее значение отображается непрерывно, MSP430 проводит основную часть времени в режиме пониженного потребления 3 (LPM3). Это время может быть использовано для проведения дополнительных измерений, для связи с другими устройствами или для осуществления вычислений.
Рис.2 Схема цифрового термометра
Все три элемента схемы могут быть подключены непосредственно к отладочной плате Texas Instruments MSP430 starter kit (STK) или evaluation kit (EVK). Остальные соединения, в том числе, требуемые для ЖКИ уже присутствуют на платах STK и EVK. Приведенный пример программы полностью помещается в 512 байт ОЗУ, имеющейся в наличии на отладочных платах STK и EVK, базирующихся на микроконтроллерах MSP430x325. Программа может быть загружена в ОЗУ через последовательный порт компьютера с использованием имеющегося на платах интерфейса.
2 Описание работы
Формула времени разряда конденсатора имеет следующий вид:
Значения C, fclock, и Vref/Vcc известны. Значение резистивного датчика могут быть получены из следующей формулы, с учётом того, что сопротивление опорного резистора это известная и постоянная величина:
Окончательная формула для схемы на рис.2 будет иметь вид:
3 Возможности таймера – порта Timer Port
Модуль таймера – порта поддерживает различные комбинации резистивных датчиков и опорных резисторов. Если требуется проведение нескольких различных измерений в пределах одного диапазона сопротивлений, можно использовать только один опорный резистор. В противном случае, для каждого датчика нужно использовать свой опорный резистор. (см. Рис 3). Все неиспользуемые выводы могут быть использованы в качестве цифровых выходов. Модуль Timer Port также включает в себя 2 8-битных счётчика с возможностью каскадирования в 1 16-битный счётчик. В случае, если эти счётчики не используются таймером – портом, они могут быть использованы для других целей. Дополнительную информацию можно найти в Metering Applications Report (файл SLAAE10C) и Architecture Guide and Module Library User’s Guide (файл SLAUE10B).
Рис. 3 Пример применения модуля таймера-порта.
4 Заключение
Timer Port, присутствующий в семействе MSP430x3xx, представляет собой весьма универсальный модуль. С его помощью можно измерять показания разнообразных резистивных датчиков в комбинациях с опорными резисторами. Детали схемы могут быть непосредственно подключены к модулю Timer Port, формируя, таким образом, полноценную измерительную систему с минимальным количеством навесных элементов. Совместно с модулем таймера-порта, 16-разрядное ЦПУ с ультранизким потреблением демонстрирует непревзойдённые характеристики MIPS на ватт.
;****************************************************************************
;****************************************************************************
; Системные определения для 320 STK/EVK
;****************************************************************************
TOOL SET 0 ; 0 = STK/EVK ОЗУ
; 1 = Симулятор
; 2 = Встроенное ПЗУ
STACK EQU 003DEH ; Указатель стека
RAM_ORIG EQU 00200H ; Начальный адрес памяти ОЗУ
ROM_ORIG EQU 0C100H ; Начальный адрес памяти ПЗУ
IF TOOL = 0
I_VECTORS EQU 003FFH ; Вектора прерываний в ОЗУ
MAIN EQU RAM_ORIG+20H ; Стартовый адрес программы в ОЗУ
BTLOAD EQU 035H ; Прерывания раз в 0,5 сек.
ELSEIF TOOL = 1
I_VECTORS EQU 0FFFFH ; Вектора прерываний в ПЗУ
MAIN EQU ROM_ORIG ; Стартовый адрес программы в ПЗУ
BTLOAD EQU 011H ; Частые прерывания (не 1 сек)
ELSE
I_VECTORS EQU 0FFFFH ; Вектора прерываний в ПЗУ
MAIN EQU ROM_ORIG ; Стартовый адрес программы в ПЗУ
BTLOAD EQU 035H ; Прерывания раз в 0,5 сек.
.ENDIF
;****************************************************************************
; Определения для АЦП на базе модуля TIMER PORT
;****************************************************************************
TPCTL EQU 04BH ; Регистр управления модулем
; TIMER PORT (04BH)
TPSSEL0 EQU 040H ; Источник тактирования: 0=CMP,
; 1=ACLK (Бит 6 в TPCTL)
ENB EQU 020 ; Контроль сигнала EN1 в TPCNT1
; 1(+ENA=1)=CMP (Бит 5 в TPCTL)
ENA EQU 010H ; Контроль сигнала EN1 в TPCNT1
; 1(+ENB=1)=CMP (Бит 4 в TPCTL)
EN1 EQU 008H ; Сигнал ENABLE в TPCNT1 только
; для чтения (Бит 3 в TPCTL)
RC2F EQU 004H ; Флаг переполнения TPCNT2
; (Бит 2 в TPCTL)
EN1FG EQU 001H ; Флаг EN1 (Бит 0 в TPCTL)
TPIE EQU 004H ; Разрешение прерываний от TIMER
; PORT (Бит 3 в IE2)
TPCNT1 EQU 04CH ; Младший байт счётчика
TPCNT2 EQU 04DH ; Старший байт счётчика
TP EQU 04EH ; Регистр данных TP (0–5= Выход TP,
; 6=CPON,7 = B16 = 2x8 Бит или
; 1x16Бит счётчик)
B16 EQU 080H ; Раздельные таймеры (0) или
; один 16-битный (1)
CPO EQU 040H ; Компаратор выкл (0) / вкл (1)
TPDMAX EQU 002H ; Позиция бита выхода TPD.MAX
; (2=Бит1=TPD.1)
TPE EQU 04FH ; Регистр разрешения выходов
; (0–5 = Биты разрешения TPD
; 6–7=источник тактирования TPCNT2)
MSTACK EQU 03D2H ; 1-е слово стека результата
PRESET EQU 0E8H ;Предустановка TPCNT2 для заряда С
; счёт останавливается при
; переполнении TPCNT2, значение
; рассчитано на постоянную
; времени 6RC
;****************************************************************************
; Определения управляющих регистров
;****************************************************************************
IE1 EQU 0H ; Регистр разрешения прерываний 1
IE2 EQU 01H ; Регистр разрешения прерываний 2
P01IE EQU 08H ;Разрешение прерываний от P0.1 в IE1
BTIE EQU 080H ; Разрешение прерываний от BASIC
; TIMER в IE2
IFG1 EQU 02H ; Регистр флагов прерываний 1
IFG2 EQU 03H ; Регистр флагов прерываний 2
LCDCTL EQU 030H ; Регистр управления ЖКИ
LCDM1 EQU 031H ; Первая ячейка памяти ЖКИ
BTCTL EQU 040H ; Регистр управления BASIC TIMER
BTCNT1 EQU 0046H ; Счётчик 1 BASIC TIMER
BTCNT2 EQU 0047H ; Счётчик 2 BASIC TIMER
WDTCTL EQU 0120H ; Регистр управления WATCHDOG
WDTHOLD EQU 080H ; Маска останова WATCHDOG
WDT_KEY EQU 05A00H ; Ключ доступа к WATCHDOG
WDT_STOP EQU 05A80H ; WATCHDOG маска + ключ
GIE SET 8H ; Общее разрешение прерываний
CPUOFF SET 10H ; Бит выключения CPU
OSCOFF SET 20H ; Бит выключения генератора
SCG0 SET 40H ; Контроль системного
; тактирования, бит0
SCG1 SET 80H ; Контроль системного
; тактирования, бит1
LPM0 SET CPUOFF ; Биты установки режима LPM0
LPM1 SET SCG0+CPUOFF ; Биты установки режима LPM1
LPM2 SET SCG1+CPUOFF ; Биты установки режима LPM2
LPM3 SET SCG1+SCG0+CPUOFF ; Биты установки режима LPM3
LPM4 SET OSCOFF+CPUOFF ; Биты установки режима LPM4
;***************************************************************************
; Служебные регистры для вычисления сопротивления датчика
;***************************************************************************
MLTPLR_HW EQU R5
TEN_K EQU R6
BITTEST EQU R7
MRESLT_HW EQU R8
MRESLT_LW EQU R9
LPCNTR EQU R10
RESULT EQU R11
;***************************************************************************
; Начало программы
;***************************************************************************
SECT ”MAIN”,MAIN
RESET MOV #STACK,SP ; Инициализация указателя стека
;***************************************************************************
; Конфигурация периферии
;***************************************************************************
SETUP
SETUPINT MOV.B #P01IE,&IE1 ; Разрешить P0.1/UART для
; монитора RS232
MOV.B #BTIE+TPIE,&IE2 ; Разрешить прерывания от B.TIMER, & TMR. PORT
CLR.B &IFG1 ; Очистить все флаги прерываний
CLR.B &IFG2 ;
EINT ; Разрешить прерывания
SETUPWDT MOV #WDT_STOP,&WDTCTL
; Остановить WATCHDOG TIMER
SETUPLCD MOV.B #0FFH,&LCDCTL ; ЖКИ STK, все сегменты, 4MUX
SETUPBT MOV.B #BTLOAD,&BTCTL ; Загрузить требуемую частоту
; прерываний в BASIC TIMER
CLR.B &BTCNT1 ; Очистить счётчик BT 1
CLR.B &BTCNT2 ; Очистить счётчик BT 2
CLEARLCD MOV #15,R6 ; Очистить 15 ячеек памяти ЖКИ
CLEAR1 MOV.B #0,LCDM1–1(R6) ; записав туда «0»
DEC R6 ; Вся памяти ЖКИ очищена?
JNZ CLEAR1 ; нет, чистим дальше
;***************************************************************************
; Начало основной программы
;***************************************************************************
BEGIN BIS #LPM3,SR ; Установить SR-биты для LPM3
;***************************************************************************
;Подпрограмма измерения с запрещёнными прерываниями. TP.2–.5 не используются
;поэтому переписаны. Используются только TPD.0 & 1.
;Начальная инициализация: Указатель стека = 0, Начало с TPD.1
;16–битный таймер, тактирование от MCLK, CIN разрешает счёт
;***************************************************************************
MEASURE PUSH.B #TPDMAX ; Сохранить в стеке для
; последующего использования
CLR R8 ; Указатель для стека результата
MEASLOP MOV.B #(TPSSEL0*3)+ENA,&TPCTL
;TPCNT1 CLK=MCLK, EN1=1
;***************************************************************************
; Конденсатор С заряжается на протяжении t > 5 ?. Используются выходы N–1
;***************************************************************************
MOV.B #B16+TPDMAX–1,&TPD
;один 16-битный счётчик,
; выбор выходов заряда
MOV.B #TPDMAX–1,&TPE ; Разрешить выходы заряда
MOV.B #PRESET,&TPCNT2 ; Загрузить время заряда
BIS #CPUOFF,SR ; Режим пониженного потребления
MOV.B @SP,&TPE ; Разрешить только текущий датчик
CLR.B &TPCNT2
;***************************************************************************
; Запретить все прерывания, чтобы обеспечить непрерывную работу таймера и
; разряд конденсатора
;***************************************************************************
DINT ; Запрет прерываний
CLR.B &TPCNT1 ; Очистить младший байт таймера
BIC.B @SP,&TPD ; Переключить все датчики в «0»
MOV.B #(TPSSEL0*3)+ENA+ENB,&TPCTL
;TPCNT1 CLK=MCLK,
; разрешить вход CIN
EINT ; Разрешить прерывания, общий старт
BIS #CPUOFF,SR ; Режим пониженного потребления
;***************************************************************************
; EN=0:Завершение преобразования: 2X8 бит результата в MSTACK
; Включить следующий датчик : если больше нет, завершение
;***************************************************************************
MOV.B &TPCNT1,MSTACK(R8)
; Сохранить результат в стеке
MOV.B &TPCNT2,MSTACK+1(R8)
; Сохранить старший байт результата
L$301 INCD R8 ; Инкремент адреса
RRA.B @SP ; Следующий выход TPD.X
JNC MEASLOP ; Если C=1 – завершение
INCD SP ; Убрать старший TPD из стека
;***************************************************************************
; Вычисление сопротивления датчика
;***************************************************************************
;Подпрограмма беззнакового умножения: MSTACK X TEN_K ? MRESLT_HW/MRESLT_LW
; Использованы регистры MSTACK, TEN_K, MLTPLR_HW,
; MRESLT_LW, MRESLT_HW, BITTEST
;Подпрограмма беззнакового умножения с накоплением :
; (MSTACK X TEN_K) + MRESLT_HW|MRESLT_LW –> MRESLT_HW|MRESLT_LW
;***************************************************************************
CALC_RES
MOV #10000,TEN_K ;Загрузить 10,000 десятичное в TEN_K
MPYU CLR MRESLT_LW ; 0 ? LSBS результата
CLR MRESLT_HW ; 0 ? MSBS результата
MACU CLR MLTPLR_HW ; 0 ? MSBS множителя
MOV #1,BITTEST ; Регистр проверки бит
L$002 BIT BITTEST,MSTACK ; Проверить текущий бит
JZ L$01 ; Если «0» ничего не делать
ADD TEN_K,MRESLT_LW ; Если «1» добавить множитель
; к результату
ADDC MLTPLR_HW,MRESLT_HW
L$01 RLA TEN_K ; Множитель X 2
RLC MLTPLR_HW ;
RLA BITTEST ; Проверить следующий бит
JNC L$002 ; Если бит в CARRY: завершить
;***************************************************************************
; Подпрограмма беззнакового деления 32–бита на 16-бит
; Использованы регистры (MSTACK+2), MRESLT_LW, RESULT, LPCNTR, MRESLT_HW
; MRESLT_HW MRESLT_LW / (MSTACK+2) ? RESULT Остаток в MRESLT_HW
; По выходу: CARRY = 0: OK CARRY = 1: Частное > 16 Бит
;***************************************************************************
DIVIDE CLR RESULT ; Очистить RESULT
MOV #17,LPCNTR ; Инициализация счётчика
DIV1 CMP MSTACK+2,MRESLT_HW
JLO DIV2
SUB MSTACK+2,MRESLT_HW
DIV2 RLC RESULT
JC RES_2_F ;Ошибка: RESULT > 16 Бит
DEC LPCNTR ; Декремент счётчика
JZ DIV3 ; 0: выход без ошибки
RLA MRESLT_LW
RLC MRESLT_HW
JNC DIV1
SUB MSTACK+2,MRESLT_HW
SETC
JMP DIV2
DIV3 CLRC ;Ошибки нет, C = 0
;***************************************************************************
; Перевод сопротивления датчика в градусы Фаренгейта для отображения
;***************************************************************************
RES_2_F
CLR R12 ; Указатель на значение в таблице R
MOV #064H,R13 ; Поместить мин. темп.-1 в темп.
; индикатор
JMP FIRST_CMP ; При первом сравнении 1 не добавлять
CHECK_R INCD R12 ; Инкремент указателя на значение
; в таблице сопротивлений
DADD #1,R13 ; Десятичный инкремент счётчика
FIRST_CMP CMP RESIS_TAB(R12),RESULT
; Сравнить табличное значение
; с вычисленным сопротивлением
JNC CHECK_R ; Переход, если R датчика
; < табличного значения
; по адресу указателя
;***************************************************************************
;Отобразить ”F” и знак «°» на ЖКИ
;***************************************************************************
DISPLAY MOV.B #A+E+F+G,LCDM1+1 ; ”F” ? дисплейная память ЖК
MOV.B #A+B+F+G,LCDM1+2 ; ” °” (знак градуса) ? дисплейная
; память ЖК
;***************************************************************************
; Отобразить значение, хранящееся в R13 в формате BCD на ЖКИ
;***************************************************************************
MOV R13,R12 ; Копировать число в виде BCD в R12
MOV #LCDM1+4,R14 ;Младшая цифра в памяти ЖКИ? R14
BIC #0FFF0H,R13 ; Погасить всё, кроме младшей цифры
MOV.B LCD_TAB(R13),0(R14)
; Отправить младшую цифру в ЖКИ
MOV R12,R13 ; Восстановить значение в R13
RRA R13 ; 4 сдвига
RRA R13
RRA R13
RRA R13
BIC #0FFF0H,R13 ; Погасить всё, кроме младшей цифры
MOV.B LCD_TAB(R13),1(R14)
; Отправить старшую цифру в ЖКИ
JMP BEGIN ; Переход к началу программы
;***************************************************************************
; Подпрограмма обработки прерываний базового таймера BASIC TIMER:
; ЦПУ по возвращении остаётся в активном режиме благодаря очистке битов LPM3 в
; статусном регистре SR в стеке.
;***************************************************************************
BTINT BIC #LPM3,0(SP) ;Очистить в SR биты LPM3, вверху стека
RETI
;***************************************************************************
; Подпрограмма обработки прерываний таймера – порта TIMER PORT:
; ЦПУ при возвращении по RETI остаётся в активном режиме
;***************************************************************************
TPINT CLR.b &TPCTL ; Очистить флаги прерываний TP,
; остановить счёт
BIC #LPM3,0(SP) ;Очистить в SR биты LPM3, вверху стека
RETI
;***************************************************************************
; ЖКИ модуля STK
;***************************************************************************
LCD_TYPE
A EQU 01H
B EQU 02H
C EQU 10H
D EQU 04H
E EQU 80H
F EQU 20H
G EQU 08H
H EQU 40H
LCD_TAB BYTE A+B+C+D+E+F ; Отображает”0”
.BYTE B+C ; Отображает”1”
.BYTE A+B+D+E+G ; Отображает”2”
.BYTE A+B+C+D+G ; Отображает”3”
.BYTE B+C+F+G ; Отображает”4”
.BYTE A+C+D+F+G ; Отображает”5”
.BYTE A+C+D+E+F+G ; Отображает”6”
.BYTE A+B+C ; Отображает”7”
.BYTE A+B+C+D+E+F+G ; Отображает”8”
.BYTE A+B+C+D+F+G ; Отображает”9”
;******************************************************************************
; Таблица сопротивлений 65–99 °F. Значения = KОмы X1000 – в 3 децимальных цифры
;******************************************************************************
.EVEN ; Выравнивание по чётному адресу
RESIS_TAB WORD 12953 ;65 F
.WORD 12666
.WORD 12378
.WORD 12090
.WORD 11858
.WORD 11626 ;70 F
.WORD 11393
.WORD 11161
.WORD 10929
.WORD 10697
.WORD 10464 ;75 F
.WORD 10232
.WORD 10000
.WORD 9813
.WORD 9625
.WORD 9438 ;80 F
.WORD 9250
.WORD 9063
.WORD 8875
.WORD 8688
.WORD 8500 ;85 F
.WORD 8313
.WORD 8161
.WORD 8008
.WORD 7856
.WORD 7703 ;90 F
.WORD 7551
.WORD 7398
.WORD 7246
.WORD 7093
.WORD 6941 ;95 F
.WORD 6817
.WORD 6694
.WORD 6570
.WORD 6446 ;99 F
;*****************************************************************************
; Вектора прерываний
;*****************************************************************************
.EVEN ; Выравнивание по чётному адресу
.SECT ”INT_VECT”,I_VECTORS–31
.WORD RESET ; PORT0, Биты 2 .. 7
.WORD BTINT ; BASIC TIMER
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD TPINT ; TIMER PORT
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD RESET ; Нет источника
.WORD RESET ; WATCHDOG/TIMER, Режим таймера
.WORD RESET ; Нет источника
.WORD RESET ; UART
.WORD RESET ; P0.0
.WORD RESET ; NMI, Сбой генератора
.WORD RESET ; POR,Внеш. Reset, WATCHDOG
.END
плазменные телевизоры
|