- MCP4921 DAC (цифро-аналоговый преобразователь)
- Необходимые компоненты
- Схема
- Код Пояснение
- Тестирование цифро-аналогового преобразования с помощью PIC
Цифровой и аналоговый - неотъемлемая часть электроники. Большинство устройств имеют как АЦП, так и ЦАП, и они используются, когда есть необходимость преобразования сигналов из аналогового в цифровой или из цифрового в аналоговый. Кроме того, сигналы реального мира, такие как звук и свет, являются аналоговыми по своей природе, поэтому всякий раз, когда эти сигналы реального мира должны использоваться, цифровые сигналы должны быть преобразованы в аналоговые, например, для воспроизведения звука с помощью динамиков или для управления источником света.
Другой тип ЦАП - широтно-импульсный модулятор (ШИМ). ШИМ принимает цифровое слово и генерирует цифровой импульс с переменной шириной. Когда этот сигнал проходит через фильтр, результат будет чисто аналоговым. Аналоговый сигнал может содержать несколько типов данных в сигнале.
В этом руководстве мы соединим ЦАП MCP4921 с Microchip PIC16F877A для цифро-аналогового преобразования.
В этом руководстве мы преобразуем цифровой сигнал в аналоговый и отобразим входное цифровое значение и выходное аналоговое значение на ЖК-дисплее 16x2. Он будет обеспечивать 1 В, 2 В, 3 В, 4 В и 5 В в качестве окончательного аналогового выхода, который демонстрируется в видео, приведенном в конце. Вы можете подробнее узнать о ЦАП в нашем драгоценном руководстве по взаимодействию ЦАП с платами Raspberry Pi, Arduino и STM32.
ЦАП может использоваться во многих приложениях, таких как управление двигателем, регулировка яркости светодиодных индикаторов, аудиоусилитель, видеокодеры, системы сбора данных и т. Д. Перед тем, как перейти непосредственно к интерфейсной части, важно получить обзор MCP4921.
MCP4921 DAC (цифро-аналоговый преобразователь)
MCP4921 - это 12-битный ЦАП, поэтому MCP4921 обеспечит 12-битное разрешение на выходе. Разрешение ЦАП означает количество цифровых битов, которые можно преобразовать в аналоговый сигнал. Сколько значений мы можем получить от этого, зависит от формулы. Для 12-битного сигнала это = 4096. Это означает, что ЦАП с 12-битным разрешением может выдавать 4096 различных выходных сигналов.
Используя это значение, можно легко рассчитать напряжение одиночной аналоговой ступени. Для расчета шагов требуется эталонное напряжение. Поскольку логическое напряжение для устройства составляет 5 В, ступенчатое напряжение составляет 5/4095 (4096-1, потому что начальная точка для цифрового сигнала не 1, а 0), что составляет 0,00122100122 милливольт. Таким образом, изменение 1 бита изменит аналоговый выход на 0,00122100122.
Итак, это была часть преобразования. MCP4921 представляет собой 8-контактный IC. Схема контактов и описание можно найти ниже.
MCP4921 ИК осуществляет связь с микроконтроллером по протоколу SPI. Для связи SPI устройство должно быть ведущим, которое передает данные или команды внешнему устройству, подключенному в качестве ведомого. В системе связи SPI несколько подчиненных устройств могут быть связаны с одним главным устройством.
Чтобы отправить данные и команду, важно понимать регистр команд.
На изображении ниже показан регистр команд,
Регистр команд представляет собой 16-битовый регистр. Для команды конфигурации используются биты с 15 по 12. Ввод данных и конфигурация четко показаны на изображении выше. В этом проекте MCP4921 будет использоваться в следующей конфигурации:
Битовый номер |
Конфигурация |
Значение конфигурации |
Бит 15 |
ЦАП А |
0 |
Бит 14 |
Небуферизованный |
0 |
Бит 13 |
1x (V OUT * D / 4096) |
1 |
Бит 12 |
Бит управления понижением выходной мощности |
1 |
Таким образом, двоичный файл - это 0011 вместе с данными, которые определяются битами от D11 до D0 регистра. Необходимо отправить 16-битные данные 0011 xxxx xxxx xxxx, где первые 4 бита MSB являются конфигурацией, а остальные - LSB. Это станет понятнее, если посмотреть на временную диаграмму команды записи.
Согласно временной диаграмме и таблице данных, на выводе CS низкий уровень в течение всего периода записи команды в MCP4921.
Теперь пришло время связать устройство с оборудованием и написать коды.
Необходимые компоненты
Для этого проекта требуются следующие компоненты:
- MCP4921
- PIC16F877A
- Кристалл 20 МГц
- ЖК-дисплей 16x2 символов.
- Резистор 2к -1 шт
- Конденсаторы 33пФ - 2 шт.
- Резистор 4,7 кОм - 1 шт.
- Мультиметр для измерения выходного напряжения
- Макет
- Источник питания 5 В, зарядное устройство для телефона может работать.
- Множество проводов или проводов.
- Среда программирования микросхемы с комплектом программатора и IDE с компилятором
Схема
Схема подключения DAC4921 к микроконтроллеру PIC приведена ниже:
Схема построена на макетной плате-
Код Пояснение
Полный код для преобразования цифровых сигналов в аналоговые с помощью PIC16F877A приведен в конце статьи. Как всегда, нам сначала нужно установить биты конфигурации в микроконтроллере PIC.
// Настройка битов конфигурации PIC16F877A // Операторы конфигурации исходной строки 'C' // CONFIG #pragma config FOSC = HS // Биты выбора генератора (генератор HS) #pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен) # pragma config PWRTE = OFF // Бит включения таймера включения (PWRT отключен) #pragma config BOREN = ON // Бит разрешения сброса пониженного напряжения ( включен BOR) #pragma config LVP = OFF // Низкое напряжение (одинарное питание) Бит разрешения внутрисхемного последовательного программирования (вывод RB3 / PGM имеет функцию PGM; низковольтное программирование разрешено) #pragma config CPD = OFF // Бит защиты кода памяти EEPROM данных (защита кода EEPROM данных выключена) #pragma config WRT = OFF // Биты разрешения записи в флэш-память программ (защита от записи отключена; вся программная память может быть записана с помощью управления EECON) #pragma config CP = OFF // Бит защиты кода флэш-памяти программ (защита кода выключена)
Приведенные ниже строки кода используются для интеграции файлов заголовков LCD и SPI, также декларируется частота XTAL и вывод CS ЦАП.
Учебник и библиотеку PIC SPI можно найти по указанной ссылке.
#включают
Функция SPI_Initialize_Master () немного изменена для другой конфигурации, необходимой для этого проекта. В этом случае регистр SSPSTAT сконфигурирован таким образом, что входные данные, дискретизируемые в конце времени вывода данных, а также тактовые импульсы SPI, сконфигурированные как Transmit, происходят при переходе из активного в режим состояния ожидания. Другое то же самое.
void SPI_Initialize_Master () { TRISC5 = 0; // Установить как вывод SSPSTAT = 0b11000000; // стр. 74/234 SSPCON = 0b00100000; // стр 75/234 TRISC3 = 0; // Установить как выход для ведомого режима }
Кроме того, для функции ниже SPI_Write () немного изменен. Передача данных будет происходить после очистки буфера для обеспечения безупречной передачи данных через SPI.
void SPI_Write (входящий символ) { SSPBUF = incoming; // Записываем данные пользователя в буфер while (! SSPSTATbits.BF); }
Важной частью программы является драйвер MCP4921. Это немного сложная часть, поскольку команда и цифровые данные перфорируются вместе, чтобы предоставить полные 16-битные данные по SPI. Однако эта логика ясно показана в комментариях к коду.
/ * Эта функция предназначена для преобразования цифрового значения в аналоговое. * / void convert_DAC (unsigned int value) { / * Размер шага = 2 ^ n, поэтому 12 бит 2 ^ 12 = 4096 Для ссылки 5 В шаг будет 5/4095 = 0,0012210012210012V или 1 мВ (приблизительно) * / unsigned int container; беззнаковый int MSB; unsigned int LSB; / * Шаг: 1, 12-битные данные сохранены в контейнере. Предположим, что данные 4095, в двоичном формате 1111 1111 1111 * / container = value; / * Шаг: 2 Создание фиктивного 8-битного файла. Таким образом, при делении 256 старшие 4 бита захватываются в LSB LSB = 0000 1111 * / LSB = container / 256; / * Шаг: 3 Отправка конфигурации с перфорацией 4-х битных данных. LSB = 0011 0000 ИЛИ 0000 1111. Результат: 0011 1111 * / LSB = (0x30) - LSB; / * Шаг: 4 Контейнер все еще имеет 21-битное значение. Извлечение младших 8 бит. 1111 1111 И 1111 1111 1111. Результатом является 1111 1111, который является MSB * / MSB = 0xFF & container; / * Шаг: 4 Отправка 16-битных данных разделением на два байта. * / DAC_CS = 0; // CS низкий во время передачи данных. Согласно паспорту требуется SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
В основной функции используется «цикл for», где создаются цифровые данные для создания выходных сигналов 1 В, 2 В, 3 В, 4 В и 5 В. Цифровое значение рассчитывается относительно выходного напряжения / 0,0012210012210012 милливольт.
недействительным main () { system_init (); Introduction_screen (); int number = 0; int volt = 0; while (1) { для (вольт = 1; вольт <= MAX_VOLT; вольт ++) { число = вольт / 0,0012210012210012; чистый экран(); lcd_com (FIRST_LINE); lcd_puts ("ДАННЫЕ отправлены: -"); lcd_print_number (число); lcd_com (SECOND_LINE); lcd_puts ("Вывод: -"); lcd_print_number (вольт); lcd_puts ("V"); convert_DAC (число); __delay_ms (300); } } }
Тестирование цифро-аналогового преобразования с помощью PIC
Построенная схема проверена с помощью мультиметра. На изображениях ниже выходное напряжение и цифровые данные отображаются на ЖК-дисплее. Мультиметр показывает близкие показания.
Полный код с рабочим видео прилагается ниже.