Skip to content
Branch: master
Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
..
Failed to load latest commit information.
VC1
VE1
VE3
VE4
VE91
VE92
VE93
VK214
VK234
src
ADC_Test.uvmpw
ReadMe.md

ReadMe.md

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

В файле ADC_cfg.c выбираются сигналы в массиве _UsedSignals[], которые будут измеряться в тесте. Можно выбрать любые, но если выводы АЦП совмещены с LCD экраном или кнопками, то пример может перестать работать. Поэтому при выборе других сигналов необходимо ориентироватья на описание ресурсов платы в файлах типа MBRD_1986VExx.h.

Сигналы термосенсора требуют включения усилителя, что видимо требует отключения на время измерения обычных сигналов с выводов GPIO. По крайней мере я это понял так, поэтому при переключении сигналов по маске сигналы от термосенсора не выбираются для измерения.

Сигналы от термосенсора и от внешних выводов объединены в один тип MDR_ADC_Signal. Это упрощает запуск измерения сигналов, все необходимое библиотека дальше делает сама.

Используемые кнопки: UP - Смена текущего теста. RIGHT - Смена измеряемого сигнала DOWN - Запуск измерения LEFT - Запуск/остановка измерений по системному таймеру, вместо ручного запуска по кнопке DOWN.

Результат выводится на LCD экран.

Тесты:

  • Циклический запуск измерений одного канала - отображается C_ADC1 или C_ADC2 с номером канала Ch=x.
  • Циклический запуск измерений каналов заданных маской - отображается C_ADC1 или C_ADC2 с номером канала Sel=x.
  • Одиночный запуск измерений одного канала - отображается М_ADC1 или М_ADC2 с номером канала Ch=x.
  • Циклический запуск измерений каналов заданных маской - отображается C_ADC1 или C_ADC2 с номером канала Sel=x. Номер канала аппаратно инкрементируется с каждым запуском.
  • Синхронное одиночное измерение одного канала - отображается S_ADC12 с номером канала Ch=x.
  • Синхронное одиночное измерение каналов заданных маской - отображается S_ADC12 с номером канала Sel=x. Номер канала аппаратно инкрементируется с каждым запуском.

Инициализация

Все настройки АЦП поделены на опции, одна из которых является обязательной для каждого АЦП, того чтобы он мог измерять - MDR_ADCx_CfgBase. Остальные опции могут подключаться или отключаться раскрывая дополнительные возможности измерений. Настройки опций сведены в структуры, которые объединены в общую структуру инициализации MDR_ADC_Config которая используется при инициализации блока функцией MDR_ADC_Init().

Итого, для инициализации блока АЦП необходимо вызвать:

  • MDR_ADC_Init(const MDR_ADC_Config *cfg), для инициализации все указанных в cfg опциях.
  • MDR_ADC_PinsInitByMask(port, pinMask), для инициализации выводов в аналоговую функцию.

В структуре MDR_ADC_Config опции подключаются указателями на структуры параметров этих опций. Если указатель NULL то опция не активна. Включить с настройкой или выключить опцияю после инициализации можно функциями Clear, Apply, Change см файл MDR_ADC.h. Дополнительные опции задаются в структурах:

  • MDR_ADC_CfgThermo - использование термосенсора. Должна быть включена при измерении сигналов термосенсора и при использовании опоры от термосенсора!
  • MDR_ADCx_CfgIRQ - разрешение прерываний по готовности результата и по выходу за предел уровня сигнала.
  • MDR_ADC_CfgSync - синхронное измерение АЦП1 и АЦП2.
  • MDR_ADCx_CfgLimits - отслеживание выхода сигнала за мин. и макс. уровни.

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

Маски для настройки выводов GPIO высчитываются в этом файле ADC_Cfg.с из массива выбраных сигналов _UsedSignals[]. Это сделано для удобства задачи настроек одним только массивом _UsedSignals[]. В реальных приложениях проще маски сигналов и пинов задать напрямую.

По умолчанию измерения АЦП выполняются от частоты CPU заданной с делителем в обязательной структуре MDR_ADCx_CfgBase. Для измерении от ADC_CLK в файле ADC_Cfg.h необходимо задать глобальное макроопределение USE_ADC_CLOCK = 1, тогда все тесты будут использовать частоту ADC_CLK. В каждом тесте есть отдельное определение USE_ADC_CLOCK, которое используется для выбора частоты для текущего теста, если глобальное определение USE_ADC_CLOCK в ADC_Cfg.h закомментировано.

Запуск измерений

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

  • MDR_ADC_StartSignal(ADCx, signal, cyclic, *cfgLims) - запуск конкретного канала для измерения АЦП1 или АЦП2, с опциями непрерывных измерений и возможностью отработки лимитов.
  • MDR_ADC_StartSelected(ADCx, channelSelected, cyclic, *cfgLims) - запуск с переключением каналов с выводов заданных маской. Может быть непрерывным и с ограничением уровней одинаковым под все сигналы.
  • MDR_ADC_StartNextGo(ADCx) - если запуски были на одиночное измерение (cyclic = false), то следующий запсук можно повтороить выставив бит GO.

Эти функции только запускают измерение, результат необходимо ожидать по флагу готовности в регистре статуса:

  • MDR_ADC_Status MDR_ADC_GetStatus(ADCx) - Вернуть статус
  • MDR_ADC_Result MDR_ADC_WaitAndGetResult(ADCx) - Дождаться готовности и вернуть результат измерений

Все целиком - запуск, ожидание и получение результата делают функции:

  • MDR_ADC_Result MDR_ADC_MeasSignalValue(ADCx, signal, *cfgLims) - первичный запуск
  • MDR_ADC_Result MDR_ADC_MeasNextValue(ADCx) - повтор предыдущего запуска. Работает быстрее, т.к. запуск происходит битом GO.

Синхронные измерения реализуют функции:

  • void MDR_ADC_StartSignalSyncro(signalADC1, signalADC2, cyclic, *cfgLimsADC1, *cfgLimsADC2) - запуск измерения по одному каналу для каждого АЦП
  • void MDR_ADC_StartSelectedSyncro(channelsADC1, channelsADC2, cyclic, *cfgLimsADC1, *cfgLimsADC2) - запуск измерений маской MDR_ADC_StartNextGoSyncro() - повтор, если запуск был с cyclic = false.

Особенности поведения

В 1901ВЦ1Т и 1986ВЕ9х выводы JTAG_B делят выводы PORT_D с каналами ADC_ch0 - ADC_ch4. Поэтому проект необходимо запускать с Jtag_A.

При синхронном измерении выставление битов GO и ADON в ADC2_Cfg не приводят к запуску измерений, пока не будет произведен запуск этими же битами в ADC1_Cfg.

Сигналы термосенсора измеряются только АЦП1!

1986ВЕ93У - Установить джампера Х31,Х33 (в углу между Jtag_B - МК - LCD) - чтобы работали кнопки!

1986ВЕ1Т - Чтобы снимать напряжение с подстроечного резистора R14 необходимо установить джампер PD9-R14. (Между МК и подстроечным резистором R14, рядом с часовым кварцем)

1986ВЕ3Т - У меня все сигналы показывали 0xFFF. Но если в BNC воткнуть простую булавку, то на сигнале появляется шум. Что говорит о том, что сигнал измеряется. Если другим пальцем коснуться земли, то сигнал спадает ближе к нулевым значениям. Напрямую замыкать вход на землю НЕЛЬЗЯ, говорят сгорит.

1984ВЕ4 - резистор (CMP) подключен сразу к двум каналам АЦП ch2 и ch7. Регулируя резистор видно изменяющееся значение с АЦП.

1984ВК214/234 - На LCD экран по попеременно выводятся:

  • регистры STATUS и ADC1_Cfg
  • номер канала и значение канала

UP - переключает тест, RIGHT - меняет номер измеряемого канала. При смене теста выводится:

  • С01 - тест ADC_CyclicOne и номер канала
  • СF1 - тест ADC_CyclicSel и маска выбраных каналов
  • B01 - тест ADC_ManualOne и номер канала
  • BF1 - тест ADC_ManualSel и маска выбраных каналов

В 1984ВК214 всего две кнопки, поэтому измерения запускаются по таймеру.

You can’t perform that action at this time.