Samou4ka » 🎟 Микроконтроллеры AVR » Подключение внешнего АЦП по SPI к микроконтроллеру AVR

Подключение внешнего АЦП по SPI к микроконтроллеру AVR

Понадобилось мне тут недавно подключить к МК внешнее АЦП на 12 бит по SPI. И в этой статье решил рассказать, что из этого получилось. В первую очередь, хотелось чтобы это АЦП можно было подключить к МК в Протеусе и получить результат там. Покапавшись по интернету и посмотрев цены, остановился на 12-и битном одноканальном АЦП фирмы Microchip MCP3201. Самого MCP3201 в Протеусе нет, но есть 10-и битный MCP3001. Отличается он от MCP3201 лишь тем, что он 10-ти битный и поэтому есть небольшое отличие в обработке уже полученных данных, а получать с него данные также как с 12-и битного. Но обо всем по порядку.

Основные характеристики MCP3201

Подключение внешнего АЦП по SPI к микроконтроллеру AVR

  • 12 бит
  • Интерфейс SPI
  • Диапазон напряжения питания: 2.7-5.5 В
  • Низкое энергопотребление
  • 100ksps при питании 5В
  • 50ksps при питании 2.7В

Цоколевка микросхемы показана на рисунке ниже

Назначение ножек:

  1. Vref — опорное напряжение
  2. IN+ — положительный аналоговый вход
  3. IN- — отрицательный аналоговый вход
  4. Vss — земля
  5. CS — выбор чипа
  6. Dout — выход данных
  7. CLK — синхроимпульсы
  8. VDD — питание

Для работы с АЦП по SPI нужно знать, что обмен данными в SPI представляет из себя обмен между двумя регистрами. Это значит, что если мы отсылаем байт на АЦП, то после передачи в регистре SPDR будет байт, который находился в АЦП. Зная это, открываем даташит на MCP3201 и находим раздел в котором описывается подключение к МК и видим там рисунок, показывающий что нужно выставить на ножках SPI, чтобы забрать данные с АЦП.

А делается это очень просто. Подаем с МК на CLK синхронизирующие импульсы и по нужному фронту (в зависимости от режима SPI) забираем данные с ножки DO. Как видно из рисунка, нужно получить два байта с АЦП, а потом из этих байтов собрать с использованием битовых операций (см. Битовые операции) 12 бит данных.

Теперь после того как мы разобрали, на примере MCP3201, характеристики и принцип работы АЦП хотелось бы вернуться к 10-ти битному MCP3001, так как именно его мы будем моделировать в Протеусе. Отличие заключается в том, что биты в полученных данных находятся в других позициях.

В конце статьи можно скачать проект в WinAVR и проект в Протеусе для MCP3001. Сделал отдельным заголовочным файлом, чтобы было удобно подключать. Здесь не буду приводить эту программу, только напишу строки, которые отличаются для двух АЦП.

unsigned char adcLSB, adcMSB;

unsigned int adc;

MCP3001 MCP3201

adc = adcMSB; adc = adcMSB;

adc<<=5; adc<<=7;

adcLSB>>=3; adcLSB>>=1;

adc |= adcLSB; adc |= adcLSB;

Т.е. заменив эти строки вы можете переделать программу для 12-битного АЦП.

Удобно, чтобы как можно точнее измерять напряжение воспользоваться преобразователем напряжения, у которого на выходе 4.096В, например MCP1541. Тогда на 1мВ напряжения будет приходится 1 единица в цифровом коде для 12-и битного АЦП и 4мВ для 10-и битного. Нужно это напряжение подать на вход опорного напряжения.

Как вам статья? Ваша реакция:
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
Расскажите друзьям:
Оцените статью:

3 комментария

  • Здравствуйте Dmitry! Хочу выразить вам благодарность, за эту статью, она мне очень помогла по учёбе. Если вам не трудно, я бы хотел с вами по поводу неё немного поговорить, пришлите мне письмо

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

Оставить комментарий