Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

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

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


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

Микросхема MCP3421. а – структурная схема, б – схема подключения
Рис.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

Запись байта в конфигурационный регистр MCP3421
Рис.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.

Чтение данных из микросхемы MCP3421 
Рис.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-й бит должен быть установлен в единицу.

Здесь показан пример функции принятия трех последовательных байтов от 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). Такие действия следует выполнять при приеме каждого из трех байт.

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

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

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

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

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

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

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):

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

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

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

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
МК AVR 8-бит
ATmega32
1 Поиск в магазине ОтронВ блокнот
АЦП
MCP3421
1 Поиск в магазине ОтронВ блокнот
Конденсатор0.1 мкФ1 Поиск в магазине ОтронВ блокнот
Конденсатор10 мкф1 Поиск в магазине ОтронВ блокнот
Резистор
4.7 кОм
2 Поиск в магазине ОтронВ блокнот
LCD-дисплейМЭЛТ MT-20S4A-3YLG1 Поиск в магазине ОтронВ блокнот
Добавить все

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

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

Теги:

Опубликована: 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (8) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
smack #
Насколько "блымаеют" результаты измерений при 18 битном разрешении?
Ответить
0

[Автор]
simasima #
+-20 мкВ.
Ответить
0
Никита #
Как правильно разводить печатную плату для этого АЦП?
Ответить
0

[Автор]
simasima #
Есть некоторые рекомендации в мануале на этот счет: конденсаторы как можно ближе к VDD (в пределах дюйма), также если на вашей плате разделено цифровое и аналоговое питание, то АЦП должен питаться от аналогового.
Прикрепленный файл: MCPЗ421.jpg
Ответить
+1
Андрей #
А можете выложить сюда проект из Proteus?
Ответить
0
Игорь #
А где же .hex файл?
Ответить
0
Игорь #
Добрый день! Пытался этот проект cделать в microC. Хотел на PIC16F876 или PIC16F877. Провозился несколько дней, и ничего не вышло. То компилятор ругается на I2C, то на инициализацию LCD. А на sprinf так вообще.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Arduino UNO Набор 4WD Kit Bluetooth
вверх