12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204

Просмотров: 683


Введение.

12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении ряда аппаратных функций для гибкой конфигурации. Эта версия модуля расширяет функциональность, обеспечивая 12-битное разрешение, более широкий диапазон параметров автоматической выборки, более тесную интеграцию с другими аналоговыми модулями, такими как CTMU и настраиваемый буфер результатов. Этот модуль также включает уникальную функцию обнаружения пороговых значений, которая позволяет самому модулю принимать простые решения на основе результатов преобразования.
Как и ранее, внутренний усилитель Sample-and-Hold (S/H) получает образец входного сигнала, а затем сохраняет это значение для процесса преобразования. Комбинацией входных мультиплексоров выбирается сигнал, который должен быть преобразован (до 32 аналоговых входов), как внешних (аналоговых входных контактов), так и внутренних (например, внутрисхемные источники опорного напряжение и другие аналоговые модули). Весь тракт мультиплексора включает положения для дифференциального аналогового входа, хотя с ограниченным числом отрицательных входных контактов. Выборка напряжение удерживается и преобразуется в цифровое значение, которое строго говоря, представляет собой отношение этого входного напряжения к опорному напряжению. Варианты конфигурации позволяют подключать внешний источник или использовать шину питания и общий устройства (AVDD и AVSS). Входы эталонного и входного сигнал назначается по-разному в зависимости от конкретного устройства.
Массивы выбора времени и управления позволяет пользователю создавать гибкие последовательности сканирования. Преобразование можно запускать индивидуально с помощью программного управления, непрерывно работающего или запускаемого выбранными аппаратными событиями. Один канал может быть повторно преобразован. Альтернативные преобразования могут выполняться по двум каналам, или любой или все каналы могут последовательно сканироваться и преобразовываться в соответствии с пользовательской битовой картой. Результирующий результат преобразования – это 12-разрядное цифровое число, которое может быть со знаком или без знака, сдвинуто влево или вправо. (В некоторых устройствах доступно доступное пользователю разрешение 10 бит, а в других устройствах доступно только 12-разрядное разрешение).
Результат преобразования автоматически сохраняется в выделенном буфере, что позволяет делать несколько последовательных чтений до того, как потребуется обработка программным обеспечением. Буфер может быть сконфигурирован для работы в качестве буфера FIFO или в качестве буфера с индексированным каналом. В режиме FIFO буфер можно разделить на два равных раздела для одновременного преобразования и операций чтения. В режиме индексирования буфер может использовать функцию «Пороговое сканирование», чтобы определить, соответствует ли преобразование определенным, определяемым пользователем, критериям, сохранению или отбрасывания преобразованного значения, а затем устанавливать флаги семафора для обозначения события. Это позволяет совершать конверсии в режимах с низким энергопотреблением, когда ЦП неактивен, пробуждая устройство только при возникновении особых условий.
Модуль устанавливает свой флаг прерывания после выбора количества преобразований, когда буфера можно прочитать или после успешного сравнения пороговых значений. После прерывания последовательность перезапускается с начала буфера. Когда флаг прерывания установлен, в соответствии с более ранним выбором, параметры сканирования и указатель буфера вывода возвращаются в исходные позиции.

Внимание: АЦП в режиме THRESHOLD DETECT в этом варианте я описывать не буду.

Упрощенная блок-схема модуля


Задача 1

Один вход AN0, 12 бит, ручной запуск сканирования, автоматическая выборка. Выполняем 16 измерений и вычисляем среднее. Данные записываются в буфер ADC1BUF. потом из него они извлекаются и усредняются.

Навастриваем порт PORTA0 как аналоговый (AN0):

Конфигурируем АЦП, включить модуль, актируем от главного генератора, выбираем 12 бит. АЦП дифференциальный, поэтому отрицательный вход подключаем к общему (AVSS), Преобразование настраиваем на внутренний счетчик и автоматический выбор и преобразование, выравнивание правое выравнивание целое положительное. Входы для источников опорных напряжений подключаем соответственно к AVVD и AVSS.

 

Нам надо сделать 16 измерений и установить флаг прерывания (только флаг IFS0bits.AD1IF) извлечь информацию из буфера и вычислить среднее значения (арифметическая фильтрация сигнала). Переключаемся в расширенные настройки в регистре AD1CON2 выберем формирование прерывания после 16 измерений:

Незабываем выполнить генерацию MCC

В главном файле проекте, добавим переменные

uint16_t ADCValue, count;
uint16_t *ADC16Ptr;

А основной цикл может быть выглядеть следующим образом:

while(1)                        // повторять непрерывно
{
    ClrWdt();                   // сброс сторожевого таймера
	ADCValue = 0;				// очистить значение
	ADC16Ptr = (uint16_t *)&ADC1BUF0;		// инициализировать указатель ADC1BUF
	IFS0bits.AD1IF = 0;			// очистить флаг прерывания АЦП
	AD1CON1bits.ASAM = 1;		// автоматическая выборка для 31Tad
								// затем переходим к преобразованию
	while (!IFS0bits.AD1IF){};	// конверсия выполнена?
	AD1CON1bits.ASAM = 0;		// yes, тогда остановите sample/convert

	for (count = 0; count < 16; count++)    // среднее значение 16 АЦП
	{                                       // 
		ADCValue = ADCValue + *ADC16Ptr++;  // 
	}                                       // 
	ADCValue = ADCValue >> 4;               // 
    
//    bin_dec ( ADC1BUF0/16, 0,  0,  0);
    bin_dec ( ADCValue/16, 0,  0,  0);  // для индикации параметра
} // повторение

Как выбрать оптимальные настройки для ADC Clock?

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

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

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

В нашем варианте есть два источника тактовой частоты для АЦП:

  1. От основного генератора FOSC/2 
  2. От встроенного RC генератора АЦП.

Встроенный генератор необходим если измерение надо выполнять в спящем режиме и естественно работа от него самая медленная. Сразу скажу так если вы выбрали встроенный генератора и самое большое время выборки (Acquisition Time) и у вас показания (в тестовом режиме, как это будет описано ниже) нестабильны, проблема со схемотехникой, смотрите разводку и качество питания.

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

Сконфигурировали АЦП (под свои требования), подключили вход к источнику опорного напряжения (+), циклически – читаем значение. В таком варианте для 10 битного АЦП должно быть число 2^10 = 1024-1 = 1023, для 12 битного – число 2^12=4096-1=4095. И каждый раз полученное значение сравниваем с новым. Если значение постоянно стабильно, на значительном промежутке времени (с промежутком тут у каждого своё) значит все ок. Если не стабильно.

Первое когда выставляем делитель

проверяем, что-бы MCC не выдавал такое сообщение

Это значит, что это слишком быстро для АЦП и этот параметр надо увеличить, например так

Далее выбираем время выборки максимальное 31 и выполняем тестирование. Если параметр стабилен, но вам надо “побыстрее” уменьшаем в половину время выборки и повторяем тестирование. В общем таким образом пока не найдем оптимальное значение между скоростью и надежностью. Если вы заметили, то у меня на картинках используется два канала. В этом варианте я тестирую таким образом, смотрю на стабильность параметра на канале 0 и проверяю когда канал 1 подключен к + опорному, а потом – опорному и если параметр на входе 0 стабильны, то выбранные значения оптимальны.

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

Для моего устройства с 2 каналами я получил такие значения:

Сама процедура была такая, увеличил выборку до максимума – нестабильно, начал увеличивать делитель пока не получил стабильные показания, потом уменьшил выборку до приемлемого значения. Во время проверки я проверял, что при значении на входе 0 -максимального напряжения, а на входе 1 минимального, параметр контролируемый по входам не изменялся. Т.е. при переключении коммутатор каналов, перезарядка входного конденсатора выполнялась полностью.


Задача 2

Два входа, автосканирование. Т.е. модуль АЦП должен автоматически сканировать два входа и данные записывать в буфера.

Менеджере выводов укажем, что у нас 2 входа:

Переключившись на модуль выводов мы может это проконтролировать.

Мы настроили аналоговый входы AN0 и AN1 (RA0 и RA1).Переключимся на модуль АЦП и изменим настройки.

с такой настройкой при запуске, данные измерений помещаются в буфер, последовательно с измерениями. Если параметр SMPI регистра AD1CON2 установить на Interrupts at the completion of conversion for each 4st sample – это значит, что АЦП выполнит 4 измерения и только после этого сформируется флаг прерывания, но при это в буфере данные измерений будут расположены следующим образом:

Буфер Содержимое буфера
ADC1BUF0 AN0, Sample 1
ADC1BUF1 AN1, Sample 2
ADC1BUF2 AN0, Sample 3
ADC1BUF3 AN1, Sample 4
ADC1BUF4
ADC1BUF5
ADC1BUF6
ADC1BUF7
ADC1BUF8
ADC1BUF9
ADC1BUFA
ADC1BUFB
ADC1BUFC
ADC1BUFD
ADC1BUFE
ADC1BUFF

 

После чего указатель вернется в начало буфера и измерения повторятся. Если параметр установить на Interrupts at the completion of conversion for each 8st sample – это значит, что АЦП выполнит 8 измерения и только после этого сформируется флаг прерывания, но при это в буфере данные измерений будут расположены следующим образом:

Буфер Содержимое буфера
ADC1BUF0 AN0, Sample 1
ADC1BUF1 AN1, Sample 2
ADC1BUF2 AN0, Sample 3
ADC1BUF3 AN1, Sample 4
ADC1BUF4 AN0, Sample 5
ADC1BUF5 AN1, Sample 6
ADC1BUF6 AN0, Sample 7
ADC1BUF7 AN1, Sample 8
ADC1BUF8
ADC1BUF9
ADC1BUFA
ADC1BUFB
ADC1BUFC
ADC1BUFD
ADC1BUFE
ADC1BUFF

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

Т.е. Если вы настроите АЦП через МСС, то достаточно будет, только извлекать данные их буфера для получения информацию о состоянии аналоговых входов.

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

while(1)                        // повторять непрерывно
{
    ClrWdt();                   // сброс сторожевого таймера

    
	IFS0bits.AD1IF = 0;			// очистить флаг прерывания АЦП
    AD1CON1bits.ASAM = 1;		// начать автоматическое измерение
	while (!IFS0bits.AD1IF){};	// ожидать окончания
	AD1CON1bits.ASAM = 0;		// остановите sample/convert

    // тут выполнить обработку 

    
    bin_dec ( ADC1BUF5/16, 0,  0,  0);  // для индикации параметра

} // повторение

Биты SMPI при использовании сканирования каналов определяют сколько каналов будет загружаться в буфер. Если в сканировании у нас 2 канала выбираем Interrupts at the completion of the conversion for every other sample, если три канала в сканировании Interrupts at the completion of the conversion for each 3st sample... если 5 каналов Interrupts at the completion of the conversion for each 5st sample. Каналы сканируются по своим аналоговым именам, например, AN0, AN1, AN4, по нарастанию, в буфере данные будут расположены следующим образом.

Канал Буфер
AN0 ADC1BUF0
AN1 ADC1BUF1
AN4 ADC1BUF2
ADC1BUF3
ADC1BUF4

При малом количестве одновременно используемых каналов, данные можно расположить в имеющемся буфере АЦП и даже вычислить среднее значение. Но это очень эффективно когда у нас один канал, мы можем выполнить до 16 измерений и потом вычислить среднее значение. Для 2-3 каналов место значительно сокращается, и чередующее расположение не очень эффективно, для выполнения быстрых преобразований. Для более эффективной обработки данных надо применить механизм DMA.


ADC+DMA

В этом варианте мы не будем трогать биты управления DMA в самом АЦП, т.е. DMAEN и DMABM в регистре AD1CON1 находиться в состоянии 0 – выключен. Но это не значит, что да DMA в этом состоянии не сможет работать с АЦП. Модуль два может выполнять операции передачи данных если его запуск настроен от события прерываний от АЦП. Эти события выполняются независимо, и привязаны к настройкам битов SMPI регистра AD1CON2.

При активации канала DMA нам необходимо указать откуда читать данные (DMASRC2 <- ADC1BUFn), куда переносить данные (например, буфер в ОЗУ DMADST2 <- ADC_buf). Сказать какой размер буфера приема. Указать, что указатели при достижении окончания – перезагружаются, т.е. возвращаются в начало. Установить режим передачи – однократный без выключения канала. А также режим адресации для указателя приема и для указателя чтения – увеличение адреса. Далее источником запуска выбираем A/D Converter (DMAINT2bits.CHSEL = 0b101111). После чего включаем модуль и канал и может спокойно иметь дублирование данных в памяти.

Вариант настройки канала DMA для копирования буфера АЦП в ОЗУ.

//------------------------------------------------------------------------------
/* 
 * ADC -> memory
 * получение данных от сканирования входов
 * настройка канала DMA для копирования буфера АЦП в ОЗУ
 */
// инициализация модуля 2
void init_DMACHANNEL2 (void)        // инициализация модуля DMA ADC -> memory
{
// настройка канала 0 прием данных с UART1
// для работы с модулем UART1 прием данных  
    DMACH2bits.CHEN = 0;            // выключить канал
    // настройка указателей и счетчика
    // откуда берем данные
    DMASRC2 = (uint16_t)&ADC1BUF0;  // с регистра данных ADC
    // куда отсылаем данные
    DMADST2 = (uint16_t)&ADC_buf;   // буфер приема данных
    // количество передаваемых данных ADC -> memory
    DMACNT2 = SIZEBUFADC;            // - размер буфера приема данных
    // режим перезагрузки указателей
    DMACH2bits.RELOAD = 1;          // перезагружать
    // размер данных байт
    DMACH2bits.SIZE = 0;            // 1 = Byte (8-bit) / 0 = Word (16-bit)
    // режим передачи данных
    // 3 = режим пакетной передачи без отключения канала
    // 2 = режим пакетной передачи с отключением канала
    // 1 = режим однократный без отключения канала
    // 0 = режим однократной передачи с отключением канала
    DMACH2bits.TRMODE = 1;          // 1 = режим однократный без отключения канала
    // режим адресации
    // 3 = режим коственной адресации
    // 2 = уменьшение адреса на параметр SIZE
    // 1 = увеличение адреса на параметр SIZE
    // 0 = адрес остается неизменным
    // Режим адресации для источника
    DMACH2bits.SAMODE = 1;          // DMADSTn остается неизменным после завершения передачи
    // Режим адресации для приемника
    DMACH2bits.DAMODE = 1;          // DMADSTn увеличивается на основе бит SIZE после завершения передачи 
    // источник запуска передачи данных
    DMAINT2bits.CHSEL = 0b101111;   // 101111 A/D Converter
    
    
//    IFS1bits.DMA2IF=0;  // сбросить флаг прерывания
//    IEC1bits.DMA2IE=1;  // разрешить прерывание
//    IPC6bits.DMA2IP=5;  // приоритета
//    IFS1bits.DMA2IF=0;
//     включить канал
    DMACH2bits.CHEN = 1;          // включить канал
    
}
//------------------------------------------------------------------------------

Просто получить копию буфера АЦП в ОЗУ может пригодиться но не решает предварительную задачу по фильтрации сигнала, например, когда необходимо получить несколько измерений и найти среднее значение. Для это воспользуемся расширенным режимом для работы с каналом DMA.


Некоторые дополнения.

Задача такая: настроить работу модуля для чтения 5 аналоговых входов с применение механизма DMA. ADC работает в автоматическом режиме сканирует 5 аналоговых входов и через ДМА собрает данные в буфера, по окончанию заполнения буферов выполняется преобразование данных и программа получает готовые данные. В нашем варианте это 4 аналоговых датчика температуры и 1 аналоговый датчик давления. Используемые входы AN0/AN1/AN2/AN6/AN7/AN9

Идем в ресурсы устройства и добавим модуль

выберем его

модуль должен быть включен

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

Включим автоматическое сканирование наших каналов

Опустимся в панель Pin Manager: Grid View активируем аналоговые входы

После выбора аналоговый входов измениться панель сканирования:

Установит птички какие каналы необходимо сканировать в автоматическом режиме.


Таблица соответствия регистра AD1CSSх и аналогового входа:

Канал
Название
Название регистра AD1CSSх
AN0 CSS0
AN1 CSS1
AN2 CSS2
AN3 CSS3
AN4 CSS4
AN5 CSS5
AN6 CSS6
AN7 CSS7
AN8 CSS8
AN9 CSS9
AN10 CSS10
AN11 CSS11
AN12 CSS12
датчик температуры CHANELL CTMU вход датчика температуры CSS13
Питание модуля CTMU CHANELL CTMU CSS14
0,5 источника опорного напряжения (0,6В) CHANELL VBG/2 CSS27
Источник опорного напряжения (1,2В) CHANELL VBG CSS28
Контроль источника питания аналоговой части CHANELL AVSS CSS29
Контроль источника питания аналоговой части CHANELL AVDD CSS30
Контроль напряжения батареи CHANELL VBAT/2 CSS31


Это может быть интересно


  • Проект с использованием MCC часть 14Проект с использованием MCC часть 14
    Просмотров: 648 С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем …
  • MPLAB X IDE – управление проектамиMPLAB X IDE – управление проектами
    Просмотров: 787 Среда  MPLAB X IDE позволяет оперативно работать с несколькими проектами, например, если у вас в работе несколько проектов: Для того чтобы переключиться достаточно выбрать другой проект: Для выбора …
  • Проект с использованием MCC часть 12-1Проект с использованием MCC часть 12-1
    Просмотров: 782 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …
  • MPLAB® Harmony – или как это просто! Часть 2.MPLAB® Harmony – или как это просто! Часть 2.
    Просмотров: 2469 Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из …
  • ch-светомузыка от теории до реализацииch-светомузыка от теории до реализации
    Просмотров: 575 Сразу оговоримся технология или теория ch-светомузыки, это постоянно развивающийся процесс и то что будет сказано сегодня завтра может быть опровергнуто и считаться ошибочным. Назовем само решение проблемы автоматического …
  • Стабилизатор тока для светодиодов SN3350Стабилизатор тока для светодиодов SN3350
    Просмотров: 2435 SN3350 ближайший аналог ZXLD1350 Как собрать готовый вариант, читайте во второй части – http://catcatcat.d-lan.dp.ua/stabilizator-toka-na-sn3350-chast-2/ 40V  драйвер светодиодов с внутренним ключом  SN3350 – импульсный понижающий преобразователь, разработанный для того, чтобы эффективно управлять одним или …
  • WiFi ESP8266 ESP-202 (ESP-12F)WiFi ESP8266 ESP-202 (ESP-12F)
    Просмотров: 7362 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …
  • Четырех канальный терморегулятор ch-4000Четырех канальный терморегулятор ch-4000
    Просмотров: 2913  Четыре независимых канала регулирования температуры, одновременно можно подключить 16 датчиков температуры DS18B20 с удалением до трехсот метров. Можно для регулировки выбрать любой датчик, подключенный к устройству. Каждый канал может работать …
  • Arduino LCD + STONE STVI056WT-01 + Strain gaugeArduino LCD + STONE STVI056WT-01 + Strain gauge
    Просмотров: 280 Author li grey email: greyli1987@outlook.com The strain assessment instrument is used to assess the degree of corresponding muscle strain by obtaining the muscle surface action potential through silver …
  • Модуль CAN в микроконтроллерах PIC18Модуль CAN в микроконтроллерах PIC18
    Просмотров: 5413 Введение   CAN последовательный интерфейс связи, который эффективно поддерживает распределенное управление в реальном масштабе времени с высокой помехозащищенностью. Протокол связи полностью определен Robert Bosch GmbH, в спецификации требований …



 

Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.