Работа MCP3421 АЦП 18 бит с микроконтроллером ATmega32

 Микросхема MCP3421 компании Microchip представляет собой 18-битный сигма-дельта аналогово-цифровой преобразователь с одним каналом измерения, выпускаемый в миниатюрном 6-выводном корпусе SOT23-6 (Рис.1). В микросхему встроен программируемый усилитель напряжения, генератор импульсов и источник опорного напряжения. Связь с микросхемой осуществляется по интерфейсу I2C (Рис.2).


Рис.1 Внешний вид микросхемы MCP3421. VIN+,VIN- — дифференциальные входы измерительного канала, VSS и VDD — выводы питания,  SDA, SCL – линия данных и линия тактового сигнала шины данных I2C.


Рис.2 Микросхема MCP3421. а – структурная схема, б – схема подключения.

Настройка режимов работы микросхемы осуществляется в конфигурационном регистре микросхемы:


Рис.3 Конфигурационный регистр микросхемы. * — значение по умолчанию, сразу после подачи питания.

Рассмотрим назначение отдельных бит в конфигурационном регистре:

RDY – запись в этот бит “1” инициализирует новое одиночное преобразование.

С1,С0 – выбор канала (т.к. в MCP3421 лишь 1 канал, то не используются). Только для MCP3422/3/4.

O/C – вид преобразования (“1” – непрерывное/ “0” – одиночное).

S1,S0 – выбор битности/скорости преобразования:

 0   0   12 бит / 240 измерений в секунду

 0   1   14 бит  / 60 измерений в секунду

 1   0   16 бит / 15 измерений в секунду

 0   0   18 бит / 3.75 измерений в секунду

G1,G0 – выбор коэффициента усиления:

 0   0    1  

 0   1    2

 1   0    4

 0   0    8

К примеру, если мы хотим чтобы микросхема работала в режиме непрерывных преобразований в 18-битном режиме (преобразования будут производятся 3,75 раз в секунду) c коэффициентом усиления равным «1», то в конфигурационный регистр следует записать байт 000111

Запись байта в конфигурационный регистр

Диаграмма записи в конфигурационный регистр представлена на рис.4


Рис.4 Запись байта в конфигурационный регистр MCP3421

 

Для записи байта в конфигурационный регистр MCP3421 при использовании TWI-модуля микроконтроллера Atmega32 необходимо произвести 5 последовательных действий:

1. Отправить стартовый бит.

2. Отправить 7 бит адреса микросхемы.

3. Отправить бит «запись»

4. Отправить байт с конфигурацией работы MCP3421.

5. Отправить стоповый бит.

Теперь посмотрим, как эти действия будут описаны на языке СИ в программе Atmel Studio7:

void MCP3421_config(void)
{
  TWI_Start();
  TWI_Sendbyte(0b11010000);//Отправляем адрес MCP3421: 1101000 + 0 запись
  TWI_Sendbyte(0b00011100);//Отправляем конфиг. байт: 00011100
  //00011100 — 18 бит, коэфф.усилен =1, непрерывн.преобр.
  TWI_Stop();   }

Рассмотрим приведенные функции подробнее:

При отправке стартового бита необходимо в регистре управления TWCR разрешить работу TWI (TWEN=1), установить флаг состояния Start (TWSTA=1) и установить флаг прерывания TWI (TWINT=1), при этом переходить к следующему действию с модулем TWI необходимо дождавшись отправки стартового бита (когда он отправится TWINT вернется в 0):

//Отправка команды старт
void TWI_Start(void)
{
   //Разрешение работы TWI: TWEN=1
   //Установим флаг состояния «Start»: TWSTA=1
   //Установим флаг прерывания TWI: TWINT=1
   TWCR=(1<<TWEN)|(1<<TWSTA)|(1<<TWINT);
   while(~TWCR&(1<<TWINT));//Подождать завершения операции
}

Адрес MCP3421 состоит из 7 бит: первых 4 бита — это код  устройства, который равен 1101 и 3 адресных бита. Адресные биты MCP3421 по умолчанию равны 000 и не подлежат изменению, поэтому на одну шину данных I2C может быть подключена лишь одна такая микросхема (У старших микросхем в этой серии, таких как MCP3423/24 есть дополнительные выводы Adr0 и Adr1, которые используются для задания адреса микросхемы). Самый младший бит указывает на направление передачи данных (0 – запись, 1 — чтение). Следовательно, обращение к микросхеме MCP3421 по её адресу для записи в неё данных будет выглядеть следующим образом:

TWI_Sendbyte(0b11010000);//Отправляем адрес MCP3421: 1101000 + 0 запись

Для отправки адреса и конфигурационного байта воспользуемся вот такой функцией:

//Отправка байта
void TWI_Sendbyte(unsigned char byte)
{
   TWDR=byte;//Записать байт в регистр данных
   //Разрешение работы TWI: TWEN=1
   //Установим флаг прерывания TWI: TWINT=1
   TWCR=(1<<TWEN)|(1<<TWINT);
   while(~TWCR&(1<<TWINT));//Подождать завершения операции
}

Здесь для отправки байта необходимо записать в регистр TWDR значение отправляемого байта, в регистре управления TWCR разрешить работу TWI, установить флаг прерывания TWI, при этом переходить к следующему действию с модулем TWI следует дождавшись отправки байта.

При отправке стопового бита необходимо в регистре управления TWCR разрешить работу TWI, установить флаг состояния Stop и установить флаг прерывания TWI, при этом не следует дожидаться ответа от модуля TWI – т.к. микроконтроллер его не получит:

//Отправка команды стоп
void TWI_Stop(void)
{
   //Разрешение работы TWI: TWEN=1
   //Установим флаг состояния «Stop»: TWSTO=1
   //Установим флаг прерывания TWI: TWINT=1
   TWCR=(1<<TWEN)|(1<<TWSTO)|(1<<TWINT);
}

Получение результата измерения от MCP3421 в 18-битном режиме

Диаграмма чтения данных из микросхемы MCP3421 представлена на рис.5.

 
Рис.5 Чтение данных из микросхемы MCP3421

Для получения результата измерения от MCP3421 при использовании TWI-модуля микроконтроллера Atmega32 необходимо произвести 5 последовательных действий:

1. Отправить стартовый бит.

2. Отправить 7 бит адреса микросхемы.

3. Отправить бит «чтение»

4. Принять три байта с данными от MCP3421.

5. Отправить стоповый бит.

На языке СИ в программе Atmel Studio7 эти действия могут быть описаны следующим образом:

//Получение данных от MCP3421
void MCP3421_read(void)
{
   TWI_Start();
   TWI_Sendbyte(0b11010001);//Отправляем адрес MCP3421: 1101000 + 1 чтение
   TWI_Receivebytes();//Принять байты с результатом измерения
   TWI_Stop();
}

Здесь используются те же функции отправки стартового бита, стопового бита и отправки байта. Поскольку будет производится чтение данных, при отправки 7 бит адреса, 8-й бит должен быть установлен в единицу.

Здесь показан пример функции принятия 3-х последовательных байтов от MCP3421:

void TWI_Receivebytes()
{
  //Прием первого байта данных
  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);//Отправляем «ACK»: TWEA=1
  while(~TWCR&(1<<TWINT));//Подождать завершения операции
  a1=TWDR;//Записываем старший байт из MCP3421 в переменную a1=TWDR;
  //
  //Прием второго байта данных
  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);//Отправляем «ACK»: TWEA=1
  while(~TWCR&(1<<TWINT));//Подождать завершения операции
  a2=TWDR;//Записываем старший байт из MCP3421 в переменную a1=TWDR;
  //
  //Прием третьего байта данных
  TWCR=(1<<TWINT)|(1<<TWEN);//Отправляем «NACK»: TWEA не выставлен
  while(~TWCR&(1<<TWINT));//Подождать завершения операции
  a3=TWDR;//Записываем младший байт из MCP3421 в переменную a2
}

В этой функции, на каждом этапе принятия байтов необходимо в регистре управления TWCR разрешать работу TWI, устанавливать флаг прерывания TWI и дождавшись завершения операции принятия байта в регистр данных TWDR, переписывать принятый байт в переменную (в примере это a1, a2, a3). Такие действия следует выполнять при приеме каждого из 3-х байт.

После первого и второго принимаемого байта нужно отправлять подтверждение о получении байтов (установкой бита TWEA регистра TWCR в “1”), а после получения третьего байта, это подтверждение отправлять не обязательно (если его отправить, то четвертым байтом MCP3421 вышлет состояние конфигурационного регистра).

Преобразование результата измерения от MCP3421

Как видно из диаграммы на рис.5, результат измерения представлен в 3-х байтах: В первом байте 7 старших бит соответствуют знаку результата измерения (если эти биты равны 0, то знак “+”, если 1 – то знак “-“). Младший бит первого байта соответствует старшему биту результата измерения, а его младшие биты располагаются во 2 и 3 байтах. Таким образом, из 18 значащих бит получаемых от микросхемы результат измерения занимает 17 бит, а знак результата – 1 бит.

Сохраним “знак” результата измерения, после чего удалим знаковые биты:

if(~a1&(1<<7))sign=0;
else sign=1;
a1=a1&0x01;//Сотрем старшие 7 бит

Мы имеем результат измерения в 3-х различных переменных, поэтому его необходимо собрать в одну переменную:

a1=a1<<16;//Сдвинуть на 16 позиций влево
a2=a2<<8;//Сдвинуть на 8 позиций влево
a1|=a1+a2+a3;//Сложить байты MCP3421
a=a1;//Записать результат в переменную типа float

Теперь результат измерения может быть переведен из кода в напряжение и выведен на дисплей следующим способом, с учетом знака:

if(sign==0)sprintf(str,»%.5f»,a*0.000015625); //0.000015625=2.048/2^17  18-bit
else
{
   str_lcd(«-«);//Отправка строки на дисплей
   sprintf(str,»%.5f»,2.048-a*0.000015625);
}

Для использования функции sprint необходимо добавить в проект её описание:

1. Project→properties→toolchain→AVR/GNU Linker→Libraries(-WI,-I)

   Нажать “+” и написать:  libprintf_flt.a

2. Project→properties→toolchain→AVR/GNU Linker→General

   Поставить галку напротив пункта: Use vprintf library(-WI,-u,vprintf) 

Файл с кодом в программе Atmel Studio 7 приложен к статье.

Модель микросхемы MCP3421 присутствует в программе Proteus. Подключение осуществляется следующим образом (Рис.6):


Рис.6 Моделирование 18 бит АЦП в программе Proteus

Ниже представлена фотография эксперимента с  микросхемой MCP3421 на макетной плате (Рис.7).

Рис.7 Фотография макетной платы.

Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

МК AVR 8-битATmega321

АЦПMCP34211

Конденсатор0.1 мкФ1

Конденсатор10 мкф1

Резистор4.7 кОм2

LCD-дисплейМЭЛТ MT-20S4A-3YLG1
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

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

Ваш адрес email не будет опубликован.