Сигма-дельта АЦП с разрядностью 16 бит в микроконтроллерах серии STM32F37х
Новая линейка микроконтроллеров STM32F3хx интересна наличием 16 битного сигма-дельта АЦП с частотой преобразования до 50 кГц.
К сожалению отладочная плата STM32F3-Discovery выполнена на микроконтроллере STM32F30x, который не содержат в своем составе данного АЦП.
Вообще получилась интересная ситуации либо мы имеет 16 битный АЦП + 12 битный АЦП с частотой преобразования до 1 МГц (STM32F37x), либо не имеем 16 битного АЦП, но имеем 12 битный АЦП с частотой преобразования до 5 МГц (STM32F30x). Будем надеется, что появиться микроконтроллер с 16 битным АЦП и скоростным 12 битным.
Сигма-дельта АЦП
Рассказывать о принципе работы сигма-дельта АЦП не буду, материала по данной теме в сети море, кратко опишу о его возможностях в данной реализации.
АЦП имеет 5 дифференциальных (симметричных) входов, которые могут использоваться как несимметричные (9 шт.)
Настройка входных каналов независимая, поэтому можно использовать их различные комбинации (симметричные + несимметричные).
Для большей наглядности, полностью не симметричный режим:
Дифференциальный режим:
и их комбинация (одна из возможных):
АЦП имеет входной усилитель с программируемым коэффициентом усиления от 0,5 до 32.
(Пока не забыл: для текущий ревизии в одном из несимметричных режимов усилитель работает не корректно при коэффициентах 16 и 32, см. листок ошибок STM32F37xxx STM32F383xx - Errata sheet)
Максимальная частота преобразований 50 кГц реализуется при работе АЦП на один вход, при обработки нескольких входов максимальная частота преобразований уже 16,6 кГц.
В связи с разнообразием настроек (режимы работы входов, усиление) были реализованы три конфигурационных ячейки, в каждую из них можно записать одну из возможных комбинаций, следующих параметров АЦП:
- коэффициент усиления входного сигнала
- дифференциальный или несимметричный режим
- смещение
Каждому входному каналу АЦП можно (нужно) сопоставить одну из конфигурационных ячеек, чтобы переключение между различными режимами работы происходило автоматически.
Можно выбрать различные источники опорного напряжения АЦП:
- внутренний источник напряжением 1,8 В или 1,2 В
- опорное напряжение равно аналоговому питанию АЦП
- внешний источник опорного напряжения от 1,1 В до аналогового напряжения питания АЦП
Запуск преобразований могут осуществлять следующие источники:
- программный запуск
- внутренние таймеры
- внешние события
- при наличии более, чем одного модуля АЦП в микроконтроллере первый модуль может быть ведущим для остальных, т.е. все модули будут запускать преобразования синхронно с первым
Для автоматизации результаты преобразований можно “забирать” посредством модуля ПДП (DMA).
Ну и последнее, что стоит отметить это три энергосберегающих режима работы:
- режим медленного преобразования (в этом режиме максимальные частоты преобразования 12 и 4 кГц)
- режим ожидания
- АЦП выключено
Функциональная схема модуля АЦП:
Пример
В наличии у меня “своя” плата с микроконтроллером STM32F373R8.
Инициализировать все узлы микроконтроллера я уже привык при помощи библиотеки от производителя:
STM32F37x DSP and standard peripherals library (скачать)
В примерах от производителя идущих в комплекте со стандартной библиотекой на текущий момент нет примеров по использованию АЦП совместно с ПДП (DMA), поэтому интереснее рассмотреть именно такой режим.
Обозначим задачу:
- последовательное преобразование 4-ёх несимметричных каналов
- фиксированная частота преобразований (запуск от таймера) 400 Гц
- результаты преобразования “забирать” посредством модуля ПДП (DMA)
Последовательность действий для настройки АЦП:
- включить аналоговое питание
- разрешить тактирование модуля и выбрать тактовую частоту
- выбрать источник опорного напряжения
- выбрать режим работы преобразований (быстрый - медленный)
- включить АЦП
- войти в режим инициализации
- настроить необходимый режим работы
- выйти из режима инициализации
Всё выше сказанное в коде:
Примечание: ожидания нужно сделать с таймаутами.
Далее настраиваем контроллер ПДП:
И таймер, для запуска преобразований:
В обработчике прерываний по заполнению половины и полного буфера обрабатываем данные:
Не забываем переводить линии ввода-вывода в аналоговый режим.
Проект целиком не привожу, ещё не все реализовал как хотел.
Документация
RM0313: STM32F37xx and STM32F38xx advanced ARM-based 32-bit MCUs
comments powered by Disqus