
MSP430_Final
.pdf
|
|
|
21.3. Регистры модуля ADC12 501 |
|
|
|
|
SHP |
Бит 9 |
Выбор импульсного режима работы устройства выборки/хранения. |
|
|
|
Этот бит определяет источник сигнала выборки SAMPCON — выход |
|
|
|
таймера выборки или непосредственно сигнал выборки. |
|
|
|
0 |
Сигнал SAMPCON формируется из входного сигнала выборки |
|
|
1 |
Сигнал SAMPCON формируется таймером выборки |
ISSH |
Бит 8 |
Инвертирование сигнала запуска выборки/преобразования. |
|
|
|
0 |
Сигнал запуска выборки/преобразования не инвертируется |
|
|
1 |
Сигнал запуска выборки/преобразования инвертируется |
ADC12DIVx |
Биты |
Коэффициент деления тактового сигнала модуля ADC12. |
|
|
7…5 |
000 |
1 |
|
|
001 |
2 |
|
|
010 |
3 |
|
|
011 |
4 |
|
|
100 |
5 |
|
|
101 |
6 |
|
|
110 |
7 |
|
|
111 |
8 |
ADC12SSELx Биты |
Выбор источника тактового сигнала модуля ADC12. |
||
|
4…3 |
00 |
ADC12SC |
|
|
01 |
ACLK |
|
|
10 |
MCLK |
|
|
11 |
SMCLK |
CONSEQx |
Биты |
Выбор режима преобразования. |
|
|
2…1 |
00 |
Однократный одноканальный |
|
|
01 |
Однократный последовательный |
|
|
10 |
Циклический одноканальный |
|
|
11 |
Циклический последовательный |
ADC12BUSY Бит 0 |
Модуль ADC12 занят. Этот бит показывает активность операций вы |
||
|
|
борки или преобразования. |
|
|
|
0 |
Нет активности |
|
|
1 |
Производится выборка, преобразование или выполняется пос |
|
|
|
ледовательность преобразований |
ADC12MEMx, регистр данных буфера модуля ADC12
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
||
0 |
0 |
|
0 |
|
0 |
|
Результат преобразования |
|
|
|
|
|
|
|
|
|
|
|
|
r0 |
r0 |
|
r0 |
|
r0 |
rw |
rw |
rw |
rw |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
|
|
|
|
|
|
|
|||
|
|
|
|
Результат преобразования |
|
|
|||
|
|
|
|
|
|
|
|
|
|
rw |
rw |
|
rw |
|
rw |
rw |
rw |
rw |
rw |
Результат |
Биты |
12 битный результат преобразования выровнен по правому краю. |
|||||||
преобразо |
15…0 Бит 11 — MSB. Биты 15…12 всегда равны 0. Запись в регистры памя |
||||||||
вания |
|
ти преобразований вызовет порчу результата. |
|
|




22.2. Поддерживаемые теги 505
Таблица 22.1. Пример содержимого сегмента A
Адрес |
Старший байт |
|
Младший байт |
Адрес тега |
слова |
|
и смещение |
||
|
|
|
||
|
|
|
|
|
0x10FE |
CALBC1_1MHZ |
|
CALDCO1_1MHZ |
0x10F6 + 0x0008 |
|
|
|
|
|
0x10FC |
CALBC1_8MHZ |
|
CALDCO1_8MHZ |
0x10F6 + 0x0006 |
|
|
|
|
|
0x10FA |
CALBC1_12MHZ |
|
CALDCO1_12MHZ |
0x10F6 + 0x0004 |
|
|
|
|
|
0x10F8 |
CALBC1_16MHZ |
|
CALDCO1_16MHZ |
0x10F6 + 0x0002 |
|
|
|
|
|
0x10F6 |
0x08 (ДЛИНА) |
|
TAG_DCO_30 |
0x10F6 |
|
|
|
|
|
0x10F4 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10F2 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10F0 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10EE |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10EC |
0x08 (ДЛИНА) |
|
TAG_EMPTY |
0x10EC |
|
|
|
|
|
0x10EA |
|
CAL_ADC_25T85 |
0x10DA + 0x0010 |
|
|
|
|
|
|
0x10E8 |
|
CAL_ADC_25T30 |
0x10DA + 0x000E |
|
|
|
|
||
0x10E6 |
CAL_ADC_25VREF_FACTOR |
0x10DA + 0x000C |
||
|
|
|
|
|
0x10E4 |
|
CAL_ADC_15T85 |
0x10DA + 0x000A |
|
|
|
|
|
|
0x10E2 |
|
CAL_ADC_15T30 |
0x10DA + 0x0008 |
|
|
|
|
||
0x10E0 |
CAL_ADC_15VREF_FACTOR |
0x10DA + 0x0006 |
||
|
|
|
||
0x10DE |
CAL_ADC_OFFSET |
0x10DA + 0x0004 |
||
|
|
|
||
0x10DC |
CAL_ADC_GAIN_FACTOR |
0x10DA + 0x0002 |
||
|
|
|
|
|
0x10DA |
0x10 (ДЛИНА) |
|
TAG_ADC12_1 |
0x10DA |
|
|
|
|
|
0x10D8 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10D6 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10D4 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10D2 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10D0 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10CE |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10CC |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10CA |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10C8 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10C6 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10C4 |
0xFF |
|
0xFF |
|
|
|
|
|
|
0x10C2 |
0x16 (ДЛИНА) |
|
TAG_EMPTY |
0x10C2 |
|
|
|
|
|
0x10C0 |
Результат побитовой операции «Исключающее ИЛИ», представлен |
0x10C0 |
||
|
ный в дополнительном коде |
|
||
|
|
|
|
|
Таблица 22.2. Поддерживаемые теги (зависит от устройства)
Тег |
Описание |
Значение |
|
|
|
TAG_EMPTY |
Неиспользуемая область памяти |
0xFE |
|
|
|
TAG_DCO_30 |
Калибровочные значения DCO для комнатной температуры и DVCC = 3 В |
0x01 |
TAG_ADC12_1 |
Калибровочные значения для модуля ADC12 |
0x08 |
|
|
|


22.2. Поддерживаемые теги 507
Таблица 22.4. Данные для калибровки модуля ADC12 (зависит от устройства)
Метка |
|
Описание |
Смещение |
|
|
|
|
|
|
CAL_ADC_25T85 |
VREF2_5 = 1, TA = +85 |
±2°C, 12 битный результат |
0x0E |
|
|
преобразования |
|
|
|
CAL_ADC_25T30 |
VREF2_5 = 1, TA = +30 |
±2°C, 12 битный результат |
0x0C |
|
|
преобразования |
|
|
|
CAL_ADC_25VREF_FACTOR |
VREF2_5 |
= 1, TA = +30 |
±2°C |
0x0A |
CAL_ADC_15T85 |
VREF2_5 |
= 0, TA = +85 |
±2°C, 12 битный результат |
0x08 |
|
преобразования |
|
|
|
|
|
|
|
|
CAL_ADC_15T30 |
VREF2_5 |
= 0, TA = +30 |
±2°C, 12 битный результат |
0x06 |
|
преобразования |
|
|
|
CAL_ADC_15VREF_FACTOR |
VREF2_5 |
= 0, TA = +30 |
±2°C |
0x04 |
CAL_ADC_OFFSET |
VeREF = 2.5 В, TA = +85 ±2°C, fADC12CLK = 5 МГц |
0x02 |
||
CAL_ADC_GAIN_FACTOR |
VeREF = 2.5 В, TA = +85 ±2°C, fADC12CLK = 5 МГц |
0x00 |
Данные для калибровки датчика температуры
Датчик температуры калибруется с использованием встроенного источника опорного напряжения. Результаты преобразования для температур +30°C и +85°C при разных значениях бита VREF2_5 заносятся в соответствующие ячейки сег мента А (см. Табл. 22.4).
Данные для калибровки встроенного источника опорного напряжения
Опорные напряжения (VREF2_5 = 0 и 1) измеряются при комнатной темпе ратуре. Измеренное значение перед записью в сегмент А флэш памяти нормали зуется относительно уровня 1.5/2.5 В:
CAL_ADC_15VREF_FACTOR = Ve REF ×215 .
1.5 В
Корректировка результата преобразования производится его умножением на коэффициент CAL_ADC_15VREF_FACTOR (или CAL_ADC_25VREF_FACTOR) с последующим делением на 215:
ADCкоррект = ADCисх ×CAL_ADC_15VREF_FACTOR × 1 .
215
Пример использования калибровки источника опорного напряжения
В следующем примере при выполнении преобразования используется внут реннее опорное напряжение 1.5 В.
1.Результат преобразования: 0x0100.
2.Калибровочный коэффициент опорного напряжения: 0x7BBB.
Для корректирования результата преобразования модуля ADC12 можно вос пользоваться аппаратным умножителем:
1.Умножить результат преобразования на 2 (эта операция упростит последующее деление).

508 Глава 22. Структура TLV
2.Умножить результат на величину CAL_ADC_15VREF_FACTOR.
3.Разделить результат на 216 (взять старшее слово 32 битного результата умноже ния RESHI).
Внашем примере:
1.0x0100 0x0002 = 0x0200
2.0x0200 0x7BBB = 0x00F7_7600
3.0x00F7_7600 0x0001_0000 = 0x0000_00F7 (= 247)
Ниже приведён фрагмент программы, выполняющий описанные действия с использованием аппаратного умножителя.
;Результат АЦП находится в регистре ADC12MEM0
;Предполагается, что R9 содержит адрес TAG_ADC12_1.
;Скорректированное значение заносится в ячейку ADC_COR
MOV.W &ADC12MEM0,R10 |
; Копируем результат в R10 |
RLA.W R10 |
; R10 x 2 |
MOV.W R10,&MPY |
; 1$й операнд, беззнаковое умножение |
MOV.W CAL_ADC_15VREF_FACTOR(R9),&OP2 |
|
|
; 2$й операнд — калибровочное значение |
MOV.W &RESHI,&ADC_COR |
; Результат: старшие 16 бит регистра MPY |
Данные для калибровки смещения и коэффициента усиления
Значение смещения модуля ADC12 хранится в сегменте A в виде 2 байтного значения, представленного в дополнительном коде. Ошибка смещения коррек тируется сложением результата преобразования со значением CAL_ADC_OFFSET:
ADCкоррект = ADCисх + CAL_ADC_OFFSET .
Коэффициент усиления модуля ADC12, расположенный по смещению 0x00, вычисляется следующим образом:
CAL_ADC_GAIN_FACTOR = 1 ×215 .
GAIN
Корректирование результата преобразования по усилению производится его
умножением на значение CAL_ADC_GAIN_FACTOR и последующим делением на 215:
ADCкоррект = ADCисх ×CAL_ADC_GAIN_FACTOR × 1 .
215
Если результат преобразования корректируется по обоим параметрам, то пер вой осуществляется корректировка усиления:
ADCкоррект, усил = ADCисх ×CAL_ADC_GAIN_FACTOR × 1 ;
215
ADCитог = ADCкоррект, усил + CAL_ADC_OFFSET .

22.3. Проверка целостности содержимого сегмента A 509
Пример использования калибровки смещения и усиления
В следующем примере при выполнении преобразования используется вне шний источник опорного напряжения.
Результат преобразования: 0x0800 (= 2048).
Калибровочный коэффициент по усилению: 0x7BBB.
Смещение: 0xFFFE (–2 в дополнительном коде).
Для корректирования результата преобразования модуля ADC12 можно вос пользоваться аппаратным умножителем:
1.Умножить результат преобразования на 2 (эта операция упростит последующее деление).
2.Умножить результат на величину CAL_ADC_GAIN_FACTOR.
3.Разделить результат на 216 (взять старшее слово 32 битного результата умноже ния RESHI).
4.Прибавить к результату значение CAL_ADC_OFFSET.
Внашем примере:
1.0x0800 0x0002 = 0x1000
2.0x1000 0x8010 = 0x0801_0000
3.0x0801_0000 0x0001_0000 = 0x0000_0801 (= 2049)
4.0x801 + 0xFFFE = 0x07FF (= 2047)
Ниже приведён фрагмент программы, выполняющий описанные действия с использованием аппаратного умножителя.
;Результат АЦП находится в регистре ADC12MEM0
;Предполагается, что R9 содержит адрес TAG_ADC12_1.
;Скорректированное значение заносится в ячейку ADC_COR MOV.W &ADC12MEM0,R10 ; Копируем результат в R10
RLA.W R10 |
; R10 |
x 2 |
|
MOV.W R10,&MPY |
; |
1$й операнд, беззнаковое умножение |
|
MOV.W CAL_ADC_GAIN_FACTOR(R9),&OP2 |
|||
|
; |
2$й |
операнд — калибровочное значение |
MOV.W &RESHI,&ADC_COR ; Используем старшие 16 бит регистра MPY ADD.W CAL_ADC_OFFSET(R9),&ADC_COR
;Корректируем смещение
22.3.Проверка целостности содержимого сегмента A
По адресам 0x10C0 и 0x10C1 расположена 2 байтная контрольная сумма со держимого сегмента A с адреса 0x10C2 по 0x10FF. Контрольная сумма представ ляет собой результат побитовой операции «Исключающее ИЛИ» между осталь ными словами сегмента, представленный в дополнительном коде.
Ниже приведён фрагмент кода, в котором вычисляется контрольная сумма сегмента A.
;Проверка целостности содержимого сегмента A флэш$памяти
;путём вычисления обратного кода слов, расположенных по
;адресам 0x10C2 – 0x10FE

510 Глава 22. Структура TLV
;Предполагается, что начальный адрес сегмента A находится
;в R10. Регистр R11 инициализирован нулевым значением.
;Метка TLV_CHKSUM соответствует адресу 0x10C0
ADD.W |
#2,R10 |
; Пропускаем поле контрольной суммы |
LP0 XOR.W |
@R10+,R11 |
; Прибавляем слово к контрольной сумме |
CMP.W |
#0x10FF,R10 |
; Последнее слово? |
JN |
LP0 |
; Нет, продолжаем |
ADD.W |
&TLV_CHKSUM,R11 |
; Прибавляем контрольную сумму |
JNZ |
CSNOK |
; Контрольная сумма не верна |
... |
|
; Используем данные сегмента A |
CSNOK ... |
|
; Не используем данные сегмента A |
22.4. Анализ содержимого сегмента A
Ниже приведён пример кода, выполняющего анализ содержимого сегмента A.
; Предполагается, что начальный адрес сегмента A находится в R10
LP1 |
ADD.W |
#2,R10 |
; |
Пропускаем два байта |
|
CMP.W |
#0x10FF,R10 |
; |
Дошли до конца сегмента? |
|
JGE |
DONE |
; Да, переходим к метке DONE |
|
|
CMP.B |
#TAG_EMPTY,0(R10) |
|
|
|
|
|
; TAG_EMPTY? |
|
|
JNZ |
T1 |
; Нет, продолжаем |
|
|
JMP |
LP2 |
; Да, обрабатываем тег TAG_EMPTY |
|
T1 |
CMP.B |
#TAG_ADC12_1,0(R10) |
||
|
|
|
; TAG_ADC12_1? |
|
|
JNZ |
T2 |
; Нет, продолжаем |
|
|
... |
|
; Да, найден TAG_ADC12_1 |
|
|
JMP |
LP2 |
; Обрабатываем тег TAG_ADC12_1 |
|
T2 |
CMP.B |
#DCO_30,0(R10) |
; TAG_DCO_30? |
|
|
JNZ |
T3 |
; Нет, продолжаем |
|
|
CLR.B |
&DCOCTL |
; Устанавливаем наименьшее значение DCOx |
|
|
MOV.B |
7(R10),&BCSCTL1 |
; Да, используем данные для 8 МГц |
|
|
MOV.B |
6(R10),&DCOCTL |
; и задаём DCOx и MODx |
|
|
JMP |
LP2 |
; Обрабатываем тег TAG_DCO_30 |
|
T3 |
... |
|
; Проверяем на следующий тег |
|
|
... |
|
; |
|
|
JMP |
LP2 |
; Обрабатываем следующий тег |
|
LP2 |
MOV.B |
1(R10),R11 |
; Запоминаем длину в R11 |
|
|
ADD.W |
R11,R10 |
; Прибавляем длину к R10 |
|
|
JMP |
LP1 |
; Продолжаем анализ |
|
DONE |
|
|
; |
|