Использование встроенного в Altera MAX10 АЦП

altera max10 adc block
Микросхемы ПЛИС серии MAX10 компании Альтера имеют встроенный Аналогово-Цифровой Преобразователь, АЦП. Это довольно интересно, так как совместить в микросхеме цифровую и аналоговые части не очень просто. С другой стороны, получившееся техническое решение лично мне кажется каким-то немного странным, не совсем продуманным и не очень логичным. Взять хотя бы такой факт, что макcимальная частота оцифровки для MAX10 составляет всего 1МГц. Вот казалось бы - ПЛИС - это технология предназначенная для обработки больших массивов данных, скоростных потоков информации. Но что такое 1МГц для ПЛИС? Как-то маловато будет. Вот было бы 50МГц или 100МГц - вот было бы круто.. Но видимо сделать это совсем не просто.. Так что имеем то, что имеем - 1МГц.

Попробуем все же посмотреть, как можно использовать АЦП в нашей плате Марсоход3 / Марсоход3bis..

На самом деле в ассортименте микросхем серии МАХ10 есть ПЛИС с разными концигурациями АЦП. Согласно документации на чипы MAX10 (https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/max-10/ug_m10_adc.pdf) в микросхемах корпуса E144 присутствуют 1 выделенный канал (dedicated ADC channel) и 8 каналов двойного назначения (dual purpose):

max10 adc variants

Таким образом, теоретически, в наших микросхемах 9 входов могут быть использованы для оцифровки входных сигналов. Частота оцифровки естественно делится между каналами. То есть, если нужно 2 канала, то максимальная частота оцифровки на канале будет уже не 1МГц, а 500КГц...

Есть еще странность, с которой я столкнулся и никак не смог разрешить.. Предположим, мне не нужны 9 каналов и я хочу использовать только один входной канал, тот, который называется dedicated ANAIN signal. Похоже, что оставшиеся 8 каналов я не могу использовать в качестве обычных цифровых входов или выходов.. По крайней мере я не смог этого сделать.. В документации есть вот такое странное:

strange

Это значит, что в моем проекте для платы Марсоход3 при использовании АЦП я не смогу использовать выходы FTC[7..0] как цифровые сигналы. И это печально.

Ладно, попробую все таки сделать проект с АЦП для платы Марсоход3.
Вход АЦП микросхемы MAX10 выведен на контакт 1 разъема CN2, разъем для шилдов.

potenc

Разъем для шилдов одинаковый и у платы Марсоход2 с микросхемой Cyclone_III. Вот только в циклонах нет встроенного АЦП, поэтому на плате Марсоход2 у нас стоит внешний преобразователь.

Я подключаю к входу АЦП просто переменный резистор, который будет регулировать от нуля до VCC +3,3V.

MAX10 Marsohod3 board with resistor on ADC input

Переменный резистор подключили, теперь займусь проектом Altera Quartus II для платы Марсоход3. За основу проекта беру мой перый проект со светодиодами.

Дальше идув пункт меню Tools => IP Catalog, появляется библиотека компонентов.
Выбираем Library => Processors and Peripherals => Peripherals => Altera Modular ADC Core

Появляется QSYS IP Parameter Editor.

new ip variation

Придумываем имя будущему модулю, например "myadc".

generate adc ip

Задаем параметры. Тут собственно важный параметр - это Core Variant. Возможен вариант с модулем на шине Avalon для использования совместно с процессором. Я же выбираю самый простой вариант - ADC Control Core Only. Еще есть место, где выбираем нужные нам каналы, но это не очень важно пока.
Просто нажимаю в правом нижнем углу Generate (потом опять Generate в следующем окне) и появляются сгенерированные файлы:

generate success

Тут программа Quartus II Qsys создала много разных файлов, из этих всех я, для упрощения проекта, выбираю файл с модулем самого низкого уровня. Открываю файл myadc/synthesis/fiftyfivenm_adcblock_top_wrapper.v.

Из модуля Verilog делаю компонент схемы через меню File => Create / Update => Create Symbol Files for Current File.
Этот новый компонент со странным именем fiftyfivenm_adcblock_top_wrapper устанавливаю на схему проекта. На самом деле, конечно, у модуля есть управляющие сигналы, можно запускать и останавливать оцифровку сигналом "soc" (Start Of Conversion), можно передавать в модуль номер канала, с которого нужно оцифровывать. Я этого делать не буду - ведь я использую только один канал? Значит как-то так:

sch quartus adc

 

Выход АЦП 12 разрядов. Я 8 старших разрядов adcout[11..4] просто подключаю к светодиодам платы LED[7..0].
На модуль подаю 1МГц с PLL, в параметрах модуля стоит делитель 1. Сигнал soc устанавливаю в единицу, номер канала фиксирую константой "ноль" - использую только dedicated сигнал ANAIN. Есть еще в параметрах модуля маска используемых каналов. Честно говоря я не понял, как это работает. У меня АЦП работает при любых значениях маски каналов analog_input_pin_mask - это просто загадка для меня.

Да, еще, конечно, нужно удалить назначения для пинов FTC[7..0] из проекта. Это делается в Assignment Editor. Пины FTC не получается использовать, когда АЦП работает.

Компилирую, загружаю проект в ПЛИС MAX10. Кручу ручку переменного резистора и вижу, как меняется значение на светодиодах.

Работает!

Кроме входов микросхемы к АЦП можно подключить еще внутренний температурный датчик микросхемы MAX10. Чтобы он заработал нужно выбрать номер канала 17 и подать на модуль АЦП частоту пониже. Я поставил делитель 5:

sch quartus tsens

Компилирую, загружаю проект в ПЛИС MAX10. Теперь не кручу ручку переменного резистора, но нагреваю микросхему паяльником.

К сожалению, на этом видео не очень видно как меняется яркость светодиодов.. Сперва отображается 0xE0, потом грею микросхему MAX10 и вижу на светодиодах получается 0xCF.

Получается интересно. Чем больше грею чип, тем меньше число отображается на светодиодах. Но похоже это нормально - в документации на MAX10 приведена таблица соответствия значений АЦП к градусам температуры. И тут видно, что зависимость обратная, чем выше температура, тем меньше значение получено из АЦП... В общем - работает!

Мой проект можно взять здесь: 


Документация на АЦП микросхемы MAX10: https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/max-10/ug_m10_adc.pdf
Другая полезная статья о точности АЦП микросхемы MAX10: https://akpc806a.wordpress.com/2015/04/06/adc-accuracy-test-in-altera-max-10-fpga/

 


Добавить комментарий