Подключение цифро-аналогового преобразователя (ЦАП) MCP4725 к STM32F103C8


Все мы знаем, что микроконтроллеры могут работать только с цифровыми значениями, но в реальной жизни нам приходится иметь дело и с аналоговыми сигналами. Поэтому для преобразования цифровых значений, обрабатываемых микроконтроллерами, в аналоговые сигналы, применяются устройства, называемые цифро-аналоговыми преобразователями (ЦАП, в англ. DAC – Digital to Analog Converter).

Простым примером использования АЦП (аналого-цифрового преобразования) и ЦАП, является запись и воспроизведение какой либо песни. Сначала звуки песни, поступающие от микрофона оцифровываются с помощью АЦП и затем хранятся в цифровой форме (в виде файла). Затем для воспроизведения этой песни из цифрового формата используется ЦАП, который преобразует цифровые данные в аналоговый звуковой сигнал.

Внешний вид подключения ЦАП MCP4725 к плате STM32F10C8

У платы STM32F103C8 есть 10 входов с АЦП (их использование мы рассматривали в этой статье), но встроенного цифро-аналогового преобразователя (ЦАП) у ней нет, поэтому в данной статье мы рассмотрим подключение внешнего модуля ЦАП MCP4725 к плате STM32F103C8 (Blue Pill). Ранее на нашем сайте мы рассматривали подключение данного модуля ЦАП к платам Arduino и Raspberry Pi.

Необходимые компоненты

  1. Плата разработки STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
  2. Микросхема ЦАП MCP4725 (купить на AliExpress).
  3. ЖК дисплей 16x2 (купить на AliExpress).
  4. Потенциометр 10 кОм (купить на AliExpress).
  5. Макетная плата.
  6. Соединительные провода.

Модуль ЦАП MCP4725

MCP4725 представляет собой микросхему модуля ЦАП с разрешением 12 бит и предназначен для формирования аналогового напряжения в диапазоне от 0 до 5V. Управляется модуль MCP4725 по интерфейсу I2C. Также модуль содержит энергонезависимую память EEPROM.

Модуль MCP4725 имеет разрешение (разрешающую способность) 12 бит. Это означает что на вход модуля мы можем подавать цифровые значения в диапазоне от 0 до 4096. На выходе модуля в зависимости от значения на его входе будет формироваться аналоговое напряжение, зависящее от входного значения и значения опорного напряжения. Максимальное опорное напряжение для модуля составляет 5V.

Формула для расчета выходного напряжения модуля выглядит следующим образом:

O/P Voltage = (Reference Voltage / Resolution) x Digital Value

где Reference Voltage – опорное напряжение,
Resolution – разрешение (в нашем случае 4096),
Digital Value – цифровое значение на входе модуля MCP4725.

К примеру, если в качестве опорного напряжения мы используем 5V, а на входе модуля у нас значение 2048, то на выходе модуля у нас будет напряжение:

O/P Voltage = (5/ 4096) x 2048 = 2.5V

Распиновка модуля MCP4725

Назначение контактов (распиновка) модуля MCP4725 представлена на следующем рисунке.

Назначение контактов (распиновка) модуля MCP4725

Контакты ЦАП MCP4725 Их назначение
OUT выходное аналоговое напряжение
GND земля для выходного аналогового напряжения
SCL линия синхронизация протокола I2C
SDA линия передачи данных протокола I2C
VCC входное опорное напряжение 5V или 3.3V
GND земля для опорного напряжения

Далее рассмотрим использование интерфейса I2C в модуле.

Связь с модулем MCP4725 по интерфейсу I2C

Модуль MCP4725 можно подключить практически к любому современному микроконтроллеру по интерфейсу I2C. Связь по интерфейсу I2C требует всего 2-х линий (проводов) – SCL и SDA.

По умолчанию I2C адрес модуля MCP4725 равен 0x60. Также возможны адреса 0x61 или 0x62

Распиновка платы STM32 Blue Pill приведена на следующем рисунке.

Назначение контактов (распиновка) платы STM32F103C8 (Blue Pill)Контакты I2C в плате STM32F103C8:
SDA: PB7 или PB9, PB11.
SCL: PB6 или PB8, PB10.

Более подробно об использовании интерфейса I2C в плате STM32F103C8 можно прочитать в этой статье.

Схема проекта

Схема подключения модуля ЦАП MCP4725 к плате STM32F103C8 (Blue Pill) представлена на следующем рисунке.

Схема подключения модуля ЦАП MCP4725 к плате STM32F10C8 (Blue Pill)Соединения между платой STM32F103C8 и ЖК дисплеем представлены в следующей таблице.

№ контакта ЖК дисплея Обозначение контакта ЖК дисплея Контакт платы STM32
1 Ground (Gnd) Ground (G)
2 VCC 5V
3 VEE средний контакт потенциометра
4 Register Select (RS) PB11
5 Read/Write (RW) Ground (G)
6 Enable (EN) PB10
7 Data Bit 0 (DB0) No Connection (NC)
8 Data Bit 1 (DB1) No Connection (NC)
9 Data Bit 2 (DB2) No Connection (NC)
10 Data Bit 3 (DB3) No Connection (NC)
11 Data Bit 4 (DB4) PB0
12 Data Bit 5 (DB5) PB1
13 Data Bit 6 (DB6) PC13
14 Data Bit 7 (DB7) PC14
15 LED Positive 5V
16 LED Negative Ground (G)

Соединения между платой STM32F103C8 и модулем ЦАП MCP4725 представлены в следующей таблице.

Модуль ЦАП MCP4725 Плата STM32F103C8 Мультиметр
SDA PB7 NC
SCL PB6 NC
OUT PA1 Positive Probe
GND GND Negative Probe
VCC 3.3V NC

Средний контакт потенциометра подключен к аналоговому контакту PA0 платы STM32F103C8, левый контакт потенциометра подключен к контакту GND платы, а его правый контакт – к контакту 3.3V платы.

В данном проекте мы подключим модуль ЦАП MCP4725 к плате STM32 и будем использовать потенциометр для подачи аналогового значения напряжения на контакт PA0 платы STM32. Далее с помощью АЦП на данном контакте мы будем преобразовывать аналоговое значение напряжения в цифровую форму. После этого мы будем передавать это значение напряжения на модуль MCP4725 по интерфейсу I2C. Затем модуль MCP4725 будет конвертировать это цифровое значение в аналоговое и после этого мы будем использовать еще один контакт АЦП PA1 платы STM32 чтобы проверить точность работы аналогового выхода (точность преобразования) модуля MCP4725. После всего этого мы будем выводить на экран ЖК дисплея значения аналогового напряжения на входе контакта PA0 платы STM32 и на выходе модуля MCP4725.

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции проекта

Объяснение программы для платы STM32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом в программе подключим библиотеки для работы с интерфейсом I2C (wire.h, SoftWire.h) и ЖК дисплеем (liquidcrystal.h).

Далее укажем контакты платы STM32F103C8, к которым подключен ЖК дисплей, и создадим объект для работы с дисплеем.

Затем укажем I2C адрес модуля MCP4725, по умолчанию он равен 0x60.

Затем в функции void setup() инициализируем связь по протоколу I2C на контактах PB7 (SDA) и PB6 (SCL) платы STM32F103C8.

Далее укажем тип ЖК дисплея (16x2) и покажем на его экране приветственное сообщение.

Затем в функции void loop() в buffer[0] запишем значение контрольного байта (значение 010 устанавливает модуль MCP4725 в режим записи).

После этого мы считаем аналоговое значение напряжение с контакта PA0, преобразуем его в цифровое значение в диапазоне от 0 до 4096 (поскольку АЦП имеет разрешение 12 бит) и сохраним его в переменной adc.

Далее на основе считанного цифрового значения рассчитаем значение аналогового напряжения на контакте PA0 с учетом того, что опорное напряжение составляет у нас величину равную 3.3V.

Затем запишем значения наиболее значащих бит в buffer[1] при помощи сдвига на 4 разряда вправо переменной adc, а значения наименее значащих бит запишем в buffer[2] при помощи сдвига на 4 разряда влево переменной adc.

После этого считаем значение с выхода АЦП контакта PA1 платы STM32 – к этому контакту подключен выход модуля ЦАП MCP4725. Также к этому контакту можно подключить мультиметр чтобы проверить величину выходного напряжения с выхода ЦАП.

Затем на основе значения переменной analogread рассчитаем величину аналогового напряжения на контакте PA1.

Также в функции void loop() мы начнем передачу данных модулю MCP4725:

Далее передадим контрольный (управляющий) байт по интерфейсу I2C:

Затем передадим наиболее значащие биты (MSB) по интерфейсу I2C.

После чего передадим наименее значащие биты (MSB) по интерфейсу I2C.

После этого закончим передачу.

Затем выведем полученные значения на экран ЖК дисплея с помощью функции lcd.print().

Тестирование работы проекта

Когда схема проекта будет готова, а программа загружена в плату STM32, вы можете приступить к тестированию работы проекта. Вращая потенциометр, подключенный к плате, вы сможете на экране ЖК дисплея наблюдать как меняются значения аналогового напряжения на входе АЦП (первая строка дисплея) и на выходе ЦАП (вторая строка дисплея). К выходу ЦАП у нас также подключен мультиметр для проверки значения напряжения.

Тестирование работы проекта

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
1 993 просмотров

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *