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