Вы находитесь на странице: 1из 109

МИНОБРНАУКИ РОССИИ

федеральное государственное бюджетное образовательное


учреждение высшего образования
«Национальный исследовательский университет «МЭИ»

Институт ИРЭ
Кафедра ФОРС

ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА


(бакалаврская работа)

Направление 11.03.01 Радиотехника


(код и наименование)

Направленность (профиль) Радиотехнические средства передачи,


приема и обработки сигналов
Форма обучения очная
(очная/очно-заочная/заочная)

Тема: Построение устройств на основе микроконтроллера


PIC24FV16KA301 для оценки физических параметров

Студент ЭР-11-16 Младенович И.И.


группа подпись фамилия и инициалы

Научный
руководитель ст. преп. Щукин А.В.
уч. степень должность подпись фамилия и инициалы

Консультант
уч. степень должность подпись фамилия и инициалы

Консультант
уч. степень должность подпись фамилия и инициалы

«Работа допущена к защите»

Зав. кафедрой к.т.н. доцент Сафин А.Р.


уч. степень звание подпись фамилия и инициалы

Дата

Москва, 2019
МИНОБРНАУКИ РОССИИ
федеральное государственное бюджетное образовательное
учреждение высшего образования
«Национальный исследовательский университет «МЭИ»

Институт ИРЭ
Кафедра ФОРС

ЗАДАНИЕ
НА ВЫПУСКНУЮ КВАЛИФИКАЦИОННУЮ РАБОТУ
(бакалаврскую работу)

Направление 11.03.01 Радиотехника


(код и наименование)

Направленность (профиль) Радиотехнические средства передачи,


приема и обработки сигналов
Форма обучения очная
(очная/очно-заочная/заочная)

Тема: Построение устройств на основе микроконтроллера


PIC24FV16KA301 для оценки физических параметров

Студент ЭР-11-16 Младенович И.И.


группа подпись фамилия и инициалы

Научный
руководитель ст. преп. Щукин А.В.
уч. степень должность подпись фамилия и инициалы

Консультант
уч. степень должность подпись фамилия и инициалы

Консультант
уч. степень должность подпись фамилия и инициалы

Зав. кафедрой к.т.н. доцент Сафин А.Р.


уч. степень звание подпись фамилия и инициалы

Место выполнения работы


СОДЕРЖАНИЕ РАЗДЕЛОВ ЗАДАНИЯ И ИСХОДНЫЕ ДАННЫЕ

1. Обзор литературы по работе со средой прикладного программирования


MPLAB X IDE, микроконтроллером PIC24FV16KA301 и его
периферийными устройствами
2. Обзор литературы по работе с блоком измерения времени заряда
CTMU, изучение возможностей модуля и реализуемых им физических
параметров, изучение кода от производителя для конфигурирования
данного модуля при измерении различных физических параметров.
3. Описание возможной реализации устройств на микроконтроллере
PIC24FV16KA301 для измерения и оценки физических параметров на
примере существующих устройств

ПЕРЕЧЕНЬ ГРАФИЧЕСКОГО МАТЕРИАЛА

Количество листов
Количество слайдов в презентации

РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА
АННОТАЦИЯ

В работе рассматриваются принципы построения устройств, на основе


микроконтроллера PIC24FV16KA301, с использованием модуля CTMU, при
измерении и оценке различных физических параметров: импеданса, времени,
ёмкости, температуры. Подробно рассказано об иных модулях микроконтроллера
PIC24FV16KA301, связанных с модулем CTMU, таких как: таймеры и аналого-
цифровой преобразователь (АЦП). Написаны программы для конфигурации
модуля CTMU при измерении различных физических параметров. Описаны
варианты реализации отдельных физических параметров на примере
существующих устройств.
СОДЕРЖАНИЕ

АННОТАЦИЯ................................................................................................................... 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 компании
Microchip, в силу своих достоинств в деле создания измерителей физических
величин.

Его достоинством является обширный набор периферийных устройств, а


особенно модуля CTMU. С момента своего внедрения в микроконтроллеры PIC
блок измерения времени заряда (CTMU) стал популярным для создания простых,
низкобюджетных измерителей различных физических величин. Некоторые
приложения использовали его способность различать разницу во времени между
входными сигналами вплоть до субнаносекундного диапазона. При этом, на
основе данного микроконтроллера с данным модулем можно создать огромное
количество устройств, начиная от относительно простого измерителя уровня
жидкости, заканчивая более сложными устройствами, например, лидарами.

Целью работы является изучение программ от производителя для


конфигурации модуля CTMU под различные задачи по измерению физических
параметров, изучение опыта создания устройств на данном микроконтроллере для
оценки достоинств и перспектив в дальнейшем его использовании в решении
задач по оценке и измерении физических параметров.
ГЛАВА 1. РАССМАТРИВАЕМЫЕ ОСОБЕННОСТИ
МИКРОКОНТРОЛЛЕРА PIC24FV16KA301

В данной работе исследуются принципы построения устройств на


микроконтроллере PIC24FV16KA301 компании Microchip, для написания
программ конфигурации использовалась среда MPLAB X IDE. Для понимания
принципов построения нужно рассмотреть каждый элемент данного
микроконтроллера.

1.1. Среда разработки MPLAB X IDE и компилятор MPLAB XC16

MPLAB X IDE – это интегрированная среда разработки, представляющая


собой набор программных продуктов, созданных для упрощения процесса
создания, изменения и отладки программ для микроконтроллеров семейства PIC,
производимых компанией Microchip Technology. Среда разработки состоит из
отдельных приложений, связанных друг с другом, и включает в себя компилятор
с языка «ассемблер» и «Си», текстовый редактор, программный симулятор и
средства работы над проектами.

Компоненты MPLAB X IDE:

• Полнофункциональный текстовый редактор для программиста, который


также служит окном отладчика.
• Менеджер проекта, который обеспечивает интеграцию и связь между IDE
и языковыми инструментами.
• Несколько наборов ассемблера для разработки прошивки для устройства
проекта.
• Механизм отладчика, который обеспечивает точки остановки, пошаговое
выполнение, окна просмотра и все функции современного отладчика. Отладчик
работает в сочетании с программными и аппаратными средствами отладки
• Программный симулятор для всех устройств PIC MCU и dsPIC DSC.
Симулятор фактически состоит из нескольких симуляторов. MPLAB X IDE
решает, какой из них использовать на основе устройства вашего проекта.
Доступно несколько плагинов для добавления возможностей MPLAB X IDE.
Например, интерфейс контроля и управления данными (DMCI) предоставляет
механизм для просмотра и управления переменными в коде и изменения их
значений в режиме реального времени. Это также позволяет просматривать
выходные данные в графическом формате.

MPLAB XC16 – это полнофункциональный оптимизирующий компилятор,


который переводит стандартные ANSI C программы на язык ассемблер для 16-
битного устройства. Компилятор также поддерживает множество параметров
командной строки и языковых расширений, которые обеспечивают полный
доступ к аппаратным возможностям 16-разрядного устройства, и обеспечивают
контроль генератора кода компилятора.

Компилятор может работать в одном из трех режимов работы: Free, Standard


или PRO. Standard и PRO режимы являются лицензионными и требуют ключ
активации. Бесплатный режим доступен для нелицензированных клиентов.
Основные операции компилятора, поддерживаемые устройства и доступная
память идентичны во всех режимах. Режимы отличаются только уровнем
оптимизации, применяемым компилятором.

Компилятор использует набор сложных этапов оптимизации, которые


используют много продвинутых методов для генерации эффективного и
компактного кода. Этапы оптимизации включают в себя высокоуровневые
оптимизации, применимые к любому коду на языке «Си», а также специфичные
для 16-разрядных устройств оптимизации, которые используют преимущества
определенных особенностей архитектуры устройства.
1.2. Микроконтроллер PIC24FV16KA301

PIC24FV16KA301 - 16-разрядный микроконтроллер с низким


энергопотреблением. Предназначен для приложений с ограниченным питанием
и питанием от батарей. Имеет уникальные периферийные устройства, такие как
DSBOR, DSWDT и RTCC, которые работают в режиме глубокого сна.

Характеристики PIC24FV16KA301:

Режимы управления питанием

• Run - процессор, Flash-память, SRAM и периферийные


устройства включены.
• Doze - тактовая частота процессора меньше, чем у периферийных
устройств.
• Idle (в режиме ожидания) - процессор выключен, Flash-память, SRAM
и периферийные устройства включены.
• Sleep (спящий режим) - процессор, Flash-память и периферия
выключены, а SRAM включен.
• Deep Sleep (глубокий сон) - процессор, Flash-память,
SRAMи большинство периферийных устройств выключены.
• Низкое энергопотребление:

 Ток в рабочем режиме до 8 мкА.

 Токи в режиме ожидания до 2.2 мкА.

 Токи режима глубокого сна до 20 нА.


Процессор:

• Модифицированная Гарвардская архитектура.

• До 16 MIPS операций при 32 МГц.

• Внутренний осциллятор с частотой 8 МГц и опцией 4x PLL и


несколькими вариантами деления.

10
• 17-битный одноцикловый аппаратный множитель.

• 32-разрядный на 16-разрядный аппаратный делитель, 16-разрядный x


16- разрядный массив рабочих регистров.
• Оптимизированная для компилятора «Си» архитектура набора команд.
Периферийные устройства:

• Аппаратные часы реального времени и календарь (RTCC):


• Программируемая 32-битная циклическая проверка избыточности
(CRC).

• Несколько модулей последовательной связи:

 Два 3/4-проводных модуля SPI.

 Два модуля I2C с поддержкой нескольких


ведущих/подчиненных.

 Два модуля UART, поддерживающие RS-485, RS-232,


LIN/J2602, IrDA.

• Пять 16-битных таймеров/счетчиков с программируемым


делителем частоты:
 Могут быть в паре как 32-битные таймеры/счетчики.

• Три 16-битных входа захвата с выделенными таймерами.

• Три 16-разрядных выхода сравнения/ШИМ с выделенными таймерами.

• Конфигурируемые выходы с открытым стоком на выводах цифрового


ввода-вывода.
• До трех внешних источников прерываний.
Аналоговые функции:

• 12-разрядный, 16-канальный аналого-цифровой преобразователь:


• Двойные аналоговые компараторы с программируемой
конфигурацией входа/выхода.

11
• Внутренний датчик температуры.

• Замер времени зарядки (CTMU):

 Используется для измерения емкости, 16 каналов.

 Измерение времени с разрешением до 200 пс.


• Задержка/генерация импульса, до 1 нс разрешающая способность.
Особенности микроконтроллера:

• Широкий диапазон рабочего напряжения (от 2 до 5.5 В)

• Источники с низким энергопотреблением:

 Сверхнизкое энергопотребление (ULPWU) для сна/глубокого


сна.

 Сторожевой таймер малой мощности (DSWDT) для глубокого


сна.

 Экстремальный сброс энергопотребления с пониженным


энергопотреблением (DSBOR) для глубокого сна, LPBOR для всех
других режимов.
• Стандартный сторожевой таймер (WDT) с встроенным
чипом, маломощный RC-осциллятор для надёжной работы.
• Программируемый детектор высокого/низкого напряжения (HLVD).

• Стандартный сброс при отключении (BOR) с 3 программируемыми


точками срабатывания, которые можно отключить во время сна.
• Сильноточный приемник/источник (18 мА/18 мА) на всех выводах
ввода/вывода
• Флэш-память программ:

• EEPROM данные:

• Отказоустойчивый монитор часов (FSCM).

• Программируемый эталонный тактовый выход.

12
Микроконтроллер PIC24FV16KA301 имеет:

• 20 разъемов (рис. 1.1, табл. 1).

• Flash-память объемом 16 кбайт.

• Пять 16-битных таймеров.

• Двенадцать 12-битных аналого-цифровых преобразователей.

• 3 компаратора.

• 2 UART

• 12 CTMU

Рис. 1.1. Разъёмы микроконтроллера PIC24FV16KA301

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-битная архитектура

Центральным элементом всех устройств PIC24F является 16-


битная модифицированная Гарвардская архитектура, впервые
представленная с цифровыми контроллерами сигналов dsPIC от Microchip.
Ядро процессора предполагает ряд улучшений , таких как:
• 16-битные данные и 24-битные адресные пути с
возможностью перемещения информации между данными и
областями памяти.
• Линейная адресация до 12 Мбайт (пространство программ) и 64
Кбайт (данные).
• 16-элементный массив рабочих регистров со встроенной поддержкой
программного стека.
• Аппаратный множитель 17 x 17 с поддержкой целочисленная
математика.

• Аппаратная поддержка 32-битного на 16-битное деление.

• Набор команд, который поддерживает несколько режимов адресации


и оптимизирован для языков высокого уровня, таких как «Си».
• Производительность до 16 MIPS .

2) Энергосберегающие технологии

Все устройства семейства имеют ряд функций, которые могут значительно


снизить энергопотребление во время работы. Ключевые особенности включают
в себя:
• Переключение часов «на лету»: часы устройства могут быть
изменены с помощью программного управления на источник Timer1 или
внутренний, маломощный RC-осциллятор во время работы, что позволяет
пользователям внедрять идеи энергосбережения в свои программные
разработки.

15
• Работа в режиме ожидания: когда чувствительные ко времени
приложения, такие как последовательная связь, требуют бесперебойной работы
периферийных устройств, тактовая частота процессора может выборочно
снижаться, что позволяет постепенно экономить энергию, не пропуская такт.
• Режимы энергосбережения на основе инструкций. Существует три
режима энергосбережения на основе инструкций:
- Режим ожидания: ядро отключается, периферия остаётся
активной.
- Спящий режим: ядро и периферийные устройства, для которых
требуются системные часы, выключены, а периферийные устройства, которые
используют свои собственные часы или часы от других устройств, активны.
- Режим глубокого сна: ядро, периферия (кроме RTCC и DSWDT),
Flash и SRAM выключены.
3) Функции и настройка осциллятора

Семейство PIC24FV32KA304 предлагает пять различных вариантов


осцилляторов, что дает пользователям широкий выбор при разработке
аппаратного обеспечения. Они включают:
• Два режима Crystal с использованием кристаллов или керамических
резонаторов.
• Два режима внешних часов, предлагающих возможность деления на
два тактовых сигнала.
• Два быстрых внутренних осциллятора (FRC): один с номинальным
выходом 8 МГц, а другой с номинальным выходом 500 кГц. Эти выходы также
могут быть разделены под программным управлением, чтобы обеспечить
тактовую частоту всего 31 кГц или 2 кГц.
• Множитель частоты фазовой автоподстройки частоты (ФАПЧ),
доступный для режимов внешнего осциллятора и осциллятора FRC 8 МГц,
который обеспечивает тактовую частоту до 32 МГц.

16
• Отдельный внутренний RC-осциллятор (LPRC) с фиксированным
выходом 31 кГц, который обеспечивает опцию малой мощности для
нечувствительных к синхронизации приложений.
Блок внутреннего осциллятора также обеспечивает стабильный эталонный
источник для Fail-Safe Clock Monitor (FSCM). Этот параметр постоянно
отслеживает основной источник тактовых импульсов от опорного сигнала,
представленной внутренним осциллятором и позволяет контроллеру
переключиться на внутренний осциллятор, что позволяет для продолжения
работы на малой скорости или безопасного отключения приложения.
4) Другие особенности

• Связь. Семейство PIC24FV32KA304 включает в себя ряд


периферийных устройств последовательной связи для удовлетворения
различных требований приложений. Существует модуль I2C, который
поддерживает режимы Master и Slave. Он также содержит UART со
встроенными кодерами / декодерами IrDA и модулем SPI.
• Часы реального времени/календарь: этот модуль реализует
полнофункциональные часы и календарь с функциями будильника на
аппаратном уровне, освобождая ресурсы таймера и память программы для
использования в основном приложении.
• 12-разрядный аналого-цифровой преобразователь: этот модуль
включает в себя программируемое время сбора данных, что позволяет выбрать
канал и начать преобразование без ожидания периода выборки, а также
повысить скорость выборки. Буфер 16 глубины можно использовать либо в
спящем режиме для снижения энергопотребления, либо в активном режиме для
повышения пропускной способности.
• Интерфейс блока измерения времени зарядки (CTMU): включает в
себя новый интерфейсный модуль CTMU, который можно использовать для
емкостного сенсорного считывания, определения близости, а также для точного
измерения времени и генерации импульсов.

17
Рис. 1.2. Блок-схема микроконтроллера
На рисунке 1.2. изображены модули, которыми возможно воспользоваться
в микроконтроллере PIC24FV16KA301. Таблица 1 показывает, к какому
контакту надо подключиться, чтобы задействовать необходимый модуль.

18
1.3. Организация памяти

Как устройства архитектуры Гарварда, микроконтроллеры PIC24F имеют


отдельное пространство памяти для программ и данных, а также шины. Эта
архитектура также обеспечивает прямой доступ к программной памяти из
пространства данных во время выполнения кода.

1.3.1. Память программ

Область памяти программ составляет 4 Мбайт инструкций. Это


пространство адресуется с помощью 24-битного значения, полученного либо из
23-битного счетчика программ во время выполнения программы, либо из
табличной операции или перераспределения пространства данных.
Доступ пользователя к памяти программ ограничен нижней половиной
диапазона адресов (от 000000h до 7FFFFFh). Исключением является
использование операций TBLRD / TBLWT, которые используют TBLPAG <7>,
чтобы разрешить доступ к разделам битов конфигурации и идентификаторов
устройств пространства памяти конфигурации (рис. 1.3).

19
Рис. 1.3. Архитектура памяти программ микроконтроллера
PIC24FV16KA301

20
1.3.2. Память данных

Ядро PIC24F имеет отдельное 16-битное пространство памяти данных,


адресуемое как один линейный диапазон. Доступ к пространству данных
осуществляется с использованием двух блоков генерации адресов (AGU), по
одному для операций чтения и записи (рис. 1.4.)

Рис. 1.4. Архитектура памяти данных микроконтроллера PIC24FV16KA301


Все эффективные адреса (EAs) в области памяти данных имеют ширину 16
бит и указывают на байты в пространстве данных. Это дает диапазон адресов
пространства данных 64 кбайт или 32 кбайт слов. Нижняя половина
пространства памяти данных (то есть, когда EA <15> = 0) используется для

21
реализованных адресов памяти, а верхняя половина (EA <15> = 1)
зарезервирована для области видимости программного пространства (PSV).

Устройства семейства PIC24FV32KA304 реализуют в общей сложности


1024 слова памяти данных. Если указывается на местоположение за пределами
этой области, возвращается нулевое слово или байт.

Область памяти данных организована в байт-адресуемые блоки шириной


16 бит. Наименее значимые байты (LSB) каждого слова имеют четные адреса, в
то время как наиболее значимые байты (MSB) имеют нечетные адреса.

1.4. Конфигурация осциллятора

Осцилляторная система для устройств семейства PIC24FV32KA304 имеет


следующие особенности:
• В общей сложности пять вариантов внешнего и внутреннего
осцилляторов в качестве источников синхронизации, обеспечивающих 11
различных режимов синхронизации.
• Встроенная 4-фазная фазовая автоподстройка частоты (ФАПЧ) для
повышения внутренней рабочей частоты на выбранных внутренних и внешних
источниках осциллятора.
• Программно-управляемое переключение между различными
источниками синхронизации.
• Программно-управляемый постделитель для выборочного
тактирования процессора для экономии энергии системы.
• Биты объявления диапазона частот системы для режима EC. При
использовании внешнего источника синхронизации потребление тока
уменьшается путем установки битов декларации в ожидаемый частотный
диапазон.
• Fail-Safe Clock Monitor (FSCM), который обнаруживает сбой часов и
разрешает безопасное восстановление или отключение приложения.

22
Упрощенная схема осцилляторной системы показана на рисунке 1.5.

Рис. 1.5. Упрощённая схема осцилляторной системы

• Системный источник синхронизации может быть предоставлен одним из


четырех источников:
• Первичный осциллятор (POSC) на выводах OSCI и OSCO.

• Вторичный осциллятор (SOSC) на выводах SOSCI и SOSCO.

• Устройства семейства PIC24FV32KA304 состоят из двух типов


вторичного осциллятора:
 Мощный вторичный осциллятор.

 Вторичный осциллятор с низким энергопотреблением.

• Быстрый внутренний RC (FRC) осциллятор.

23
 Осциллятор FRC 8 МГц.

 Осциллятор FRC с пониженной мощностью 500 кГц.

• Внутренний RC-осциллятор низкой мощности (LPRC) с двумя


режимами:

- Режим высокой мощности/высокой точности.

- Режим низкой мощности/низкой точности.

Первичный осциллятор и источники FRC 8 МГц могут использовать


внутреннюю 4-кратную ФАПЧ. Частота источника тактового сигнала FRC
может быть дополнительно уменьшена с помощью программируемого делителя
тактового сигнала. Выбранный источник синхронизации генерирует процессор
и периферийные источники синхронизации.

1.5. 12-битный аналого-цифровой преобразователь

12-разрядный аналого-цифровой преобразователь имеет следующие


ключевые особенности:
• Преобразование последовательных приближений (SAR).

• Скорость конверсии до 100 к/с.

• До 32 аналоговых входных каналов (внутренний и внешний).

• Несколько внутренних опорных входных каналов.

• Униполярный дифференциальный усилитель выборки и удержания


(S/H).

• Автоматическая пороговая операция сканирования и сравнения


для предварительной оценки результатов конверсии.
• Выбираемый источник запуска конверсии.

• Фиксированная длина (одно слово на канал), настраиваемый буфер


результатов преобразования.

24
• Четыре варианта выравнивания результатов.

• Настраиваемая генерация прерываний.

• Работа во время режимов сна и ожидания процессора.


Модуль 12-разрядного аналого-цифрового преобразователя является
расширенной версией 10-разрядного модуля, предлагаемого в некоторых
устройствах PIC24. Оба модуля являются преобразователями
последовательного регистра аппроксимации (SAR) в своих ядрах, окруженных
рядом аппаратных функций для гибкой конфигурации. Эта версия модуля
расширяет функциональность, обеспечивая 12-битное разрешение, более
широкий диапазон опций автоматической выборки и более тесную интеграцию
с другими аналоговыми модулями, такими как CTMU и настраиваемый буфер
результатов. Этот модуль также включает в себя уникальную функцию
обнаружения порога, которая позволяет самому модулю принимать простые
решения на основе результатов конвертации. Упрощенная блок-схема модуля
показана на рисунке 1.6.

25
Рис. 1.6. Упрощённая блок-схема модуля АЦП

26
Регистры AD1CON1, AD1CON2 и AD1CON3 управляют всей работой
модуля АЦП. В их число сходит включение АЦП, настройки тактовой частоты
преобразования и опорное напряжение источников, выбор выборки и
преобразования триггеров, и ручной контроль преобразования
последовательности. Регистр AD1CON5 специально управляет функциями
операции обнаружения порога, включая ее функцию в режимах энергосбережения.
Регистр AD1CHS выбирает входные каналы для подключения к усилителю
S/H. Это также позволяет выбирать входные мультиплексоры и выбирать
эталонный источник для дифференциальной выборки.

Регистры AD1CHITH и AD1CHITL - семафорные регистры, используемые с


операциями обнаружения порога. Состояние отдельных битов или пар битов в
некоторых случаях указывает на наличие условия совпадения. AD1CHITL всегда
реализован, тогда как AD1CHITH не может быть реализован в устройствах с 16
или менее каналами.

Регистры AD1CSSH/L выбирают каналы, которые необходимо включить для


последовательного сканирования.

Регистры AD1CTMUENH/L выбирают канал(ы), который будет


использоваться CTMU во время преобразований. Выбор конкретного канала
позволяет аналого-цифровому преобразователю управлять CTMU (в частности,
его источником тока) и считывать его данные через этот канал. AD1CTMUENL
всегда реализуется, тогда как AD1CTMUENH не может быть реализован в
устройствах с 16 или менее каналами.

27
1.6. Таймеры

Одна из основных операций таймера – формирование временных интервалов.


В практической работе с микроконтроллерами использование прерываний очень
удобно, поскольку в этом случае процессор занимается выполнением команд
основной программы, без постоянного опроса периферийных устройств. В этом
случае работа периферийного устройства, например таймера, ведётся параллельно
и не влияет на работу процессорного ядра до выработки соответствующего
прерывания.

Микроконтроллер PIC24FV16KA301 предлагает пять 16-битных таймеров.


Эти таймеры обозначаются как Timer1, Timer2, Timer3, Timer4, Timer5.

Каждый модуль таймера представляет собой 16-битный таймер/счётчик,


состоящий из следующих читаемых/записываемых параметров регистров:

 TMRx: 16-битный регистр отсчёта таймера

 PRx: 16-битный регистр периода таймера, связанный с таймером

 TxCON: 16-битный регистр управления таймером, связанный с таймером

Каждый модуль таймера также имеет соответствующие биты для управления


прерыванием:

 Прерывание включения управляющего бита (TxIE)

 Бит состояния флага прерывания (TxIF)

 Биты управления приоритетом прерывания (TxIP<2:0>)

За некоторыми исключениями, все 16-битные таймеры имеют одинаковую


функциональную схему. 16-битные таймеры делятся на три типа, с учетом их
функциональных различий:

 Временная база типа А

 Временная база типа B

 Временная база типа C

28
Некоторые 16-разрядные таймеры могут быть объединены в 32-разрядный
таймер, в данном микроконтроллере такими таймерами являются Timer 2-4 и
Timer 3-5

1.6.1. Timer 1

Модуль Timer1 представляет собой 16-битный таймер, который может


служить счётчиком времени для часов реального времени (RTC) или работать как
свободно работающий интервальный таймер/счётчик. Данный таймер относится
к типу «А», который имеет следующие уникальные особенности по сравнению с
другими типами:

 Может работать от устройства маломощного генератора частотой 32 кГц

 Может работать в асинхронном режиме от внешнего источника


синхронизации

В частности, уникальные особенности таймера типа А позволяют


использовать его для запаса времени, или как вторичный источник тактового
сигнала

Timer1 может работать в трёх режимах:

 16-битный таймер

 16-битный синхронный счётчик

 16-битный асинхронный счётчик

Timer1 также поддерживает эти функции:

 Timer Gate Operation

 Выбираемые настройки предделителя

 Работа таймера во время простоя процессора и спящего режима

 Прерывание при совпадении 16-битного регистра периода или падении края


сигнала внешнего затвора

Чтобы настроить Timer1 для работы, нужно:

29
1. Установить бит TON= 1.

2. Выбрать коэффициент предделителя таймера, используя биты


TCKPS<1:0>.

3. Установить режимы синхронизации и стробирования с помощью


битов TCS и TGATE.

4. Установить или очистите бит TSYNC для настройки синхронной или


асинхронной работы.

5. Загрузить значение периода таймера в регистр PR1.

6. Если требуются прерывания, требуется установить бит включения


прерывания Timer1, T1IE. Используются биты приоритета прерывания Timer1,
T1IP<2:0>, чтобы установить приоритет прерывания.
Структурная схема таймера изображена на рис. 1.10, назначение битов
регистра управления T1CON таймера приводится в таблице 2:

Рис. 1.10. Структурная схема модуля Timer 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

Модули Timer2/3 и Timer4/5 представляет собой 32-битные таймеры,


которые также могут быть сконфигурированы как четыре независимых 16-
разрядных таймера с возможностью выбора режимов работы, где Timer 2 и Timer
4 являются таймерами типа В, а Timer 3 и Timer 5 являются таймерами типа С

Как 32-битный таймер, Timer2/3 или Timer4/5 работают в трёх режимах:

 Два независимых 16-битных таймера (Timer2 и Timer3) со всеми 16-


битными режимами работы (кроме асинхронного режима счётчика)

 Один 32-битный таймер

 Одиночный 32-разрядный синхронный счётчик

Они также поддерживают эти функции:

 Запуск/остановка таймера внешним сигналом

 Выбираемые настройки предделителя

 Работа таймера в режиме холостого хода

 Прерывание при совпадении 32-разрядного регистра периода

 Триггер события A / D

По отдельности все четыре 16-разрядных таймера могут функционировать


как синхронные таймеры или счётчики. Они также предлагают функции,
перечисленные выше, за исключением триггера события A / D (это реализовано
только с Timer3). Режимы работы и включённые функции определяются путём
установки соответствующих битов в регистрах T2CON, T3CON, T4CON и T5CON.
Регистры T2CON,T3CON, T4CON и T5CON представлены в общей форме в
регистре 13-1 и регистре 13-2 соответственно. Для 32-разрядной операции
таймера / счётчика Timer2/Timer4 является наименее значимым словом, а Timer3
/Timer 5-наиболее значимым словом 32-разрядного таймера.

Настройка Timer2/3 или Timer4/5 для 32-разрядной работы проводится


следующим образом:

32
1. Устанавливается бит T32 (T2CON<3> или T4CON<3> = 1).

2. Выбирается коэффициент предделителя для Timer2 или Timer4,


используя биты TCKPS<1:0>.

3. Устанавливаются режимы синхронизации и стробирования с


помощью битов TCS и TGATE.

4. Загружаемое значение периода таймера. PR3 (или PR5) будет


содержать наиболее значимое слово значения, в то время как PR2 (или PR4)
содержит наименее значимое слово.

5. Если требуются прерывания, устанавливается бит Timerx Interrupt


Enable, TxIE. Используются биты приоритета прерывания Timerx, TxIP<2:0>,
чтобы установить приоритет прерывания.

6. Устанавливается бит TON (TxCON<15> = 1).

Значение таймера в любой момент сохраняется в регистровой паре


TMR3:TMR2 (или TMR5:TMR4). TMR3 (TMR5) всегда содержит наиболее
значимое слово подсчета, в то время как TMR2 (TMR4) содержит наименее
значимое слово.

Настройка любого из таймеров для индивидуальной 16-битной работы


проводится следующим образом:

1. Очищается бит T32, соответствующий этому таймеру (T2CON<3> для


Timer2 и Timer3 или T4CON<3> для Timer4 и Timer5).

2. Выбирается коэффициент предделителя таймера, используя биты


TCKPS<1:0>.

3. Устанавливаются режимы синхронизации и стробирования с


помощью битов TCS и TGATE.

4. Загрузка значение периода таймера в регистр PRx.

5. Если требуются прерывания, устанавливается бит включения


прерывания Timerx, TxIE; используйте биты приоритета прерывания Timerx,
TxIP<2:0>, чтобы установить приоритет прерывания.

33
6. Устанавливается бит TON (TxCON<15> = 1).

В данном микроконтроллере, Timer2 и Timer4, являются таймерами типа B.


Таймер типа B имеет следующие уникальные особенности по сравнению с
другими типами таймеров:

 Таймер типа B может быть объединён с таймером типа C для формирования


32-разрядного таймера. Регистр TxCON для таймера типа B имеет управляющий
бит T32 для включения 32-разрядной функции таймера.

 Часы синхронизации для типа таймера B выполняется после логика


масштабирования. Преимущество размещения тактовой синхронизации после
логики предделителя следующая:

В некоторых приложениях желательно использовать один из таймеров для


подсчёта тактовых фронтов от относительно высокочастотного внешнего
источника тактовых импульсов. В этих ситуациях временные базы типа А и типа
В являются наиболее подходящими вариантами для подсчета внешнего источника
тактовых импульсов, поскольку логика синхронизации тактовых импульсов для
этих таймеров расположена после предделителя таймера (см. рис. 1.10. и рис.
1.12.). Это позволяет использовать более высокую внешнюю тактовую частоту,
которая не будет нарушать минимальное высокое и низкое время, требуемое
предделителем. Если для временной базы типа А или типа в выбрано
соотношение предделителя таймера, отличное от 1:1, то минимальное высокое и
низкое время для внешнего тактового входа уменьшается на выбранное
соотношение предделителя. Временная база типа А уникальна тем, что она может
работать в асинхронном режиме, устраняя любые требования к времени
предделителя. Во всех случаях существует минимальное время максимума и
минимума для внешнего тактового сигнала, которое не может быть превышено.
Эти минимальные времена необходимы для того, чтобы удовлетворить
требования к синхронизации выводов ввода-вывода.

Далее приведены структурные схемы таймеров 2-5 в виде 32-х битных


модулей (рис. 1.11.) и 16-битных модулей (рис. 1.12. и рис. 1.13.):

34
Рис. 1.11. Структурная схема 32-битных модулей Timer2/3 and Timer4/5

35
Рис. 1.12. Структурная схема 16-битных модулей Timer2 and Timer4

Рис. 1.13. Структурная схема 16-битных модулей Timer3 and Timer5

Назначение битов регистра управления TxCON для таймеров 2 и 4


приводится в таблице 3:

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»

Назначение битов регистра управления TуCON для таймеров 3 и 5


приводится в таблице 4:

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. Введение

Блок измерения времени заряда (CTMU) – это гибкий аналоговый модуль,


который имеет настраиваемый источник тока с цифровой схемой, построенной
вокруг него. CTMU может использоваться для разделения по времени между
периодами повторения импульсного источника и может использоваться для
генерации асинхронных импульсов. Работая со встроенным аналоговым модулем,
CTMU может быть использован как высокоточный таймер для разделения
измерений по времени ёмкости, сопротивления, индуктивности и температуры.
CTMU также может генерировать выходные импульсы с определённой временной
задержкой. Эти измерения могут использоваться в работе с ёмкостным датчиком,
измерением влажности и измерением относительного изменения ёмкости. CTMU
идеально подходит для взаимодействия с датчиками, основанными на измерении
ёмкости.
Модуль включает в себя следующие ключевые функции:

• Встроенный прецизионный источник тока.

• Шестнадцатеричные источники входного триггера.

• Выбор входов по перепаду уровня или по уровню чувствительности.

• Контроль полярности для каждого источника перепадов уровней.

• Контроль последовательности перепадов.

• Контроль реакции на перепады.

• Высокоточное измерение времени.

• Временная задержка внешнего или внутреннего асинхронного сигнала


относительно внутренних отсчетов
• Встроенный диод, чувствительный к температуре

39
• Контроль источника тока во время автоматических замеров.

• Четыре диапазона источников тока.

• Разрешающая способность измерений - одна наносекунда или меньше.

• Работа CTMU в спящем режиме.

• Относительные измерения пределов с использованием аналого-


цифрового преобразователя.
CTMU работает в сочетании с аналого-цифровым преобразователем для
измерения времени или заряда. При конфигурировании для измерения временных
задержек CTMU подключается к одному из аналоговых компараторов (рис 2.1.).
Количество источников входных перепадов может достигать шестнадцати.

Рис. 2.1. Блок-схема CTMU

40
2.2. Принцип работы CTMU

CTMU работает, используя фиксированный источник тока для питания цепи.


Тип цепи зависит от типа производимого измерения. В случае измерения заряда
ёмкости ток зафиксирован и значение времени подачи тока в цепь, остается
неизменным. Замер уровня напряжения АЦП происходит во время измерения
ёмкости цепи. В случае измерения времени ток, как и ёмкость цепи, фиксируется.
Напряжение с АЦП снимается тогда, когда истекает характерное время начала и
окончания зарядки контура.
Если в качестве временной задержки используется CTMU, емкость и
источник тока остаются неизменными, так же как и опорное напряжение питания
компаратора. Задержка сигнала определяется количеством времени, которое
требуется, чтобы зарядить цепь до порогового напряжения компаратора.

Рис. 2.2. Конфигурация CTMU

На рис. 2.2. показаны внешние подключения, используемые для измерения


времени, и связь модулей CTMU и АЦП.

41
2.2.1. Теоретические основы работы модуля

Работа CTMU основана на уравнении для заряда конденсатора по формуле


(2.1.)

dV
I C (2.1)
dt

Проще говоря, заряд, измеренный в кулонах в цепи, определяется как ток в


амперах (I), умноженный на количество времени в секундах (t), в течение
которого протекает ток. Заряд также определяется как ёмкость в фарадах (С),
умноженная на напряжение цепи (V), как показано в формуле (2.2.)

I  t  C V (2.2)

Модуль CTMU обеспечивает неизменное значение источника тока.


Аналого-цифровой преобразователь используется для измерения (V) в уравнении,
оставляя две неизвестные величины: ёмкость (C) и время (t). Формула 2.2. может
быть использована для вычисления ёмкости или времени, либо по соотношению,
показанному в формуле 2.3 и использующему известную фиксированную ёмкость
цепи, либо по формуле 2.4, использующей постоянное значение времени для
используемого цепью источника тока.

(C  V )
t (2.3)
I

(I  t)
C (2.4)
V

42
2.2.2. Источник тока

В основе CTMU лежит точно откалиброванный источник тока,


предназначенный для обеспечения постоянности проводимых измерений.
Величина тока выбирается пользователем в четырех диапазонах или в общей
сложности на три порядка величины, с возможностью обрезки выходного сигнала
с шагом ±2% (номинально). Текущий диапазон выбирается битами IRNG<1:0>
(CTMUCON1L<1:0>).

Текущая готовность обеспечивается двумя дополнениями, подписанными


битами ITRIM<5:0> (CTMUCON1L<7: 2>). Эти шесть битов позволяют обрезать
источник тока с шагом аппроксимации примерно на 2%. Значение '000000'
является средним значением (без изменений). Значение '100000 ‘является
максимальной отрицательной регулировкой (приблизительно -64%), а’ 011111' -
максимальной положительной регулировкой (приблизительно +62%).

2.2.3. Выбор и управление пороговым значением/уровнем

Измерения CTMU контролируются значением перепада или изменениями


уровня на двух входных каналах модуля. Каждый канал, называемый «перепад 1»
и «перепад 2», может быть сконфигурирован для приёма входных импульсов от
одного из шестнадцати контактов, принимающих перепадов. Входные сигналы
выбираются с помощью битовых пар EDG1SEL<3:0> и EDG2SEL<3:0>
(CTMUCON1H<13:10> и CTMUCON1H<5:2>). Кроме того, режим входных
источников на перепад 1 и перепад 2 может быть либо чувствительным к уровню,
либо чувствительным к перепаду, который выбирается с помощью бита
EDG1MOD (CTMUCON1H<15>).

В дополнение к источнику, каждый канал может быть сконфигурирован для


изменения полярности с помощью битов EDG1POL и EDG2POL
(CTMUCON1H<14,6>). Входные каналы также могут быть отфильтрованы для
последовательности перепадов (перепад 1 происходит до перепада 2), установив
бит EDGSEQEN (CTMUCON1L<10>).

43
2.2.4. Значение перепада

Регистр CTMUCON1H также содержит два бита состояния: EDG2STAT и


EDG1STAT (CTMUCON1H<9: 8>). Их основная функция состоит в том, чтобы
показать, произошёл ли перепад на соответствующем канале. CTMU
автоматически устанавливает определённый бит, когда на его канале
обнаруживается перепад. Чувствительность входных каналов к уровню, или
чувствительность к перепаду, также означает, что биты состояния
устанавливаются немедленно, если конфигурация канала изменяется и совпадает
с текущим состоянием канала.

Модуль использует биты состояния перепада для управления выходом


источника тока на внешние аналоговые модули (например, аналого-цифровой
преобразователь). Ток подаётся только на внешние модули, когда EDG1STAT не
равен EDG2STAT, и отключается, когда EDG1STAT равен EDG2STAT. Это
позволяет CTMU измерять ток только в течение интервала между перепадами.
После того как оба бита состояния установлены, необходимо очистить их перед
тем, как будет произведено другое измерение. Оба бита должны быть очищены
одновременно, чтобы избежать повторного включения источника тока CTMU.

В дополнение к установке аппаратным обеспечением CTMU, биты


состояния перепада также могут быть заданы программно. Это позволяет
пользователю при помощи программы вручную включать или отключать
источник тока. Установка одного из битов (но не обоих) включает источник тока,
тогда как установка или очистка обоих битов одновременно отключает источник
тока.

2.2.5. Прерывания

CTMU устанавливает свой флаг прерывания всякий раз, когда источник


тока включён и отключён. Бит включения прерывания CTMU также должен быть
установлен для генерации прерываний. Если последовательность перепадов не
задана, перепад 1 должен произойти до перепада 2, чтобы создать прерывание, а

44
также необходимо отслеживать биты состояния перепадов и определять, какой
перепад возник последним и вызвал прерывание.

2.3. Калибровка модуля CTMU

CTMU требует калибровки для точных измерений ёмкости и времени, а


также для создания точной временной задержки. Если требуется только измерить
относительное изменение сопротивления, ёмкости или времени, калибровка
обычно не требуется. Эти приложения включают ёмкостные датчики, при которой
сенсорная схема имеет базовую ёмкость, а добавленная ёмкость человеческого
тела изменяет общую ёмкость схемы. Если требуется измерение фактического
сопротивления, ёмкости или времени, то требуется калибровка.

2.3.1. Калибровка источника тока

Эта калибровка заключается в измерении падения напряжения,


генерируемого источником тока CTMU, на резисторе известного значения (RCAL)
с помощью АЦП. Уравновешивание CTMU регулируется до тех пор, пока
измеренное значение АЦП не окажется в пределах желаемой погрешности.
Значение RCAL зависит от диапазона значений источника тока (рекомендуемые
значения RCAL приведены в таблице 5). Значение RCAL также можно вычислить с
помощью уравнения 2.5. После определения значения RCAL ожидаемое
количество значений АЦП может быть рассчитано с помощью формулы 2.6.

Существует две калибровки тока; соответствующая калибровка зависит от


значений диапазона тока, используемого в приложении. Для значений диапазонов
источников тока 550 мкА или 5,5 мкА уместна калибровка в режиме значений
малого тока; обычно она может быть выполнена на любом выводе аналогового
входа. Для более высоких диапазонов CTMU внутренние сопротивления
оказывают значительное влияние на калибровку, поэтому подходит калибровка в
режиме высоких токов. Калибровка режима высоких токов обычно
ограничивается одним выводом устройства с выделенным соединением к CTMU

45
ADCVREF  70%
RCAL  (2.5)
CTMU Range

RCAL  CTMU Range  (2^ ADC Bits )


Количество значений  (2.6)
ADCVREF

Таблица 5

Значения диапазона источника тока Значение RCAL (Ом)

0.550 мкА 4.22 МОм

5.5 мкА 422 кОм

55 мкА 42.2 кОм

550 мкА 4.22 кОм

2.2 мА 1 кОм

2.3.2. Калибровка режима диапазона малых значений тока

Эта калибровка подходит только для диапазонов 550 мкА и 5,5 мкА. Большое
отношение RCAL к RESD и RMUX позволяет игнорировать значения RESD и RMUX для
упрощения вычислений (см. рис. 2.3.). Процесс калибровки состоит из включения
источника тока и выборки напряжения, генерируемого через RCAL . Затем это
напряжение делится на известное значение резистора для расчёта тока CTMU.
Затем уравновешивание итеративно корректируется до тех пор, пока не будет
достигнута требуемая калибровка. Для калибровки требуется выполнить
следующие действия:

1. Настроить CTMU для генерируемого тока (TGEN = 0).

2. Настроить порт ввода-вывода в качестве входа и включить аналоговый режим.

3. Настроить АЦП на ручной режим.

46
4. Включить CTMU.

5. Включить источник тока, установив бит EDG1STAT.

6. Начать выборку.

7. Подождать примерно 1500 мкс, пока конденсатор зарядится.

8. Преобразовать аналоговое значение.

9. Отключить CTMU.

10. Повторить " n " раз, записывая значения и усредняя результат.

11. Рассчитать значение тока.

12. Итеративно отрегулировать уравновешенное значение до тех пор, пока


результат не примет вид требуемого значения тока CTMU.

Код конфигурации находится в Приложении 1

Рис. 2.3. Структурная схема для калибровки режима диапазона низких значений
тока

47
2.3.3. Калибровка режима диапазона высоких значений тока

Калибровка в режиме высоких токов использует специальное соединение со


специальным выводом устройства для нейтрализации влияния падения
напряжения на RMUX, наблюдаемого в методе калибровки в режиме малых токов.
Эти падения становятся значительным источником ошибок для более высоких
диапазонов тока. Хотя этот метод предназначен для диапазона высоких значений
тока, он может быть использован для повышения точности калибровки на
диапазоне низких значений тока. Этот метод обычно обеспечивает допуск
калибровочной погрешности менее 3% на всех диапазонах (см. рис. 2.4.). Процесс
калибровки состоит из включения источника тока и выборки напряжения,
генерируемого через RCAL. Затем это напряжение делится на известное значение
резистора для расчёта тока CTMU. Затем уравновешивание итеративно
корректируется до тех пор, пока не будет достигнута требуемая калибровка. Для
калибровки в режиме высоких токов требуется выполнить те же действия,
которые были необходимы в режиме малых токов, только первым шагом
требуется установить TGEN=1.

Код конфигурации находится в Приложении 2

Рис. 2.4. Структурная схема для калибровки режима диапазона высоких значений
тока

48
2.3.4. Калибровка ёмкости

Калибровка ёмкости заключается в измерении ёмкости системы без


измеряемой нагрузки. Ёмкость вычисляется с использованием времени заряда,
тока и результирующего напряжения; где ток известен из шага измерения
источника тока, t-известная фиксированная задержка, а V измеряется путём
выполнения преобразования АЦП. Это измеренное значение, смещение, затем
может быть сохранено и вычтено из расчётов измерения времени или измерения
ёмкости. Для калибровки временная задержка может быть аппроксимирована,
если известны приближенные значения CSTRAY и CADC (см. уравнение 2.7 и
уравнение 2.8).

Для калибровки ёмкости источник тока сначала калибруется с помощью


процедуры, описанной в разделе 2.3.1 "Калибровка источника тока". Затем
калибровочный резистор снимается или для калибровки ёмкости используется
другой аналоговый канал. Затем калиброванный источник тока включается, пока
АЦП выполняет выборку, для зарядки конденсатора выборки АЦП и ёмкости
системы. Преобразование АЦП запускается после точной задержки. Результат
преобразования АЦП и период задержки затем используются для расчёта ёмкости
системы (см. уравнение 2.9). Затем это значение можно вычесть из будущих
измерений, чтобы учесть ёмкость системы. Чтобы минимизировать влияние шума
и использовать линейный рабочий диапазон источника тока, период задержки
должен быть выбран или отрегулирован таким образом, чтобы измеряемое
напряжение составляло приблизительно 70% от AVDD.

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. Структурная схема для калибровки ёмкости

Калибровка ёмкости может быть выполнена с использованием


конфигурации из текущего режима калибровки с отключённым резистором RCAL
или с использованием другого штыря для калибровок и измерений. Для
конфигурирования устройства для калибровки ёмкости, нужно сделать
следующие действия:

1. Выполнить калибровку источника тока (см. раздел 4.1 “калибровка


источника тока”).

2. Настроить CTMU для генерируемого тока (TGEN = 0).

3. Настроить порт ввода-вывода в качестве входа и включить аналоговый


режим.

4. Настроить АЦП на ручной режим.

5. Включить CTMU.

6. Включить источник тока, установив бит EDG1STAT.

7. Начать выборку.

8. Заземлить источник тока

9. Установить задержку приблизительно 1200 мкс, чтобы позволить


внутреннему контуру разрядиться.

50
10. Отсоедините источник тока от земли.

11. Подождите заданное время, пока конденсатор образца зарядится.

12. Преобразуйте аналоговое значение.

13. Отключите CTMU.

14. Повторите все это 10 раз, накапливая значения и усредняя результат.

15. Вычислите ёмкость, используя уравнение 2.6.

Код конфигурации находится в Приложении 3

2.3.5. Вопросы калибровки и измерений

При выполнении калибровок следует учитывать следующее:

1. Фактическое значение калибровочного резистора не имеет значения, но


оно должно соответствовать следующим требованиям:

• Генерируемое напряжение на резисторе должно составлять от ½ до ¾


полного значения АЦП, чтобы минимизировать влияние шума на измерение и
оставаться в линейном диапазоне источника тока. Источник тока работает
линейно, когда развиваемое напряжение нагрузки меньше (AVDD -0,7 В, обычно).

• Допуск резистора не имеет значения, если известно фактическое значение


резистора и это значение используется в расчётах.

• Выбранное значение резистора должно быть не менее чем в 100 раз


больше внутреннего сопротивления, чтобы минимизировать смещения,
создаваемые внутренними резисторами.

• Для калибровки ёмкости время задержки должно быть выбрано таким


образом, чтобы пробный конденсатор АЦП заряжался от ½ до ¾ диапазона АЦП,
чтобы максимизировать разрешение и уменьшить влияние шума.

2. Время задержки для калибровки тока должно быть достаточным, чтобы


позволить конденсатору образца АЦП зарядиться до установившегося значения.

51
3. Разрешение измерения может быть увеличено с помощью внешнего
эталонного АЦП, который составляет приблизительно ¾ AVDD .

2.3.6. Измерение внутреннего сопротивления

Значение внутренних сопротивлений может быть измерено и использовано


в расчётах для повышения точности калибровок и измерений тока. Сначала
необходимо откалибровать источник тока. Затем устройство настраивается для
измерения тока, но вывод ввода-вывода приводится в действие медленно. При
измерении, измеренное напряжение представляет собой падение внутреннего
сопротивления. Затем, это значение может быть вычтено из будущих измерений
для повышения точности.

2.4. Работа в режиме сна/холостого хода, влияние сброса модуля

Работа модуля CTMU зависит от бита АЦП под названием CTMREQ. При
отключённом бите CTMREQ устройство переходит в спящий режим, источник
тока модуля CTMU всегда отключён. Если CTMU выполняет операцию, которая
зависит от источника тока при вызове спящего режима, операция может
завершиться неправильно. Измерения емкости и времени могут возвращать
ошибочные значения.

В случае, когда бит CTMREQ включён, то есть принимает значение равное


1, CTMU продолжит работу в спящем режиме. CTMU может быть вызван от АЦП,
который может выполнять преобразование в спящем режиме, когда часов
осциллятора A/D установлен на внутренний A/D RC генератор (ADRC = 1). Это
позволит процессору оставаться в неактивном состоянии в течение более
длительного периода времени, и в то же время он может выполнять
преобразование выбранного канала CTMU.

В режиме ожидания поведение CTMU определяется битом CTMUSIDL


(CTMUCON1L<13>). Если CTMUSIDL очищен, модуль будет продолжать
работать в режиме ожидания. Если CTMUSIDL установлен, то источник тока

52
модуля отключается, когда устройство переходит в режим ожидания. Если
модуль выполняет операцию при вызове режима ожидания, то в этом случае
результаты будут аналогичны результатам работы в спящем режиме.

В случае сброса все регистры CTMU очищаются. Это оставляет модуль


CTMU отключённым, его текущий источник выключен, и все параметры
конфигурации возвращаются к своим настройкам по умолчанию. Модуль должен
быть повторно инициализирован после любого сброса. Если CTMU находится в
процессе выполнения измерения в момент сброса, то измерение будет потеряно.

2.5. Измерение ёмкости с помощью CTMU

Существует два метода измерения ёмкости с помощью CTMU. Первый -это


абсолютный метод, при котором требуется фактическое значение ёмкости.
Второй - относительный метод, при котором фактическое значение ёмкости не
требуется, а требуется лишь значение изменения ёмкости.

2.5.1. Измерение абсолютной ёмкости

Процесс абсолютного измерения такой же, как и процесс калибровки


ёмкости, но измеряемая нагрузка подключается во время измерения. Значение
ёмкости на этапе калибровки затем вычитается из измеренного результата, чтобы
получить значение ёмкости, пример кода имеется в Приложении 3. Если
измеряемая ёмкость значительно больше ёмкости системы, измеренной на этапе
калибровки, то задержка зарядки пробного конденсатора может быть
скорректирована, чтобы позволить конденсатору зарядиться до измеряемой
величины или обеспечить желаемое разрешение в результате. Выбранная
задержка не должна позволять результирующему напряжению превышать 75%
опорного напряжения АЦП.

53
Рис. 2.6. Структурная схема для измерения ёмкости

2.5.2. Измерение относительного заряда и сенсорное измерение ёмкости

Относительные измерения могут не требовать точных измерений ёмкости.


Например, при детектировании нажатия переключателя на основе ёмкости
представляет интерес обнаружение относительного изменения ёмкости. В этом
типе приложений, когда кнопка не нажата, общая ёмкость является ёмкостью
системы (следы печатной платы, АЦП и т. д.). Большее напряжение будет
измеряться АЦП из-за относительно меньшей ёмкости. При нажатии на кнопку
общая ёмкость увеличивается за счёт сложения ёмкости человеческого тела с
вышеперечисленными ёмкостями, а меньшее напряжение будет измеряться АЦП.
Затем программное обеспечение сравнивает незатронутые значения с текущим
результатом АЦП, чтобы определить, была ли нажата кнопка. Пороговые
значения, используемые для определения события касания, зависят от системы и
окружающей среды и поэтому должны определяться экспериментально.
Типичные реализации не требуют калибровки для работы. Защита от
электростатического разряда должна быть обеспечена на ёмкостных сенсорных
контактах

54
Для детектирования изменения ёмкости нужно:

1. Настроить CTMU для текущего поколения (TGEN = 0).

2. Настроить порт ввода-вывода в качестве входа и включение аналогового


режима.

3. Настроить АЦП на ручной режим.

4. Включить CTMU.

5. Включить источник тока, с установкой бита EDG1STAT.

6. Начать выборку.

7. Включить разрядный контур.

8. Задержка, чтобы позволить внутреннему контуру разрядиться.

9. Отключить разрядный контур.

10. Подождать заданное время, пока конденсатор образца зарядится


(задержка).

11. Преобразовать аналоговое значение.

12. Отключить источник тока.

13. Вычислить общую ёмкость, используя формулу

14. Вычесть ёмкость системы из результата (необязательно).

15. Сравнить полученный результат с ёмкостью системы.

16. Повторить шаги 5-15, если требуется усреднить результат.

Код конфигурации находится в Приложении 4

55
Рис. 2.7. Структурная схема для сенсорного измерения ёмкости

2.5.3. Ёмкостный сенсорный датчик с автоматическим пороговым


обнаружением АЦП

CTMU, в сочетании с источником триггера и АЦП с автоматическим


пороговым обнаружением, образуют полуавтономную подсистему обнаружения
относительного заряда, которая может быть использована для ёмкостного
сенсорного восприятия. Триггерный источник, такой как модуль OCMP, включает
источник тока CTMU в течение заданного периода времени, заряжая конденсатор.
Результирующее напряжение определяется ёмкостью системы и дополнительной
ёмкостью касания. АЦП настроен на автоматическое преобразование списка
каналов, соответствующих сенсорным датчикам. Пороговое обнаружение
настроено с предопределенным уровнем, и поэтому АЦП генерирует прерывание
только тогда, когда этот порог достигнут (нажата кнопка), что видно на рис. 2.7.
На рис. 2.8. показаны временные соотношения для двух сканируемых каналов.
Прерывание АЦП происходит после обнаружения более низкого напряжения на
канале 2. Затем пользовательский код очищает прерывание АЦП. Код
пользователя также должен очистить прерывание таймера. Конфигураця
проводится следующим образом:

56
1. Настройте порты GPIO.

2. Настройте CTMU для сброса внешнего триггера перепада и управления


разрядом АЦП.

3. Настройте АЦП для порогового обнаружения и автоматического


сканирования.

4. Настройте триггер сканирования (Timer1).

5. Дождитесь прерывания (это может быть реализовано как ISR).

6. Снимите флажок прерывания.

7. Определите канал, вызвавший прерывание.

8. Снимите соответствующий флаг попадания канала.

Код конфигурации находится в Приложении 5

Рис. 2.8. Ёмкостный сенсорный датчик с автоматическим пороговым


определением временной диаграммы АЦП

2.5.4. Защита от электростатического разряда (ESD)

Когда CTMU используется для ёмкостных сенсорных приложений, защита


от ЭСД должна быть обеспечена на контактах сенсорного ввода для защиты

57
микроконтроллера и поддерживающих схем. Минимальная защита от ЭСД - это
последовательный резистор, обычно 1-10 кОм (см. рис. 2.9.). Рекомендуется
дополнительная защита TVS диодов питания и заземления. Ёмкость диодов TVS
добавляет к емкости системы для защищаемого аналогового канала, поэтому
рекомендуется использовать диоды TVS с низкой емкостью. Мощность
устройства и следы заземления должны быть рассчитаны на дополнительный ток
от события ESD.

Рис. 2.9. Ёмкостная сенсорная внешняя блок-схема защиты от ЭСД

2.6. Измерение времени с помощью модуля CTMU

CTMU, в сочетании с АЦП, может быть использован для точного измерения


времени между 2 событиями. События, внутренние или внешние, включают и
отключают источник тока, заряжающий конденсатор образца АЦП (см. рис. 2.10.
и рис. 2.11.). Затем АЦП преобразует это напряжение. Внешний конденсатор
можно использовать, если требуется ёмкость, превышающая ёмкость образца
АЦП. Если используется внешний конденсатор, микропрограмме может
потребоваться разрядить конденсатор перед следующим измерением. Калибровка
источника тока CTMU и ёмкости должна выполняться до начала измерений.

Измеренное время должно быть таким, чтобы источник тока , заряжающий


ёмкость, система с, генерировал напряжение, которое находится в линейном

58
диапазоне действительного источника тока. Для наименьшего измерения времени
используйте наименьший диапазон токов и установите регистр выбора канала
АЦП (ADxCHS) на неиспользуемый канал АЦП, соответствующий вывод
которого не подключён ни к одной трассировке печатной платы. Это
минимизирует добавленную паразитную ёмкость, сохраняя общую ёмкость цепи
близкой к ёмкости самого аналого-цифрового преобразователя. Если измеренная
задержка слишком велика для измерения с помощью этого метода, внешний
конденсатор может быть подключен к каналу АЦП, и этот канал выбирается во
время измерения. Если для измерения используется внешний конденсатор, то он
должен быть подключён на этапе калибровки ёмкости.

Измерение времени осуществляется с помощью следующих шагов:

1. Настройте CTMU для пограничного режима (TGEN = 0).

2. Настройка порта ввода-вывода в качестве входа и включить аналоговый


режим.

3. Настройте АЦП для автоматической выборки и автоматического


преобразования.

4. Очистите состояние перепадов.

5. Включите CTMU.

6. Вручную разрядите конденсатор (может потребоваться внешний


конденсатор).

7. Дождитесь прерывания АЦП (зарядка будет остановлена ребром 1 и


ребром 2).

8. Очистите прерывание АЦП.

9. Считайте результат АЦП.

10. Вручную разрядите конденсатор (может потребоваться внешний


конденсатор).

11. Очистите состояние перепада.

59
Код конфигурации находится в Приложении 6

Рис. 2.10. Структурная схема для измерения времени заряда

Рис. 2.11 Временные диаграммы в случае измерения времени

2.7. Генерация задержек с помощью модуля CTMU

Модуль CTMU может использоваться для создания задержек, независимых


от системных часов. Это достигается использованием CTMU в режиме генерации
времени для зарядки емкости, внутренней или внешней, и использованием
компаратора 2 для генерации события EDG2, когда напряжение конденсатора
достигает желаемого значения, установленного модулем CV REF. Импульс
запускается событием EDG1, внутренним или внешним. В этом режиме вывод
CTPLS GPIO управляется модулем CTMU и используется для генерации
импульса, ширина которого равна времени задержки. При желании прерывание

60
компаратора 2 может быть включено для информирования программного
обеспечения о том, что был сгенерирован импульс. Для правильной работы
событие EDG1 должно быть неактивным до того, как произойдёт событие EDG2.
См. рис. 2.12. и рис. 2.13.

Комбинация выбора эталона компаратора, текущего диапазона и значения


емкости используется для создания желаемого периода задержки. Ширина
импульса задержки вычисляется по формуле 2.10., где I известно из калибровки
источника тока, а V - опорное входное напряжение компаратора.

C SYSTEM
T V (2.10)
I

Измерение времени осуществляется с помощью следующих шагов:

1. Настройте CTMU для режима генерации времени (TGEN = 1).

2. Настройте ссылку компаратора.

3. Настройте компаратор.

4. Настройка порта ввода-вывода в качестве входа и включить аналоговый


режим.

5. Включите CTMU.

Код конфигурации находится в Приложении 7

61
Рис. 2.12. Структурная схема для генерации задержки

Рис. 2.13. Временные диаграммы в случае измерения задержек

62
2.8. Измерение температуры с помощью CTMU

Модуль CTMU может использоваться для измерения внутренней


температуры устройства с помощью специального внутреннего температурного
диода. При настройке для измерения температуры ток CTMU протекает через
диод. Результирующее падение напряжения на диоде затем можно измерить с
помощью АЦП и вычислить температуру.

Прямая напряжения (Vf) диода изменяется с температурой. Прямая


напряжения (Vf) диода отрицательно пропорционально температуре. Другими
словами, Vf увеличивается с понижением температуры. Измерения температуры
должны выполняться только с помощью CTMU в диапазоне токов 5,5 мкА или 55
мкА.

На рис. 2.14. показано, как этот модуль может быть использован для
измерения температуры. При повышении температуры напряжение на диоде
будет падать примерно на 1,8 мВ/1°С (для диапазона 5,5 мкА) в рабочем
диапазоне устройства (см. рис. 2.15. и уравнение 2.11.). Использование диапазона
токов 55 мкА увеличивает смещение напряжения, обеспечивая улучшение
отношения сигнал / шум. Выходное напряжение диода почти линейно по всему
заданному прибором рабочему диапазону для обоих диапазонов.

Рис. 2.14. Структурная схема измерения температуры

63
Рис. 2.15. Зависимость напряжения (по оси ординат, мВ) от температуры (по
оси абсцисс, °C) при различных значениях диапазона токов

2.8.1. Конфигурация и калибровка

Когда источник тока включён, TGEN = 0, и температурный диод выбран в


качестве аналогового входа АЦП, выход источника тока CTMU соединен с
датчиком температуры диода. Напряжение, развиваемое на диоде, доступно в
качестве входа в модуль АЦП через выделенный аналоговый входной канал,
который выбирается с помощью регистра ADxCHS .

Ниже описаны шаги, необходимые для выполнения измерения температуры:

1. Настройте и включите CTMU.

2. Настройте АЦП.

3. Начните выборку

4. Подождите, пока конденсатор зарядится.

5. Преобразуйте образец.

6. Преобразуйте отсчёты в температуру (см. уравнение 8-1).

Код конфигурации находится в Приложении 8

64
710 mV  Vизмер.
Tввнут .  , при I ист.  5.5 мкА
1 .8
(2.11.)
710 mV  Vизмер.
Tввнут .  , при I ист.  55 мкА
1.55

Точность измерения температуры может быть повышена с помощью


процесса калибровки. Для узких диапазонов измерения температуры вычисление
теоретического напряжения и сравнение его с измеренным напряжением при
известной температуре даст калибровочное смещение, которое может быть
использовано для будущих измерений.

Для широких диапазонов измерения температуры требуется измерение при


двух известных температурах,чтобы более точно рассчитать смещение. В идеале
эти измерения находятся вблизи крайних пределов желаемого диапазона
измерений. Результаты этих двух измерений сначала используются для расчета
наклона температурной кривой. Полученный наклон затем используется в
уравнении температуры для вычисления смещения (см. уравнение 2.11.). Это
смещение затем может быть добавлено или вычтено из будущих измерений.

Калибровка температуры компенсирует ток CTMU, поэтому калибровка


источника тока не требуется для калибровки температуры. Если калибровка
источника тока требуется для других применений, то калибровка температуры
должна выполняться после калибровки источника тока.

T1  T2
Крутизна 
V (t1 )  V (t2 )

Сдвиг  Т1  ( Крутизна  V (t1 )),[ В ]

V Vопорн. АЦП (2.11.)


 Кол  во битов АЦП ,
Кол  во значений АЦП 2

V
Температура   Смещение,
Крутизна

65
ГЛАВА 3 ПРИМЕРЫ УСТРОЙСТВ НА ОСНОВЕ МИКРОКОНТРОЛЛЕРА
PIC24FV16KA301

В данной главе рассматриваются примеры устройств на микроконтроллере


PIC24FV16KA301, реализованных на основе изложенной в предыдущей главе
информации о модуле CTMU. Были выбраны следующие примеры:

1. Устройство для измерения уровня жидкости

2. Устройство для измерения импеданса

Для анализа далее приводятся по каждому из устройств необходимые


теоретические сведения о принципе работы, алгоритм работы, и структурная
схема.

3.1. Устройство для измерения уровня жидкости

3.1.1. Основные сведения

Измерение времени в CTMU основано на формуле (2.9.), структурная схема


модуля для измерения времени изображена на рисунке 3.1.

Рис. 3.1. Структурная схема модуля CTMU для измерения времени

66
В данном случае, ёмкость считается по формуле (2.9.), так как она
складывается от соединений, где СAD - внутренний канал CTMU, CSTRAY -
внешний канал, а опорное напряжение зависит от количества значений АЦП
следующим образом:

VDD
V , (3.1)
Кол  во значений АЦП

Так как требуется измерить время заряда конденсатора, то для начала нужно
выразить время из формулы, описывающей изменение тока через емкость (2.1).
Так как I и C не изменяются, то можно выразить время заряда конденсатора в
виде ОДУ с разделёнными переменными 1-го порядка (2.7):

C
dt  ( )  dV (3.2.)
I

Для получения времени заряда конденсатора требуется проинтегрировать


выражение (2.7.), откуда получаем разрешение по времени CTMU в виде
формулы:

C
t ( )V  K (3.3.)
I

Принимая то, что К=0, так как конденсатор, обычно, разряжен на старте,
можно сделать вывод о том, что время пропорционально напряжению

Так как разрешающая способность, которая и определяет


инструментальную погрешность, влияет на число импульсов, способность
зависит от: внешнего источника опорного напряжения, то требуется её
увеличивать. Имеется несколько способов увеличения разрешающей способности:

 Уменьшить VDD, где VDD - опорное напряжение для АЦП


 Использовать внутренний канал CTMU, без внешних соединений, т.е.
использовать только СAD, исключая CSTRAY
 Увеличить ток CTMU, тем самым уменьшив время

67
 Увеличить разрядность АЦП, увеличив число значений

Также, важно отметить то, что с увеличением тока, а, следовательно,


увеличением разрешающей способности, уменьшается динамический диапазон,
где динамический диапазон - диапазон значений времени, который может быт
измерен в данном случае.

Рис. 3.2. Зависимость заряда емкости от напряжения АЦП

Для калибровки CTMU, в данном случае, требуется:

1) Провести первое измерение и найти заряд в течение известного времени,


t1=2*ТCY, где ТCY - частота тактовых импульсов, и V1
2) Провести второе измерение и найти заряд в течение известного времени,
t2=8*ТCY, где ТCY - частота тактовых импульсов, и V2
3) Определить крутизну в виде формулы:

(t2  t1 ) C
( ) (3.4.)
(V2  V1 ) I

4) Определить смещение вида:

C
t2  (  V2 ) (3.5.)
I

68
На рисунке наглядно показана искомая крутизна на графике зависимости
напряжения от времени, где имеются два вышеперечисленных измерения

Рис. 3.3. График зависимости напряжения от времени для расчёта крутизны

Отсюда видно, что измерение интервалов времени зависит от диапазона


измерения. Следовательно, для увеличения интервалов времени требуется
увеличить диапазон измерения. Это можно сделать, либо уменьшив ток в
формуле 2.9., либо увеличив ёмкость там же. Данные изменения уменьшают
пропускная способность, а также увеличивают период измерения, так как для
заряда ёмкости требуется больше времени.

Измерение длительных интервалов основано на комбинировании CTMU с


модулем захвата (ICAP), модулем сравнения (OCMP) или Timer1. В данном
случае, CTMU обеспечивает «точное» асинхронное измерение временных
интервалов, а другой модуль предоставляет «грубые» синхронизированные
временные интервалы на основе тактовой частоты ТCY. Общее измеренное время
является суммой «точного» и «грубого»

69
Рис. 3.4. Измерение длительных интервалов п

В качестве примера устройства, работающего с измерением времени,


рассмотрим принцип работы устройства для измерения уровня жидкости

3.1.2. Принцип построения устройства

Устройство для измерения уровня жидкости основано на методе измерения


времени отраженного сигнала. Данный метод позволяет измерять импеданс
длинной линии, используя зондирующий импульс и отраженную энергию (рис. 1).
Энергия зондирующего импульса проходит по линии передачи и когда импульс
достигает точки изменения импеданса, часть энергии отражается обратно к
источнику сигнала. Время получения отраженного сигнала определяет
электрическую длину линии связи до точки изменения импеданса и может быть
измерено по изменению напряжения (рис. 3.6.).

Схема измерения уровня жидкости методом измерения времени


отражённого сигнала (рис. 1) состоит из:

 Генератора импульса с выходным сопротивлением Ro, амплитуда импульса


Vpulse
 Линии передачи с импедансом Zo и электрической длинной To
 Нагрузочного резистора Rt, показывающий закороченную линию в конце

70
Рис. 3.5. Схема измерения уровня жидкости.

На рис. 3.6. приведена осциллограмма системы с генератором,


подключённым к линии передачи (микрополосковая линия с импедансом 50 Ом),
закороченная на конце (Rt = 0 Ом). Значения параметров для схемы приведены в
таблице:

Таблица 6
Параметры схемы Значение
Vpulse 5 [В]
Ro 50 [Ом]
Zo 50 [Ом]
Rt 0 [Ом]
To 9.5 [нс]

Рис. 3.6. Форма сигнала с закороченной линией (Rt = 0).

71
Форма сигнала в Точке А (Node A) на рис. 3.6. отображена голубой линией.
Импульс в точке А имеет амплитуду в 2 раза меньше, чем зондирующий сигнал
генератора (отображен желтым цветом). Фронт сигнала вызван отражением
сигнала от закороченной микрополосковой линии.

Time 0 (0 ns)
В момент времени Time=0 генератор импульса формирует сигнал (спад)
амплитудой Vpulse (5В). Выходное сопротивление генератора (Ro) вместе с
линией передачи образует делитель импедансов.

z0
Vnode A  V pulse  (3.6)
R0  z0

Так как Ro = Zo = 50 Ом, напряжение в точке А будет равно Vpulse /2 (в


начальный момент T= 0).

Time To (~9.5 ns)


В момент времени To импульс достигает конца линии. При Rt = 0 Ом вся энергия
отражается обратно. В точке А напряжение остается равным Vpulse/2 , потому что
отраженная энергия еще не достигла точки А.

Time 2 To (~19 ns)


В момент времени Time 2 отраженная энергия достигает точки А. Напряжение
Vnode A определяется выражением:

Rt
Vnode A  V pulse  (3.7)
R0  Rt

Vnode A = 0 при Rt = 0 Ом (что видно на рис. 2).

Из рис. 3.6. по осциллограмме можно измерить длину линии передачи. Для


микрополосковой линии номинальная задержка распространения составляет 7.3
пс/мм. Длина линии равна:

72
T
L (3.8)
7.3  10 12  2

Где L это длина линии в миллиметрах, T это время в секундах. Тогда длина линии
передачи составляет ~1301 мм.

Значение сопротивления Rt может быть определено из выражения (3.7.).

Vnode A
Rt  (3.9)
V pulse  Vnode A

Метод измерения времени отраженного сигнала позволяет охарактеризовать


линию передачи, любые изменения импеданса в линии будут приводить к
отражению энергии к источнику сигнала. Отражённый сигнал может быть
измерен и использован для определения дистанции до точки изменения
импеданса.

На рис. 3.7. отображена конструкция коаксиальной линии передачи.

Рис. 3.7. Коаксиальная линия передачи.

Импеданс коаксиальной линии:

1 0  r d
z0   ln( 0 ) (3.10)
2  0 r di

73
Где: µo - магнитная постоянная, µr - относительная магнитная проницаемость
изоляционного материала, εo - абсолютная диэлектрическая проницаемость, εr -
относительная диэлектрическая проницаемость изолятора, do - диаметр внешнего
проводника, di - диаметр внутреннего проводника

Коаксиальная линия может быть выполнена с воздушным изолятором, тогда


εr = 1. При использовании в качестве внешнего проводника стальной трубы с
диаметром 10.92 мм, а в качестве центрального проводника штыря диаметром
4.76 мм получим коаксиальную линию с импедансом 50 Ом, а выражение 3.10.
приводится к виду:

49.766
z0  (3.11)
r

Измерение уровня жидкости с помощью метода измерения времени отраженного


сигнала.

Сформированная коаксиальная линия с воздушным диэлектриком


(диэлектрическая постоянная равна 1) имеет импеданс 50 Ом. Если такую трубу
поместить в жидкость с диэлектрической постоянной больше чем 1, то импеданс
линии Zo изменится, что можно измерить. Рис. 3.8. и 3.9. демонстрируют как
будет отражаться энергия закороченной на конце линии передачи. Если линия
будет заполняться жидкостью, то будут наблюдаться два отражения: первое от
границы воздух/жидкость и второе – от конца линии.

74
Рис. 3.8. Изменение импеданса линии при заполнении жидкостью.

Измерение производится от момента формирования импульса Vpulse до


получения отражения от границы воздух-жидкость. Для разрешения по времени
3.5 пс получим разрешение по расстоянию 0.5 мм.

Рис. 3.9. Осциллограммы сигналов при измерении уровня жидкости.

75
Измеряя амплитуду отраженного сигнала можно получить информацию о типе
жидкости. Для автомобильных приложений можно определить, что в бак залито
дизельное топливо вместо бензина и предотвратить запуск двигателя. Так же
можно определить содержание этанола в бензине.

Метод TDR позволяет измерять уровень различных жидкостей:

 Полярные – вода, спирты и т.п.


 Неполярные – топливо, минеральное масло и т.п.
 Проводящие – ртуть, соленая вода и т.п.
 Непроводящие – топливо и т.п.

Для измерения методом измерения времени отраженного сигнала, необходимо


формировать импульс с быстрым спадом (крутой спад уменьшает джиттер
компаратора; если не требуется высокая разрешающая способность, то можно
минимизировать стоимость решения за счет более медленных транзисторов). Этот
импульс через линию передачи поступает на измерительный элемент (рис. 6).
Уровнемер измеряет время между зондирующим импульсом и временем прихода
отражённого сигнала от границы воздух-жидкость. На рис. 7 приведена схема
исследуемой части системы.

Микроконтроллер в уровнемере применяется для

 Управления и индикации
 Формирования зондирующего импульса
 Измерения времени прихода отраженного сигнала

76
Рис. 3.10. Схема уровнемера, построенного по методу измерения времени
отражённого сигнала (измерительной части).

Формирователь импульсов выполнен на транзисторе Q3. Когда микроконтроллер


генерирует Стартовый Импульс, то формируется быстрый спад зондирующего
сигнала. Этот сигнал поступает через R8 и С3 на микрополосковую линию и
далее на коаксиальный сенсор.

Для обеспечения разрешения по времени в 3.5пс необходима калибровка прибора,


которая осуществляется с помощью транзисторов Q4 и Q5. Для калибровки
проводятся два измерения, в которых микрополосковая линия закорачивается с
помощью Q4, а затем с Q5. Это дает две точки для вычисления коэффициента
передачи и смещения линейной передаточной функции системы.

Отражённый сигнал поступает на быстродействующий компаратор U12, который


формирует микроконтроллеру сигнал Стоп. Ширина Стопового импульса (время)
определяет расстояние до границы воздух-жидкость.

Калибровка системы осуществляется путем шунтирования линии передачи в


середине и конце микрополосковой линии (сигналы short coax middle и short coax
end). Эти два сигнала формируют отражения в точках с известным расстоянием,
что позволяет формировать Стоповые импульсы и провести калибровку системы:

77
T  Усиление  V  Смещение (3.12.)

где T это время (напрямую зависящее от расстояния), V напряжение, измеряемое


АЦП микроконтроллера

Модуль CTMU – основа измерения времени методом отраженного сигнала.

Измерение времени осуществляется модулем измерения времени заряда (Charge-


Time Measurement Unit, CTMU), работа которого управляется сигналами Старт и
Стоп. Модуль CTMU позволяет измерить ширину стопового импульса.

Модуль CTMU присутствует во многих микроконтроллерах PIC (8-, 16- и 32-


битных) и позволяет достичь измерения времени с разрешением до 3,5пс. Модуль
CTMU под управлением стартового и стопового событий заряжает емкость
постоянным током и измеряет результирующее напряжение на емкости. Таким
образом, основываясь на измерении напряжения можно измерить время между
двумя событиями (стартовым и стоповым импульсами)

78
3.2. Устройство для оценки состояния кожи человека

3.2.1. Общие сведения

Для нахождения активного сопротивления в эквивалентной электрической


схеме электропроводности кожи необходимо ко входу схемы подключить
коммутируемый источник тока и дождаться окончания переходных процессов.
Измерения проводятся с помощью АЦП в микроконтроллере (рис. 3.11.)

Рис. 3.11 Электрическая схема для нахождения полного сопротивления


кожи человека
На рисунке 3.11. изображена электрическая цепь, состоящая из источника
тока I, сопротивления ключа Rкл, сопротивления R2 - эквивалента активного
сопротивления кожи и конденсатора C1 - эквивалента реактивного сопротивления
кожи.
При помощи данной схемы определяется напряжение на резисторе R2.
Данный резистор можно рассчитать по закону Ома:
VR2
R2  (3.13.)
I R2

Для измерения реактивного сопротивления кожи человека требуется


зарядить конденсатор С1, для чего надо включить источник тока I. Так как

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).

Рис. 3.12 График заряда конденсатора в RC-цепи

По графику заряда конденсатора видно, что значение напряжения на 63% от


U соответствует постоянной времени цепи (формула 3.16.).
1
U  (1  )  R2C1 (3.16.)
e

Отсюда следует, что можно найти С1, являющуюся реактивным сопротивлением


кожи человека, зная R2 из предыдущего пункта и определив максимальное
значение зарядки конденсатора, U (формула 3.17.)

80
1
U  (1  )
C1  e (3.17.)
R2

3.2.2. Принцип построения устройства

Рассмотрим схему подключения к модулям микроконтроллера (рис. 3.13.):

Рис. 3.13. Схема подключения к модулям микроконтроллера

На данной схеме изображены блоки CTMU и АЦП. CTMU состоит из


ключа, источника тока, сопротивления ключа мультиплексора Rкл и
мультплексора. АЦП состоит из устройства выборки-хранения (УВХ),
состоящее из резистора R1, ключа и конденсатора С1, поддерживающего
напряжения при размыкании ключа. Резисторы R2 и R3 нужны для калибровки
источника тока на разные диапазоны измерений. Резистор R4 и конденсатор С2
имитируют кожу человека.

При активном сопротивлении кожного покрова в диапазоне от 1 до 10


кОм оптимально выбрать амплитуду источника тока 550 мкА, в диапазоне от 10
до 100 кОм - 55 мкА, в диапазоне 100..1000 кОм амплитуду 5.5 мкА, в
диапазоне 1..10 МОм амплитуду 0.55 мкА.

81
Далее рассмотрим конфигурацию данного устройства. Осциллятор
работает на частоте 32 МГц. Модуль CTMU настроен на амплитуду источника
тока 55 мкА:

CTMUICONbits.IRNG = 3

Модуль АЦП работает с периодом дискретизации = 15 мкс и выбран 12-


битный режим работы:

AD1CON1bits.MODE12 = 1.

Опорное напряжение АЦП 4.096 В:

AD1CON2bits.PVCFG = 3.

В приложении 9 приведена конфигурация модулей для данного


микроконтроллера

Алгоритм работы устройства:

1) Перед измерением проводится калибровка источника тока на


разные диапазоны измерений

2) Импульсы тока подаются на R4 и C2. Для этого требуется дождаться


окончания переходных процессов и полной зарядки конденсатора C2, для чего
берётся производная между двумя точками. Такой процесс является
завершённым, когда разница между данными двумя точками меньше 1%

Измеряется напряжение на резисторе R4, такое же напряжение будет на C2.


Если оно будет меньше 1 В или больше 4 В , то меняется амплитуда импульсов
тока, а, следовательно, выбирается другой диапазон измерений

3) Мультиплексор переводится в положение 2 для разрядки


конденсатора C2

82
4) Если напряжение на резисторе R4 вышло за установленные пределы,
то проводится повторная подача импульсов тока с другой амплитудой. Если же
напряжение не вышло за пределы, то производится повторная подача
импульсов тока для установления времени, при котором C2 зарядится на 63.2%
от полного заряда конденсатора

5) Производится расчёт импеданса

83
ЗАКЛЮЧЕНИЕ

В результате выполненной работы были изучены общие теоретические


принципы работы микроконтроллера PIC24FV16KA301 и рассмотрены
стандарты, на которых возможно построение различных устройств,
оценивающих и измеряющих физические параметры

На этапе исследования микроконтроллера были рассмотрены три


различных периферийных устройства, показана их работа и их конфигурация.

На этапе исследования модуля CTMU была исследована его калибровка, с


помощью данного производителем кода, а также были рассмотрены подробно
различные варианты его использования, например, для измерения ёмкости и
времени

Также были рассмотрены алгоритмы различных готовых устройств с


применением модуля CTMU для решения различных задач, например,
измерителя уровня жидкости и устройства, оценивающего состояние кожных
покровов человека

По результатам проведённого исследования можно подвести итоги:


данный микроконтроллер отлично подходит для создания дешёвого устройства
для измерения температуры, времени, ёмкости, сопротивления. Но по нему
почти отсутствует техническая литература на русском языке, а, следовательно,
для создания устройств на нем требуется средний уровень знания английского
языка.

84
СПИСОК ЛИТЕРАТУРЫ

1. Техническое описание для семейства микроконтроллеров PIC24FV32KA304 -


США, Microchip Technology Inc. 2011-2017, DS30009995E

2. Charge Time Measurement Unit (CTMU) and CTMU Operation with Threshold
Detect - США, Microchip Technology Inc. 2011-2016, DS30009743B

3. PIC24F Family Reference Manual - США, Microchip Technology Inc. 2006,


DS39704A

4. Воронин Д.А., Импедансный метод оценки состояния кожных покровов


человека при помощи микроконтроллера PIC24FV16KA301, 2019, НИУ МЭИ

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).

6. Применение модуля измерения времени заряда CTMU


URL: http://gamma.spb.ru/novosti-proizvoditelej/microchip/stati-microchip/84-
primenenie-modulya-izmereniya-vremeni-zaryada-ctmu

7. Измерение уровня жидкости с помощью отраженного сигнала


URL: http://gamma.spb.ru/novosti-proizvoditelej/microchip/stati-microchip/188-
izmerenie-urovnya-zhidkosti-s-pomoshchyu-otrazhennogo-signala

85
ПРИЛОЖЕНИЯ

Приложение 1. Код конфигурации модулей микроконтроллера для работы


со значениями тока из низкого диапазона значений

#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