Понадобилось мне тут недавно подключить к МК внешнее АЦП на 12 бит по SPI. И в этой статье решил рассказать, что из этого получилось. В первую очередь, хотелось чтобы это АЦП можно было подключить к МК в Протеусе и получить результат там. Покапавшись по интернету и посмотрев цены, остановился на 12-и битном одноканальном АЦП фирмы Microchip MCP3201. Самого MCP3201 в Протеусе нет, но есть 10-и битный MCP3001. Отличается он от MCP3201 лишь тем, что он 10-ти битный и поэтому есть небольшое отличие в обработке уже полученных данных, а получать с него данные также как с 12-и битного. Но обо всем по порядку. Основные характеристики MCP3201 - 12 бит
- Интерфейс SPI
- Диапазон напряжения питания: 2.7-5.5 В
- Низкое энергопотребление
- 100ksps при питании 5В
- 50ksps при питании 2.7В
Цоколевка микросхемы показана на рисунке ниже
Назначение ножек: - Vref - опорное напряжение
- IN+ - положительный аналоговый вход
- IN- - отрицательный аналоговый вход
- Vss - земля
- CS - выбор чипа
- Dout - выход данных
- CLK - синхроимпульсы
- 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-и битного. Нужно это напряжение подать на вход опорного напряжения.
|