Институт ИРЭ
Кафедра ФОРС
Научный
руководитель ст. преп. Щукин А.В.
уч. степень должность подпись фамилия и инициалы
Консультант
уч. степень должность подпись фамилия и инициалы
Консультант
уч. степень должность подпись фамилия и инициалы
Дата
Москва, 2019
МИНОБРНАУКИ РОССИИ
федеральное государственное бюджетное образовательное
учреждение высшего образования
«Национальный исследовательский университет «МЭИ»
Институт ИРЭ
Кафедра ФОРС
ЗАДАНИЕ
НА ВЫПУСКНУЮ КВАЛИФИКАЦИОННУЮ РАБОТУ
(бакалаврскую работу)
Научный
руководитель ст. преп. Щукин А.В.
уч. степень должность подпись фамилия и инициалы
Консультант
уч. степень должность подпись фамилия и инициалы
Консультант
уч. степень должность подпись фамилия и инициалы
Количество листов
Количество слайдов в презентации
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА
АННОТАЦИЯ
АННОТАЦИЯ................................................................................................................... 4
СОДЕРЖАНИЕ................................................................................................................. 5
ВВЕДЕНИЕ....................................................................................................................... 7
ГЛАВА 1. РАССМАТРИВАЕМЫЕ ОСОБЕННОСТИ МИКРОКОНТРОЛЛЕРА
PIC24FV16KA301............................................................................................................. 8
1.1. Среда разработки MPLAB X IDE и компилятор MPLAB XC16................... 8
1.2. Микроконтроллер PIC24FV16KA301............................................................ 10
1.3. Организация памяти.........................................................................................19
1.3.1. Память программ.................................................................................... 19
1.3.2. Память данных........................................................................................21
1.4. Конфигурация осциллятора.............................................................................22
1.5. 12-битный аналого-цифровой преобразователь........................................... 24
1.6. Таймеры............................................................................................................. 28
1.6.1. Timer 1......................................................................................................29
1.6.2. Timer 2/3 и Timer 4/5.............................................................................. 32
ГЛАВА 2. ПРИНЦИПЫ РАБОТЫ МОДУЛЯ CTMU МИКРОКОНТРОЛЛЕРА
PIC24FV16KA301........................................................................................................... 39
2.1. Введение............................................................................................................ 39
2.2. Принцип работы CTMU...................................................................................41
2.2.1. Теоретические основы работы модуля................................................ 42
2.2.2. Источник тока......................................................................................... 43
2.2.3. Выбор и управление пороговым значением/уровнем........................ 43
2.2.4. Значение перепада.................................................................................. 44
2.2.5. Прерывания............................................................................................. 44
2.3. Калибровка модуля CTMU..............................................................................45
2.3.1. Калибровка источника тока...................................................................45
2.3.2. Калибровка режима диапазона малых значений тока........................46
2.3.3. Калибровка режима диапазона высоких значений тока.................... 48
2.3.4. Калибровка ёмкости............................................................................... 49
2.3.5. Вопросы калибровки и измерений....................................................... 51
2.3.6. Измерение внутреннего сопротивления.............................................. 52
2.4. Работа в режиме сна/холостого хода, влияние сброса модуля................... 52
2.5. Измерение ёмкости с помощью CTMU......................................................... 53
2.5.1. Измерение абсолютной ёмкости...........................................................53
2.5.2. Измерение относительного заряда и сенсорное измерение ёмкости54
2.5.3. Ёмкостный сенсорный датчик с автоматическим пороговым
обнаружением АЦП..........................................................................................56
2.5.4. Защита от электростатического разряда (ESD).................................. 57
2.6. Измерение времени с помощью модуля CTMU........................................... 58
2.7. Генерация задержек с помощью модуля CTMU...........................................60
2.8. Измерение температуры с помощью CTMU.................................................63
2.8.1. Конфигурация и калибровка................................................................. 64
ГЛАВА 3 ПРИМЕРЫ УСТРОЙСТВ НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
PIC24FV16KA301........................................................................................................... 66
3.1. Устройство для измерения уровня жидкости............................................... 66
3.1.1. Основные сведения................................................................................ 66
3.1.2. Принцип построения устройства..........................................................70
3.2. Устройство для оценки состояния кожи человека....................................... 79
3.2.1. Общие сведения...................................................................................... 79
3.2.2. Принцип построения устройства..........................................................81
ЗАКЛЮЧЕНИЕ...............................................................................................................84
СПИСОК ЛИТЕРАТУРЫ..............................................................................................85
ПРИЛОЖЕНИЯ.............................................................................................................. 86
Приложение 1. Код конфигурации модулей микроконтроллера для работы со
значениями тока из низкого диапазона значений................................................86
Приложение 2. Код конфигурации модулей микроконтроллера для работы со
значениями тока из высокого диапазона значений............................................. 89
Приложение 3. Код конфигурации модулей микроконтроллера для
калибровки и измерения абсолютной емкости.................................................... 92
Приложение 4. Код конфигурации модулей микроконтроллера для
калибровки и относительного измерения емкости..............................................95
Приложение 5. Код конфигурации модулей микроконтроллера для
калибровки и относительного измерения емкости с пороговым обнаружением
АЦП........................................................................................................................... 98
Приложение 6. Код конфигурации модулей микроконтроллера для измерения
времени................................................................................................................... 101
Приложение 7. Код конфигурации модулей микроконтроллера для генерации
задержек..................................................................................................................104
Приложение 8. Код конфигурации модулей микроконтроллера для измерения
температуры........................................................................................................... 106
Приложение 9. Код конфигурации модулей микроконтроллера для оценки
импеданса............................................................................................................... 108
ВВЕДЕНИЕ
В инженерной практике специалисту по радиотехнике требуется измерять
немалое количество физических параметров, таких, как: температура, время,
ёмкость, сопротивление. Для данных целей создаются отдельные измерительные
устройства. В качестве основы для таких измерителей можно выбрать
микроконтроллеры, в силу их дешевизны и доступности.
Характеристики PIC24FV16KA301:
10
• 17-битный одноцикловый аппаратный множитель.
11
• Внутренний датчик температуры.
• EEPROM данные:
12
Микроконтроллер PIC24FV16KA301 имеет:
• 3 компаратора.
• 2 UART
• 12 CTMU
13
Таблица 1
Номер
Особенность разъема
разъема
1 MCLR/VPP/RA5
2 PGEC2/VREF+/CVREF+/AN0/C3INC/SCK2/CN2/RA0
3 PGED2/CVREF-/VREF-/AN1/SDO2/CN3/RA1
PGED1/AN2/ULPWU/CTCMP/C1IND/C2INB/C3IND/U2TX/
4
SDI2/OC2/CN4/RB0
5 PGEC1/AN3/C1INC/C2INA/U2RX/OC3/CTED12/CN5/RB1
6 AN4/SDA2/T5CK/T4CK/U1RX/CTED13/CN6/RB2
7 OSCI/AN13/C1INB/C2IND/CLKI/CN30/RA2
8 OSCO/AN14/C1INA/C2INC/CLKO/CN29/RA3
9 PGED3/SOSCI/AN15/U2RTS/CN1/RB4
10 PGEC3/SOSCO/SCLKI/U2CTS/CN0/RA4
11 U1TX/C2OUT/OC1/IC1/CTED1/INT0/CN23/RB7
12 SCL1/U1CTS/C3OUT/CTED10/CN22/RB8
13 SDA1/T1CK/U1RTS/IC2/CTED4/CN21/RB9
14 VCAP
15 AN12/HLVDIN/SCK1/SS2/IC3/CTED2/INT2/CN14/RB12
16 AN11/SDO1/OCFB/CTPLS/CN13/RB13
CVREF/AN10/C3INB/RTCC/SDI1/C1OUT/OCFA/CTED5/INT1/CN12/
17
RB14
18 AN9/C3INA/SCL2/T3CK/T2CK/REFO/SS1/CTED6/CN11/RB15
19 VSS/AVSS
20 VDD/AVDD
14
Особенности микроконтроллера PIC24FV16KA301
1) 16-битная архитектура
2) Энергосберегающие технологии
15
• Работа в режиме ожидания: когда чувствительные ко времени
приложения, такие как последовательная связь, требуют бесперебойной работы
периферийных устройств, тактовая частота процессора может выборочно
снижаться, что позволяет постепенно экономить энергию, не пропуская такт.
• Режимы энергосбережения на основе инструкций. Существует три
режима энергосбережения на основе инструкций:
- Режим ожидания: ядро отключается, периферия остаётся
активной.
- Спящий режим: ядро и периферийные устройства, для которых
требуются системные часы, выключены, а периферийные устройства, которые
используют свои собственные часы или часы от других устройств, активны.
- Режим глубокого сна: ядро, периферия (кроме RTCC и DSWDT),
Flash и SRAM выключены.
3) Функции и настройка осциллятора
16
• Отдельный внутренний RC-осциллятор (LPRC) с фиксированным
выходом 31 кГц, который обеспечивает опцию малой мощности для
нечувствительных к синхронизации приложений.
Блок внутреннего осциллятора также обеспечивает стабильный эталонный
источник для Fail-Safe Clock Monitor (FSCM). Этот параметр постоянно
отслеживает основной источник тактовых импульсов от опорного сигнала,
представленной внутренним осциллятором и позволяет контроллеру
переключиться на внутренний осциллятор, что позволяет для продолжения
работы на малой скорости или безопасного отключения приложения.
4) Другие особенности
17
Рис. 1.2. Блок-схема микроконтроллера
На рисунке 1.2. изображены модули, которыми возможно воспользоваться
в микроконтроллере PIC24FV16KA301. Таблица 1 показывает, к какому
контакту надо подключиться, чтобы задействовать необходимый модуль.
18
1.3. Организация памяти
19
Рис. 1.3. Архитектура памяти программ микроконтроллера
PIC24FV16KA301
20
1.3.2. Память данных
21
реализованных адресов памяти, а верхняя половина (EA <15> = 1)
зарезервирована для области видимости программного пространства (PSV).
22
Упрощенная схема осцилляторной системы показана на рисунке 1.5.
23
Осциллятор FRC 8 МГц.
24
• Четыре варианта выравнивания результатов.
25
Рис. 1.6. Упрощённая блок-схема модуля АЦП
26
Регистры AD1CON1, AD1CON2 и AD1CON3 управляют всей работой
модуля АЦП. В их число сходит включение АЦП, настройки тактовой частоты
преобразования и опорное напряжение источников, выбор выборки и
преобразования триггеров, и ручной контроль преобразования
последовательности. Регистр AD1CON5 специально управляет функциями
операции обнаружения порога, включая ее функцию в режимах энергосбережения.
Регистр AD1CHS выбирает входные каналы для подключения к усилителю
S/H. Это также позволяет выбирать входные мультиплексоры и выбирать
эталонный источник для дифференциальной выборки.
27
1.6. Таймеры
28
Некоторые 16-разрядные таймеры могут быть объединены в 32-разрядный
таймер, в данном микроконтроллере такими таймерами являются Timer 2-4 и
Timer 3-5
1.6.1. Timer 1
16-битный таймер
29
1. Установить бит TON= 1.
30
Таблица 2
Бит Регистр Комментарий
15 TON Бит включения таймера:
1 - запуск таймера 1
0 - отключение таймера 1
14 - Неиспользуемый бит, читается как «0»
13 TSIDL Бит остановки таймера в режиме холостого хода
(режим ХХ):
1 - прерывание работы модуля в режиме ХХ
0 - продолжение работы модуля в режиме ХХ
12-10 - Неиспользуемый бит, читается как «0»
9-8 T1ECS<1:0> Биты выбора внешнего тактового сигнала:
11 - зарезервировано; не используется
10 - Timer1 использует LPRC в качестве источника
синхронизации
01 - Timer1 использует внешний тактовый сигнал от
T1CK
00 - Timer1 использует SOSC в качестве источника
синхронизации
7 - Неиспользуемый бит, читается как «0»
6 TGATE Бит запуска/остановки таймера внешним сигналом
Когда TCS = 1: Этот бит игнорируется
Когда TCS = 0:
1 - Запуск/остановка таймера разрешены
0 - Данный режим отключён
5-4 TCKPS<1:0> Коэффициент деления предделителя TMR 1:
11 - 1:256
10 - 1:64
01 - 1:8
00 - 1:1
3 - Неиспользуемый бит, читается как «0»
2 TSYNC Синхронизация внешнего тактового сигнала:
При TCS=1:
1 – синхронизировать внешний тактовый сигнал
0 – не синхронизировать внешний тактовый сигнал
При TCS=0:
Значение бита игнорируется, используется внутренний
тактовый сигнал
1 TCS Выбор источника тактового сигнала:
1 – внешний источник тактового сигнала с вывода
T1ECS<1:0>
Fosc
0 – внутренний тактовый сигнал
2
0 - Неиспользуемый бит, читается как «0»
31
1.6.2. Timer 2/3 и Timer 4/5
Триггер события A / D
32
1. Устанавливается бит T32 (T2CON<3> или T4CON<3> = 1).
33
6. Устанавливается бит TON (TxCON<15> = 1).
34
Рис. 1.11. Структурная схема 32-битных модулей Timer2/3 and Timer4/5
35
Рис. 1.12. Структурная схема 16-битных модулей Timer2 and Timer4
36
Таблица 3:
Бит Регистр Комментарий
15 TON Когда TxCON<3> = 1:
1 = запускается 32-битный Timerx/y
0 = останавливается 32-битный Timerx/y
Когда TxCON<3> = 0:
1 = запускается 16-битный Timerx
0 = останавливается 16-битный Timerx
14 - Неиспользуемый бит, читается как «0»
13 TSIDL Бит остановки таймера в режиме холостого хода
(режим ХХ):
1 - прерывание работы модуля в режиме ХХ
0 - продолжение работы модуля в режиме ХХ
12-7 - Неиспользуемый бит, читается как «0»
6 TGATE Бит разрешения запуска/остановки таймера внешним
сигналом
Когда TCS = 1: Этот бит игнорируется
Когда TCS = 0:
1 - Запуск/остановка таймера разрешены
0 - Данный режим отключён
5-4 TCKPS<1:0> Коэффициент деления предделителя TMR 1:
11 - 1:256
10 - 1:64
01 - 1:8
00 - 1:1
3 T32 Выбор разрядности таймера:
1 - Timer2 и Timer3 или Timer4 и Timer5 образуют
единый 32-битный таймер
0 - Timer2 и Timer3 или Timer4 и Timer5 действуют как
два 16-битных таймера
2 - Неиспользуемый бит, читается как «1»
1 TCS Выбор источника тактового сигнала:
1 – внешний источник тактового сигнала с вывода
TxCK, по нарастающему фронту
Fosc
0 – внутренний тактовый сигнал
2
0 - Неиспользуемый бит, читается как «0»
37
Таблица 4:
Бит Регистр Комментарий
15 TON Бит включения таймера:
1 - запуск таймера 1
0 - отключение таймера 1
14 - Неиспользуемый бит, читается как «0»
13 TSIDL Бит остановки таймера в режиме холостого хода
(режим ХХ):
1 - прерывание работы модуля в режиме ХХ
0 - продолжение работы модуля в режиме ХХ
12-7 - Неиспользуемый бит, читается как «0»
6 TGATE Бит разрешения запуска/остановки таймера внешним
сигналом
Когда TCS = 1: Этот бит игнорируется
Когда TCS = 0:
1 - Запуск/остановка таймера разрешены
0 - Данный режим отключён
5-4 TCKPS<1:0> Коэффициент деления предделителя TMR 1:
11 - 1:256
10 - 1:64
01 - 1:8
00 - 1:1
3-2 - Неиспользуемый бит, читается как «1»
1 TCS Выбор источника тактового сигнала:
1 – внешний источник тактового сигнала с вывода
TxCK, по нарастающему фронту
Fosc
0 – внутренний тактовый сигнал
2
0 - Неиспользуемый бит, читается как «0»
38
ГЛАВА 2. ПРИНЦИПЫ РАБОТЫ МОДУЛЯ CTMU
МИКРОКОНТРОЛЛЕРА PIC24FV16KA301
2.1. Введение
39
• Контроль источника тока во время автоматических замеров.
40
2.2. Принцип работы CTMU
41
2.2.1. Теоретические основы работы модуля
dV
I C (2.1)
dt
I t C V (2.2)
(C V )
t (2.3)
I
(I t)
C (2.4)
V
42
2.2.2. Источник тока
43
2.2.4. Значение перепада
2.2.5. Прерывания
44
также необходимо отслеживать биты состояния перепадов и определять, какой
перепад возник последним и вызвал прерывание.
45
ADCVREF 70%
RCAL (2.5)
CTMU Range
Таблица 5
2.2 мА 1 кОм
Эта калибровка подходит только для диапазонов 550 мкА и 5,5 мкА. Большое
отношение RCAL к RESD и RMUX позволяет игнорировать значения RESD и RMUX для
упрощения вычислений (см. рис. 2.3.). Процесс калибровки состоит из включения
источника тока и выборки напряжения, генерируемого через RCAL . Затем это
напряжение делится на известное значение резистора для расчёта тока CTMU.
Затем уравновешивание итеративно корректируется до тех пор, пока не будет
достигнута требуемая калибровка. Для калибровки требуется выполнить
следующие действия:
46
4. Включить CTMU.
6. Начать выборку.
9. Отключить CTMU.
Рис. 2.3. Структурная схема для калибровки режима диапазона низких значений
тока
47
2.3.3. Калибровка режима диапазона высоких значений тока
Рис. 2.4. Структурная схема для калибровки режима диапазона высоких значений
тока
48
2.3.4. Калибровка ёмкости
CTOTAL VDESIRED
Время задержки (2.7)
I
V
(4 пФ 11пФ ) 2.31 63 мкс (2.8)
0.55 мкА
(I t)
COFFSET CSYSTEM C ADC CSTRAY (2.9)
V
49
Рис. 2.5. Структурная схема для калибровки ёмкости
5. Включить CTMU.
7. Начать выборку.
50
10. Отсоедините источник тока от земли.
51
3. Разрешение измерения может быть увеличено с помощью внешнего
эталонного АЦП, который составляет приблизительно ¾ AVDD .
Работа модуля CTMU зависит от бита АЦП под названием CTMREQ. При
отключённом бите CTMREQ устройство переходит в спящий режим, источник
тока модуля CTMU всегда отключён. Если CTMU выполняет операцию, которая
зависит от источника тока при вызове спящего режима, операция может
завершиться неправильно. Измерения емкости и времени могут возвращать
ошибочные значения.
52
модуля отключается, когда устройство переходит в режим ожидания. Если
модуль выполняет операцию при вызове режима ожидания, то в этом случае
результаты будут аналогичны результатам работы в спящем режиме.
53
Рис. 2.6. Структурная схема для измерения ёмкости
54
Для детектирования изменения ёмкости нужно:
4. Включить CTMU.
6. Начать выборку.
55
Рис. 2.7. Структурная схема для сенсорного измерения ёмкости
56
1. Настройте порты GPIO.
57
микроконтроллера и поддерживающих схем. Минимальная защита от ЭСД - это
последовательный резистор, обычно 1-10 кОм (см. рис. 2.9.). Рекомендуется
дополнительная защита TVS диодов питания и заземления. Ёмкость диодов TVS
добавляет к емкости системы для защищаемого аналогового канала, поэтому
рекомендуется использовать диоды TVS с низкой емкостью. Мощность
устройства и следы заземления должны быть рассчитаны на дополнительный ток
от события ESD.
58
диапазоне действительного источника тока. Для наименьшего измерения времени
используйте наименьший диапазон токов и установите регистр выбора канала
АЦП (ADxCHS) на неиспользуемый канал АЦП, соответствующий вывод
которого не подключён ни к одной трассировке печатной платы. Это
минимизирует добавленную паразитную ёмкость, сохраняя общую ёмкость цепи
близкой к ёмкости самого аналого-цифрового преобразователя. Если измеренная
задержка слишком велика для измерения с помощью этого метода, внешний
конденсатор может быть подключен к каналу АЦП, и этот канал выбирается во
время измерения. Если для измерения используется внешний конденсатор, то он
должен быть подключён на этапе калибровки ёмкости.
5. Включите CTMU.
59
Код конфигурации находится в Приложении 6
60
компаратора 2 может быть включено для информирования программного
обеспечения о том, что был сгенерирован импульс. Для правильной работы
событие EDG1 должно быть неактивным до того, как произойдёт событие EDG2.
См. рис. 2.12. и рис. 2.13.
C SYSTEM
T V (2.10)
I
3. Настройте компаратор.
5. Включите CTMU.
61
Рис. 2.12. Структурная схема для генерации задержки
62
2.8. Измерение температуры с помощью CTMU
На рис. 2.14. показано, как этот модуль может быть использован для
измерения температуры. При повышении температуры напряжение на диоде
будет падать примерно на 1,8 мВ/1°С (для диапазона 5,5 мкА) в рабочем
диапазоне устройства (см. рис. 2.15. и уравнение 2.11.). Использование диапазона
токов 55 мкА увеличивает смещение напряжения, обеспечивая улучшение
отношения сигнал / шум. Выходное напряжение диода почти линейно по всему
заданному прибором рабочему диапазону для обоих диапазонов.
63
Рис. 2.15. Зависимость напряжения (по оси ординат, мВ) от температуры (по
оси абсцисс, °C) при различных значениях диапазона токов
2. Настройте АЦП.
3. Начните выборку
5. Преобразуйте образец.
64
710 mV Vизмер.
Tввнут . , при I ист. 5.5 мкА
1 .8
(2.11.)
710 mV Vизмер.
Tввнут . , при I ист. 55 мкА
1.55
T1 T2
Крутизна
V (t1 ) V (t2 )
V
Температура Смещение,
Крутизна
65
ГЛАВА 3 ПРИМЕРЫ УСТРОЙСТВ НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
PIC24FV16KA301
66
В данном случае, ёмкость считается по формуле (2.9.), так как она
складывается от соединений, где СAD - внутренний канал CTMU, CSTRAY -
внешний канал, а опорное напряжение зависит от количества значений АЦП
следующим образом:
VDD
V , (3.1)
Кол во значений АЦП
Так как требуется измерить время заряда конденсатора, то для начала нужно
выразить время из формулы, описывающей изменение тока через емкость (2.1).
Так как I и C не изменяются, то можно выразить время заряда конденсатора в
виде ОДУ с разделёнными переменными 1-го порядка (2.7):
C
dt ( ) dV (3.2.)
I
C
t ( )V K (3.3.)
I
Принимая то, что К=0, так как конденсатор, обычно, разряжен на старте,
можно сделать вывод о том, что время пропорционально напряжению
67
Увеличить разрядность АЦП, увеличив число значений
(t2 t1 ) C
( ) (3.4.)
(V2 V1 ) I
C
t2 ( V2 ) (3.5.)
I
68
На рисунке наглядно показана искомая крутизна на графике зависимости
напряжения от времени, где имеются два вышеперечисленных измерения
69
Рис. 3.4. Измерение длительных интервалов п
70
Рис. 3.5. Схема измерения уровня жидкости.
Таблица 6
Параметры схемы Значение
Vpulse 5 [В]
Ro 50 [Ом]
Zo 50 [Ом]
Rt 0 [Ом]
To 9.5 [нс]
71
Форма сигнала в Точке А (Node A) на рис. 3.6. отображена голубой линией.
Импульс в точке А имеет амплитуду в 2 раза меньше, чем зондирующий сигнал
генератора (отображен желтым цветом). Фронт сигнала вызван отражением
сигнала от закороченной микрополосковой линии.
Time 0 (0 ns)
В момент времени Time=0 генератор импульса формирует сигнал (спад)
амплитудой Vpulse (5В). Выходное сопротивление генератора (Ro) вместе с
линией передачи образует делитель импедансов.
z0
Vnode A V pulse (3.6)
R0 z0
Rt
Vnode A V pulse (3.7)
R0 Rt
72
T
L (3.8)
7.3 10 12 2
Где L это длина линии в миллиметрах, T это время в секундах. Тогда длина линии
передачи составляет ~1301 мм.
Vnode A
Rt (3.9)
V pulse Vnode A
1 0 r d
z0 ln( 0 ) (3.10)
2 0 r di
73
Где: µo - магнитная постоянная, µr - относительная магнитная проницаемость
изоляционного материала, εo - абсолютная диэлектрическая проницаемость, εr -
относительная диэлектрическая проницаемость изолятора, do - диаметр внешнего
проводника, di - диаметр внутреннего проводника
49.766
z0 (3.11)
r
74
Рис. 3.8. Изменение импеданса линии при заполнении жидкостью.
75
Измеряя амплитуду отраженного сигнала можно получить информацию о типе
жидкости. Для автомобильных приложений можно определить, что в бак залито
дизельное топливо вместо бензина и предотвратить запуск двигателя. Так же
можно определить содержание этанола в бензине.
Управления и индикации
Формирования зондирующего импульса
Измерения времени прихода отраженного сигнала
76
Рис. 3.10. Схема уровнемера, построенного по методу измерения времени
отражённого сигнала (измерительной части).
77
T Усиление V Смещение (3.12.)
78
3.2. Устройство для оценки состояния кожи человека
79
конденсатор не может мгновенно зарядиться, мы будем наблюдать переходной
процесс, описываемый следующим дифференциальным уравнением:
t
U C1 (t ) I R2 Rкл I 0 R2 (1 e ) (3.14.)
I 0 I R2 I C1 I Rкл (3.15.)
Из уравнения 3.14. видно, что в начале будет резкое увеличение напряжения из-за
резистора RКЛ.
Постоянная времени цепи характеризует длительность протекания
переходного процесса. Рассмотрим график зарядки конденсатора в обычной RC
цепи (рис.3.2).
80
1
U (1 )
C1 e (3.17.)
R2
81
Далее рассмотрим конфигурацию данного устройства. Осциллятор
работает на частоте 32 МГц. Модуль CTMU настроен на амплитуду источника
тока 55 мкА:
CTMUICONbits.IRNG = 3
AD1CON1bits.MODE12 = 1.
AD1CON2bits.PVCFG = 3.
82
4) Если напряжение на резисторе R4 вышло за установленные пределы,
то проводится повторная подача импульсов тока с другой амплитудой. Если же
напряжение не вышло за пределы, то производится повторная подача
импульсов тока для установления времени, при котором C2 зарядится на 63.2%
от полного заряда конденсатора
83
ЗАКЛЮЧЕНИЕ
84
СПИСОК ЛИТЕРАТУРЫ
2. Charge Time Measurement Unit (CTMU) and CTMU Operation with Threshold
Detect - США, Microchip Technology Inc. 2011-2016, DS30009743B
5. Microchip. AN1375 - See What You Can Do with the CTMU. URL:
http://ww1.microchip.com/downloads/en/AppNotes/CTMU%2001375a.pdf
(Retrieved 2013-05-20).
85
ПРИЛОЖЕНИЯ
#include "p24FJ1024GB610.h"
#define CTMU_MODE_EDGE 0
#define RANGE_0_550uA 1 // .550uA
#define RCAL 4.22e6 // R value is 4.22M
#define ADSCALE 1023 //for 10-bit ADC
#define ADREF 3.3 //Vdd connected to ADC Vref+
unsigned int CtmuCurrentCalConfig(unsigned int mode, unsigned int range, signed
int trim)
{
unsigned int result, x;
// Step 1 Configure the CTMU
CTMUCON1L = 0x0000; // Disable CTMU
CTMUCON1Lbits.TGEN = mode; // Enable/Disable Time Generation mode
CTMUCON1Lbits.EDGEN = 0; // Edges are disabled
CTMUCON1Lbits.IDISSEN = 0; // Current source is not grounded
CTMUCON1Lbits.ITRIM = trim; // Set trim
CTMUCON1Lbits.CTTRIG = 0; // Trigger output disabled
CTMUCON1Lbits.IRNG = (range & 3); // Set range
CTMUCON1H = 0; // Edges are disabled, edge controls ignored
// Next line does not apply to all devices
CTMUCON1Hbits.IRNGH = (range>>2); // set high bit of range
CTMUCON2Lbits.IRSTEN = 0; // Current source reset disabled
CTMUCON2Lbits.DSCHS = 0; // Discharge source disabled
// Step 2 Configure the GPIO Port
TRISB = TRISB | (1<<2); // Set channel 2
ANSBbits.ANSB2 = 1; // Make AN2 as analog (Resistor is connected to this pin)
86
// Step 3 configure the ADC
AD1CHSbits.CH0SA = 2; // Select the analog channel 2
AD1CON1 = 0x8000; // Turn On A/D Converter,
// Unsigned fractional format, Clear SAMP bit to
// start conversion, Sample when SAMP bit is set
AD1CON2 = 0x0000; // VR+ = AVDD, V- = AVSS, Don't scan,
AD1CON3 = 0x0000; // ADC uses system clock
AD1CON3bits.ADCS = 0; // conversion clock = 1xTcy
AD1CON5 = 0x0000; // Auto-Scan disabled
// Step 4 - 6 Enable the current source and start sampling
CTMUCON1Lbits.CTMUEN = 1; // Enable the CTMU
CTMUCON1Hbits.EDG1STAT = 1; // Enable current source
AD1CON1bits.SAMP = 1; // Manual sampling start
// step 7 ~3000 us delay to charge sample cap
for (x = 0; x < 2000; x++); // ~6 cycles * 2000 ,Fcy = 4Mhz
// step 8 Convert the sample
AD1CON1bits.SAMP = 0; // Begin A/D conversion
while(AD1CON1bits.DONE == 0); // Wait for A/D convert complete
// Step 9 Disable the CTMU
CTMUCON1Hbits.EDG1STAT = 0; // Disable current source
IFS0bits.AD1IF = 0; // Clear ADC interrupt flag
CTMUCON1Lbits.CTMUEN = 0; // Disable the CTMU
result = ADC1BUF0;
return (result); // return accumulated result
#define ITT 10 // 10 iterations
int main(void)
{
float cntsAvg, vCal, cntsTot = 0, ctmuISrc = 0, result = 0;
// Step 10 perform calibration 10 times
for(x = 0; x < ITT; x++)
87
{
result = (float)(CtmuCurrentCalConfig(CTMU_MODE_EDGE, RANGE_0_550uA,
0));// 0.550uA , no trim
cntsTot += (float)result;
}
// Step 11 calculate the result
cntsAvg = (cntsTot / ITT); // Average of 10 readings
vCal = (cntsAvg / ADSCALE * ADREF);
ctmuISrc = vCal / RCAL; // CTMU current in uA
// step 12
// user code to perform iteration for calibration
while(1);
}
88
Приложение 2. Код конфигурации модулей микроконтроллера для работы
со значениями тока из высокого диапазона значений
#include "p24FJ1024GB610.h"
#define _MODE_TGEN 1
#define RANGE_550uA 0 // 550uA
#define RCAL 4.22e6 // R value is 4200000 (4.22M)
#define ADSCALE 1023 //for 10-bit ADC
#define ADREF 3.3 //Vdd connected to ADC Vr+
unsigned int CtmuCurrentCalConfig(unsigned int mode, unsigned int range, signed
int trim)
{
unsigned int result, x;
// Step 1 Configure the CTMU
CTMUCON1L = 0x0000; // Disable CTMU
CTMUCON1Lbits.TGEN = mode; // Enable/Disable Time Generation mode
CTMUCON1Lbits.EDGEN = 0; // Edges are disabled
CTMUCON1Lbits.IDISSEN = 0; // Current source is not grounded
CTMUCON1Lbits.ITRIM = trim; // Set trim
CTMUCON1Lbits.CTTRIG = 0; // Trigger output disabled
CTMUCON1Lbits.IRNG = (range & 3); // Set range
CTMUCON1H = 0; // Edges are disabled, edge controls ignored
// Next line does not apply to all devices
CTMUCON1Hbits.IRNGH = (range>>2); // set high bit of range
CTMUCON2Lbits.IRSTEN = 0; // Current source reset disabled
CTMUCON2Lbits.DSCHS = 0; // Discharge source disabled
// Step 2 Configure the GPIO Port
TRISB = TRISB | (1<<2); // Set channel 2
ANSBbits.ANSB14 = 1; // Make AN2 as analog (Resistor is connected to this pin)
// Step 3 configure the ADC
AD1CHSbits.CH0SA = 2; // Select the analog channel(2)
89
AD1CON1 = 0x8000; // Turn On A/D Converter,
// Unsigned fractional format, Clear SAMP bit to
// start conversion, Sample when SAMP bit is set
AD1CON2 = 0x0000; // VR+ = AVDD, V- = AVSS, Don't scan,
AD1CON3 = 0x0000; // ADC uses system clock
AD1CON3bits.ADCS = 0; // conversion clock = 1xTcy
AD1CON5 = 0x0000; // Auto-Scan disabled
// Step 4 - 6 Enable the current source and start sampling
CTMUCON1Lbits.CTMUEN = 1; // Enable the CTMU
CTMUCON1Hbits.EDG1STAT = 1; // Enable current source
AD1CON1bits.SAMP = 1; // Manual sampling start
/// step 7 ~3000 us delay to charge sample cap
for (x = 0; x < 2000; x++); // ~6 cycles * 2000 ,Fcy = 4Mhz
// step 8 Convert the sample
AD1CON1bits.SAMP = 0; // Begin A/D conversion
while(AD1CON1bits.DONE == 0); // Wait for A/D convert complete
// Step 9 Disable the CTMU
CTMUCON1Hbits.EDG1STAT = 0; // Disable current source
IFS0bits.AD1IF = 0; // Clear ADC interrupt flag
CTMUCON1Lbits.CTMUEN = 0; // Disable the CTMU
result = ADC1BUF0;
return (result); // return accumulated result
}
#define ITT 10 // 10 iterations
int main(void)
{
float cntsAvg, vCal, cntsTot = 0, ctmuISrc = 0, result;
// Step 10 perform calibration 10 times
for(x = 0; x < ITT; x++)
{
90
result = (float)(CtmuCurrentCalConfig(_MODE_TGEN, RANGE_550uA, 0)); //
550uA, no trim
cntsTot += result;
}
// Step 11 calculate the result
cntsAvg = (cntsTot / ITT); // Average of 10 readings
vCal = (cntsAvg / ADSCALE * ADREF);
ctmuISrc = vCal / RCAL; // CTMU current in uA
// step 12
// user code to perform iteration for calibration
while(1);
}
91
Приложение 3. Код конфигурации модулей микроконтроллера для
калибровки и измерения абсолютной емкости
#include "p24FJ1024GB610.h"
#define CTMU_MODE_EDGE 0
#define RANGE_0_550uA 1 // .550uA
#define ADSCALE 1023 //for 10-bit ADC
#define ADREF 3.3 //Vdd connected to ADC Vr+
#define DELAY_LOOPS 150 // delay = 6 cycles * DELAY_LOOPS * (1/4 MHz)
Fosc = 8MHz
unsigned int CtmuCapMeasureConfig(unsigned int mode, unsigned int range, signed
int trim)
{
unsigned int result, x;
// Step 1 Configure the CTMU
CTMUCON1L = 0x0000; // Disable CTMU
CTMUCON1Lbits.TGEN = mode; // Enable/Disable Time Generation mode
CTMUCON1Lbits.EDGEN = 0; // Edges are disabled
CTMUCON1Lbits.IDISSEN = 1; // Current source is grounded (discharge enabled)
CTMUCON1Lbits.ITRIM = trim; // Set trim
CTMUCON1Lbits.CTTRIG = 0; // Trigger output disabled
CTMUCON1Lbits.IRNG = (range & 3); // Set range
CTMUCON1H = 0; // Edges are disabled, edge controls ignored
// Next line does not apply to all devices
CTMUCON1Hbits.IRNGH = (range>>2); // set high bit of range
CTMUCON2Lbits.IRSTEN = 0; // Current source reset disabled
CTMUCON2Lbits.DSCHS = 1; // Discharge source enabled
// Step 2 Configure the port Ports
TRISB = TRISB | (1<<2); // Set channel 2
ANSBbits.ANSB14 = 1; // Make AN2 as analog
// Step 3 configure the ADC
92
AD1CHSbits.CH0SA = 2;
AD1CON1 = 0x8000; // Turn On A/D Converter,
// Unsigned fractional format, Clear SAMP bit to
// start conversion, Sample when SAMP bit is set
AD1CON2 = 0x0000; // VR+ = AVDD, V- = AVSS, Don't scan,
AD1CON3 = 0x0000; // ADC uses system clock
AD1CON3bits.ADCS = 0; // conversion clock = 1xTcy
AD1CON5 = 0x0000; // Auto-Scan disabled
// Step 4 - 6 Enable the current source and start sampling
CTMUCON1Lbits.CTMUEN = 1; // Enable the CTMU
CTMUCON1Hbits.EDG1STAT = 1; // Enable current source
AD1CON1bits.SAMP = 1; // Manual sampling start
// step 7 1500us delay to discharge sample cap
for (x = 0; x < 5000; x++); // ~6 cycles * 5000
// step 9 disable discharge
CTMUCON1Lbits.IDISSEN = 0; // Discharge disabled
// step 10 delay to charge sample cap
for (x = 0; x < DELAY_LOOPS; x++); // 6 clocks per loop iteration
// step 11 convert the sample
AD1CON1bits.SAMP = 0; // Begin A/D conversion
while(AD1CON1bits.DONE == 0); // Wait for A/D convert complete
// Step 12 disable the CTMU
CTMUCON1Hbits.EDG1STAT = 0; // Disable current source
IFS0bits.AD1IF = 0; // Clear ADC interrupt flag
CTMUCON1Lbits.CTMUEN = 0; // Disable the CTMU
result = ADC1BUF0;
return (result); // return accumulated result
}
#define ITT 10 // 10 iterations
int main(void)
93
{
float cntsAvg, cntsTot = 0, c;
unsigned int x;
// Step 10 perform measurement 10 times
for(x = 0; x < ITT; x++)
{
cntsTot += (float)(CtmuCapMeasureConfig(CTMU_MODE_EDGE,
RANGE_0_550uA, 0)); // .550uA, no trim
}
// Step 11 calculate the result
cntsAvg = (cntsTot / ITT); // Average of 10 readings
c = (.550e-6 * DELAY_LOOPS * 6 * (1 / 4e6)) / (3.3 * cntsAvg / ADSCALE); //
capacitance in Farads
// step 12
// user code to perform iteration for calibration
while(1);
}
94
Приложение 4. Код конфигурации модулей микроконтроллера для
калибровки и относительного измерения емкости
#include "p24FJ1024GB610.h"
#define CTMU_MODE_EDGE 0
#define RANGE_0_550uA 1 // .550uA
#define CTMU_TOUCH_THRESHHOLD_OFFSET 100
void CtmuCapTouchConfig(unsigned int mode, unsigned int range, signed int trim)
{
// step 1 Configure the CTMU
CTMUCON1L = 0x0000; // Disable CTMU
CTMUCON1Lbits.TGEN = mode; // Enable/Disable Time Generation mode
CTMUCON1Lbits.EDGEN = 0; // Edges are disabled
CTMUCON1Lbits.ITRIM = trim; // Set trim
CTMUCON1Lbits.CTTRIG = 0; // Trigger output disabled
CTMUCON1Lbits.IRNG = (range & 3); // Set range
CTMUCON1H = 0; // Edges are disabled, edge controls ignored
// This line does not apply to all devices
CTMUCON1Hbits.IRNGH = (range>>2); // set high bit of range
CTMUCON2Lbits.IRSTEN = 0; // Current source reset disabled
CTMUCON2Lbits.DSCHS = 0; // Discharge source disabled
// Step 2 Configure the port Ports
TRISB = TRISB | (1<<2); // Set channel 2
ANSBbits.ANSB2 = 1; // Make AN2 as analog
// Step 3 configure the ADC
AD1CHSbits.CH0SA = 2; // Select the analog channel(2)
AD1CON1 = 0x8000; // Turn On A/D Converter,
// Unsigned fractional format, Clear SAMP bit to
// start conversion, Sample when SAMP bit is set
AD1CON2 = 0x0000; // VR+ = AVDD, V- = AVSS, Don't scan,
AD1CON3 = 0x0000; // ADC uses system clock
95
AD1CON3bits.ADCS = 0; // conversion clock = 1xTcy
AD1CON5 = 0x0000; // Auto-Scan disabled
}
unsigned int CtmuReturnSample(void)
{
unsigned int result, x;
// Step 4 - 7 Enable the current source and start sampling
CTMUCON1Lbits.CTMUEN = 1; // Enable the CTMU
CTMUCON1Hbits.EDG1STAT = 1; // Enable current source
CTMUCON1Lbits.IDISSEN = 1; // Enable discharge
AD1CON1bits.SAMP = 1; // Manual sampling start
// step 8 1500us delay to discharge sample cap
for (x = 0; x < 2000; x++); // ~6 cycles * 2000
// step 9 Disable the discharge circuit
CTMUCON1Lbits.IDISSEN = 0; // Disable discharge (start charging)
// step 10 allow the sample cap to partially charge
for (x = 0; x < 250; x++); // ~6 cycles * 250 ~ 670 cnts
// step 11 Convert the analog sample
AD1CON1bits.SAMP = 0; // Begin A/D conversion
while(AD1CON1bits.DONE == 0); // Wait for A/D convert complete
// Step 12 Disable the current source
CTMUCON1Hbits.EDG1STAT = 0; // Disable current source
IFS0bits.AD1IF = 0; // Clear ADC interrupt flag
CTMUCON1Lbits.CTMUEN = 0; // Disable the CTMU
result = ADC1BUF0;
return (result);
}
int main(void)
{
unsigned int untouched, sample;
96
CtmuCapTouchConfig(CTMU_MODE_EDGE, RANGE_0_550uA, 0);
untouched = CtmuReturnSample(); // get reference value
while(1)
{
sample = CtmuReturnSample();
// step 14-15 subtract the threshold and test
if (sample < untouched - CTMU_TOUCH_THRESHHOLD_OFFSET)
{
// button was pressed
}
// user code
}
}
97
Приложение 5. Код конфигурации модулей микроконтроллера для
калибровки и относительного измерения емкости с пороговым
обнаружением АЦП
#define TOUCHED 100 // expected maximum ADC counts on a touch event
void CtmuCapTouchThreshConfig(unsigned int range, signed int trim)
{
// Step 1 Configure the port Ports
TRISB = TRISB | (6); // Configure AN1 and AN2 as inputs
ANSBbits.ANSB2 = 1; // Configure AN! and AN2 as analog
// Step 2 configure the CTMU
CTMUCON1L = 0x0000; // Disable CTMU
CTMUCON1Lbits.TGEN = 0; // Disable Time Generation mode
CTMUCON1Lbits.EDGEN = 0; // Edges are enabled???
CTMUCON1Lbits.ITRIM = trim; // Set trim
CTMUCON1Lbits.CTTRIG = 1; // Trigger output enabled
CTMUCON1Lbits.IRNG = (range & 3); // Set range
// Next line does not apply to all devices
CTMUCON1Hbits.IRNGH = (range>>2); // set high bit of range
CTMUCON2Lbits.IRSTEN = 1; // enable CTMU status reset
CTMUCON2Lbits.DSCHS = 4; // end of ADC conversion resets CTMU status
CTMUCON1Lbits.CTMUEN = 1; // enable the CTMU
CTMUCON1Hbits.EDG1STAT = 1; // enable the current source
// Step 3 configure the ADC
IFS0bits.AD1IF = 0; // make sure ADC Int not set
AD1CON1 = 0; // turn off ADC
AD1CON1bits.SSRC = 5; // Timer1 IF starts autoscan sequence
AD1CON1bits.ASAM = 1; // sampling begins automatically after last conversion
AD1CON2bits.CSCNA = 1; // enable scan mode
AD1CON2bits.SMPI = 0; // interrupt after 1st event
AD1CON3bits.ADCS = 2; // ADC clock is 1/2 sys clock ???
98
AD1CON5bits.ASEN = 1; // enable autoscan
AD1CON3bits.SAMC = 31; // set sample time in TADs
AD1CON5bits.CTMREQ = 1; // request the CTMU
AD1CON5bits.BGREQ = 1;
AD1CON5bits.ASINT = 3; // interrupt after a threshold event compare
AD1CON5bits.WM = 2; // do not write ADC result to buffer
AD1CON5bits.CM = 0; // compare mode: less than threshold value
AD1CTMENL = 4; // Connect CTMU current source to analog channel
AD1CSSL = 6; // enable scan of AN2 & AN1
ADC1BUF1 = TOUCHED; // Threshold value for A12
ADC1BUF2 = TOUCHED; // Threshold value for AN2
AD1CON1bits.ADON = 1; // Turn on the ADC
// Step 4 configure the timer
PR1 = 0xA000; // set rollover rate ~10ms to trigger ADC scan
T1CONbits.TON = 1; // enable timer
}
#define RANGE_5_5uA 2 // 5.5uA
int main(void)
{
CtmuCapTouchThreshConfig(RANGE_5_5uA, 15);
TRISDbits.TRISD1 = 0;
RPOR12 = 13; // map OCMP1 output to pin 76
TRISDbits.TRISD1 = 0; // make pin an output
while(1)
{
if (IFS0bits.T1IF == 1)
{
IFS0bits.T1IF = 0;
}
LATDbits.LATD1 = 0;
99
// step 5-8 wait for an ADC interrupt and service the event
if (IFS0bits.AD1IF) // Wait for ADC threshold match (this can an ISR)
{
LATDbits.LATD1 = 1; // signal threshold event
IFS0bits.AD1IF = 0; // clear int
// Touch event handler
if (AD1CHITL & 4) // test to determine which ANx had a touch event
{
AD1CHITL &= ~4; // clear the event
// user code to handle touch event
}
}
}
}
100
Приложение 6. Код конфигурации модулей микроконтроллера для
измерения времени
#define RANGE_0_550uA 1 // .550uA
void CtmuTimeConfig(unsigned int range, signed int trim)
{
// Step 1 Configure the CTMU
CTMUCON1L = 0x0000; // Disable CTMU
CTMUCON1Lbits.TGEN = 0; // Disable Time Generation mode
CTMUCON1Lbits.EDGEN = 1; // Edges are enabled
CTMUCON1Lbits.ITRIM = trim; // Set trim
CTMUCON1Lbits.CTTRIG = 1; // Trigger output enabled
CTMUCON1Lbits.IRNG = (range & 3); // Set range
// This line does not apply to all devices
CTMUCON1Hbits.IRNGH = (range>>2); // set high bit of range
CTMUCON1Hbits.EDG1MOD = 1; // Edge mode
CTMUCON1Hbits.EDG1POL = 1; // rising edge
CTMUCON1Hbits.EDG1SEL = 4; // CTED3 pin 8
CTMUCON1Hbits.EDG2POL = 1; // polarity
CTMUCON1Hbits.EDG2MOD = 0; // level sensitive
CTMUCON1Hbits.EDG2SEL = 3; // CTED1 pin 42
CTMUCON2Lbits.IRSTEN = 1; // enable reset by external trigger
CTMUCON2Lbits.DSCHS = 4; // ADC end of conversion
// Step 2 Configure the port Ports
TRISBbits.TRISB12 = 1; // Configure RB12 as a input CTED2
ANSBbits.ANSB12 = 0; // disable analog on RB12
TRISBbits.TRISB13 = 1; // Configure RB13 as a input CTED1
ANSBbits.ANSB13 = 0; // disable analog on RB13
TRISBbits.TRISB2 = 1; // Configure RB2 as a input
ANSBbits.ANSB2 = 1; // Configure AN2 as analog
// Step 3 configure the ADC
101
AD1CON1 = 0x0000; // Turn off ADC
AD1CON1bits.SSRC = 4; // CTMU is the conversion trigger source
AD1CON2 = 0x0000; // VR+ = AVDD, V- = AVSS, Don't scan,
AD1CON3 = 0x0000; // ADC uses system clock
AD1CON3bits.ADCS = 8; // conversion clock = 1xTcy
AD1CON5 = 0x0000; // Auto-Scan disabled
AD1CON1bits.ADON = 1;
AD1CON1bits.ASAM = 1; // Auto-sample
AD1CHSbits.CH0SA = 2; // Select AN2
// Step 4 - 6 Enable the current source and stop manual discharge
CTMUCON1H &= ~0x0300; // clear the edge status bits
CTMUCON1Lbits.CTMUEN = 1; // Enable the CTMU
CTMUCON1Lbits.IDISSEN = 1; // Enable Discharge
asm("NOP"); // may be required for external caps
asm("NOP");
asm("NOP");
asm("NOP");
CTMUCON1Lbits.IDISSEN = 0; // stop discharge
}
int main(void)
{
unsigned int result;
CtmuTimeConfig(RANGE_0_550uA, 5); // .550uA
while(1)
{
// Step 7: Wait for ADC interrupt
while(IFS0bits.AD1IF == 0);
{
// Steps 8-11
IFS0bits.AD1IF = 0; // clear the interrupt
102
result = ADC1BUF0; // read ADC result
CTMUCON1Lbits.IDISSEN = 1; // begin manual discharge of cap
asm("NOP"); // may be required for external caps
asm("NOP");
asm("NOP");
asm("NOP");
CTMUCON1Lbits.IDISSEN = 0; // stop discharge of cap
CTMUCON1H &= ~0x0300; // clear the edge status bits
}
// user code
}
}
103
Приложение 7. Код конфигурации модулей микроконтроллера для
генерации задержек
#include "p24FJ1024GB610.h"
#define RANGE_55uA 3 // 55uA
void CtmuDelayConfig(unsigned int range, signed int trim)
{
// Step 1 Configure the CTMU
CTMUCON1L = 0x0000; // Disable CTMU
CTMUCON1Lbits.TGEN = 1; // Enable/Disable Time Generation mode
CTMUCON1Lbits.IDISSEN = 1; // Current source is grounded
CTMUCON1Lbits.ITRIM = trim; // Set trim
CTMUCON1Lbits.CTTRIG = 0; // Trigger output disabled
CTMUCON1Lbits.IRNG = (range & 3); // Set range
CTMUCON1Lbits.EDGEN = 1; // Edges are enabled
CTMUCON2Lbits.IRSTEN = 0; // Current source reset disabled
CTMUCON2Lbits.DSCHS = 0; // Discharge source disabled
// This line does not apply to all devices
CTMUCON1Hbits.IRNGH = (range>>2); // set high bit of range
CTMUCON1Hbits.EDG1POL = 1; // negative polarity
CTMUCON1Hbits.EDG1MOD = 1; // edge sensitve
CTMUCON1Hbits.EDG1SEL = 4; // CTED3 pin 8
CTMUCON1Hbits.EDG2POL = 1; // negative polarity
CTMUCON1Hbits.EDG2MOD = 0; // level sensitive
CTMUCON1Hbits.EDG2SEL = 14; // CMP2 out
// Step 2 Configure Comparator Voltage Reference
CVRCONbits.CVREFP = 0; // use DAC as module output
CVRCONbits.CVROE = 1; // DAC voltage is output on a pin
CVRCONbits.CVRSS = 0; // DAC references are AVDD/AVSS
CVRCONbits.CVR = 14; // midscale output
CVRCONbits.CVREN = 1; // enable module
104
// Step 3 Configure Comparator
CM2CONbits.COE = 1; // comparator output is present on C2OUT pin
CM2CONbits.CPOL = 1; // output is inverted
CM2CONbits.CREF = 1; // non-inverting input is CVREF output
CM2CONbits.CCH = 0; // inverting input is C2INB pin
CM2CONbits.CEN = 1; // enable the comparator
// Step 2 Configure the port Ports
TRISBbits.TRISB2 = 1; // Configure RB2 as a input
ANSBbits.ANSB2 = 1; // Configure AN2 as analog
// (Capacitor to AVSS is connected to this pin)
TRISGbits.TRISG15 = 1; // Configure RG15 (CTED3 as an input)
CTMUCON1Lbits.CTMUEN = 1; // Enable the CTMU
}
int main(void)
{
CtmuDelayConfig(RANGE_55uA, 6);
// external event triggers EDG1
// user code
while(1);
}
105
Приложение 8. Код конфигурации модулей микроконтроллера для
измерения температуры
#define RANGE_5_5uA 2 // 5.5uA
unsigned int CtmuReadTemperatureCounts(unsigned int range, signed int trim)
{
unsigned int x, result;
// Step 1 Configure the CTMU
CTMUCON1L = 0x0000; // Disable CTMU
CTMUCON1Lbits.ITRIM = trim; // Set trim
CTMUCON1Lbits.IRNG = (range & 3); // Set range
CTMUCON1Lbits.CTMUEN = 1; // Enable the CTMU
CTMUCON1Hbits.EDG1STAT = 1; // Enable current source
CTMUCON1Hbits.EDG2STAT = 1;
// Step 2 Configure the ADC
AD1CHSbits.CH0SA = 0x18; // Select temp sensor
AD1CON1 = 0x8000; // Turn On A/D Converter,
// Unsigned fractional format, Clear SAMP bit to
// start conversion, Sample when SAMP bit is set
AD1CON2 = 0x0000; // VR+ = AVDD, V- = AVSS, Don't scan,
AD1CON3 = 0x0000; // ADC uses system clock
AD1CON3bits.ADCS = 0; // conversion clock = 1xTcy
AD1CON5 = 0x0000; // Auto-Scan disabled
AD1CTMENHbits.CTMEN24 = 1; // CTMU connected to channel during conversion
// Step 3 start sampling
AD1CON1bits.SAMP = 1; // Manual sampling start
// Step 4 delay
for (x = 0; x < 2000; x++); // Delay ~xxx us to charge sample cap
// step 5 convert sample
AD1CON1bits.SAMP = 0; // Begin A/D conversion
while(AD1CON1bits.DONE == 0); // Wait for A/D convert complete
106
result = ADC1BUF0;
return (result);
}
int main(void)
{
unsigned int result;
result = CtmuReadTemperatureCounts( RANGE_5_5uA, 6);
while(1);
}
107
Приложение 9. Код конфигурации модулей микроконтроллера для оценки
импеданса
#define _MODE_TGEN 0
#define RANGE_55uA 3 // 55uA
#define RCAL 30200 // R = 30.2 кОм
#define ADSCALE 4096 //для 12-битного АЦП
#define ADREF 4.096 //Vdd подключен к ADC Vr+
#include "xc.h"
#include <stdio.h>
#include <stdlib.h>
unsigned int CtmuCurrentCalConfig(unsigned int mode, unsigned int range,
signed int trim, signed int TRISA2,int j, int ResultRC[])
{
unsigned int result, x;
j=0;
// Шаг 1. Настройка CTMU
CTMUCON1 = 0x0000; // CTMU отключен
CTMUCON1bits.TGEN = mode; // включение/выключение режима Time
Generation
CTMUCON1bits.EDGEN = 0; // Edges выключены
CTMUCON1bits.IDISSEN = 0; // источник тока не заземлен
CTMUICONbits.ITRIM = trim; // калибровка источника тока
CTMUCON1bits.CTTRIG = 0; // выход триггера отключен
CTMUICONbits.IRNG = range; // выбор диапазона источника тока
CTMUCON2 = 0; // Edges выключены, edge controls не используются
// Шаг 2. Настройка портов
TRISB = TRISB | (1<<2); //
ANSAbits.ANSA3 = 1; // AN14 аналоговый
ANSAbits.ANSA2 = 1; // AN13 аналоговый
TRISAbits.TRISA2 = TRISA2; // настройка TRISA2
108
LATAbits.LATA2 = 0;
// Шаг 3. Настройка АЦП
AD1CHSbits.CH0NA = 0; // AVss
AD1CHSbits.CH0SA = 14; // AN14
AD1CON1bits.ADON = 1; // включение АЦП
AD1CON1bits.MODE12 = 1; // 12 бит вкл
AD1CON2 = 0x0000; // VR+ = AVDD, V- = AVSS
AD1CON2bits.PVCFG = 3; // опорное напряжение 4 * 1.024 В
AD1CON3 = 0x0000; //
AD1CON3bits.ADCS = 9; // время преобразования 10 * Tcy
AD1CON5 = 0x0000; // Auto-Scan отключен
// Шаг 4 - 6. Включение источника тока и выборки
CTMUCON1bits.CTMUEN = 1; // включение CTMU
for (j = 0; j < 15; j++)
{
AD1CON1bits.DONE = 0;
AD1CON1bits.SAMP = 1; // ручной запуск выборки
109