Skip to content

Latest commit

 

History

History
96 lines (63 loc) · 11.6 KB

File metadata and controls

96 lines (63 loc) · 11.6 KB

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

В файле 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 всего две кнопки, поэтому измерения запускаются по таймеру.