9.4. Подключение цифрового потенциометра SPI

Теперь пора применить полученные знания на практике. Рассмотрим устройство управления яркостью светодиодов с помощью цифрового потенциометра ( кратко называемого digipot). В данном примере используем микросхему SPI цифрового потенциометра МСР4231 10ЗЕ. Доступно несколько вариантов данного чипа с различным значением сопротивления. Как и обычный потенциометр, цифровой имеет регулируемый вывод, который определяет сопротивление между двумя выводами микросхемы. Микросхема МСР4231 содержит два потенциометра на одном корпусе. Разрядность каждого из них составляет 7 бит, что определяет 128 значений в диапазоне от 0 до 10 кОм. Сначала с помощью цифрового потенциометра будем менять яркость свечения светодиода, а затем используем digipot для регулировки громкости динамика. Завершив эти два проекта, вы получите основу для реализации более сложных конструкций.

9.4.1. Техническое описание МСР4231

Прежде всего, следует изучить техническое описание микросхемы МСР4231, которое можно найти через поисковую систему Google. Ссылки на техническое опи-

- 191 -

сание для МСР4231 присутствуют на странице www.exploringarduino.com/content/ch9.

В техническом описании можно найти ответы на следующие вопросы:

• цоколевка микросхемы;

• какие выводы являются управляющими;

• как регулируется в данной микросхеме сопротивление потенциометра;

• какие команды SPI необходимы, чтобы управлять двумя потенциометрами.

Чтобы найти ответы на эти вопросы, на рис. 9.2-9.4 приведены некоторые важные фрагменты технического описания. Прежде всего, взгляните на цоколевку микросхемы МСР4231, изображенную на рис. 9.2.

Рис. 9.2. Цоколевка микросхемы МСР4231

При подготовке к работе с новым устройством необходимо сначала разобраться с назначением контактов. Вот назначение выводов МСР4231:

• РОА, POW и РОВ -выводы первого потенциометра;

• PIA, PIW и PIB-выводы второго потенциометра;

• VDD -вывод питания микросхемы 5 В;

• VSS -вывод подключения к земле;

• CS-контакт SS для интерфейса SPI, черта сверху означает, что активный уровень низкий (0 В -чип выбран, 5 В -не выбран);

• SDI и SDO - контакты последовательного ввода и вывода данных ( соответствуют MOSI и MISO);

• SCK -линия синхронизации SPI;

• SHDN и WP -контакты для выключения и защиты от записи, соответственно.

Для МСР4231 контакт WP не задействован и его можно игнорировать. Активный уровень на контакте SHDN низкий, как и на выводе CS. При низком уровне средний вывод потенциометра отключен. Чтобы потенциометр был всегда включен, необходимо соединить контакт SHDN непосредственно с шиной 5 В.

Далее необходимо узнать полное сопротивление потенциометра и сопротивление среднего вывода. Подобно обычному потенциометру, сопротивление между клеммами А и В в цифровом тоже постоянно. Средний вывод также имеет собственное

- 192 -

сопротивление, и это нужно принимать во внимание. Обратимся к пятой странице технического описания (рис. 9.3).

Прежде всего, выясним полное сопротивление потенциометра, обозначаемое R д в,

Доступны четыре варианта этого чипа, каждый с разным значением сопротивления (от 5 до 100 кОм). Далее используем вариант 103, сопротивление которого составляет примерно 10 кОм. Важно отметить, что цифровые потенциометры, как правило, имеют довольно большой разброс (из рис. 9.3 видно, что фактическое сопротивление может изменяться на ±20% ). Также следует отметить, что собственное сопротивление среднего вывода потенциометра составляет от 75 до 160 Ом. Это сопротивление нужно учитывать, особенно при управлении динамиком или светодиодом.

AC/DC CHARACTERISTICS (CONTINUED)

Рис. 9.3. Фрагмент технического описания микросхемы МСР4231

Далее разберемся с командами для управления цифровым потенциометром. На МСР4231 необходимо отправить две команды. Первая определяет выбор нужного потенциометра, вторая устанавливает текущее значение сопротивления выбранного потенциометра. Формат команд приведен на рис. 9.4.

Из рис. 9.4 ясно, что существуют два вида команд: 8-разрядные и 16-разрядные.

Первая команда позволяет увеличить сопротивление потенциометра, вторая установить произвольное значение сопротивления. Рассмотрим 16-битовую команду, обеспечивающую большую гибкость. По шине данных передается адрес ячейки памяти, код команды ( чтение, запись, приращение или уменьшение) и значение данных.

Рис. 9.4. Формат команд МСР4231

В техническом описании приведены адреса регистров, связанных с каждым потенциометром. Регистр первого потенциометра расположен в ячейке памяти по адресу 0, второго - по адресу 1. Зная это, можно отправить необходимые команды на установку значений для каждого потенциометра. Чтобы задать значение для первого потенциометра, первый байт будет содержать В00000000, а второй - величину сопротивления (0-128). Чтобы установить значение для второго потенциометра, первый байт будет равен B000 10000, а второй - величине сопротивления. Как видно из рис. 9.4, первые 4 бита первого байта- это адрес регистра памяти, следующие 2 бита- код команды (00 - для записи), следующие 2 бита - это старшие биты величины сопротивления (должны быть равны нулю, потому что максимальное значение для этого потенциометра составляет 128).

Вот и все, что нужно знать для взаимодействия цифрового потенциометра с платой Arduino. Теперь подключим его, чтобы управлять яркостью светодиодов.

9.4.2. Описание схемы устройства

Чтобы в полной мере проверить знания протокола SPI, возьмем две микросхемы MCP4231, что даст нам четыре управляемых потенциометра. Каждый из них подключен последовательно со своим светодиодом (красным, желтым, зеленым и синим) и регулирует его яркость. Задействованы только две клеммы потенциометра.

Один контакт каждого потенциометра подключен через резистор к шине 5 В, второй ( средний вывод) - к аноду светодиода. Схема подключения одного светодиода изображена на рис. 9.5.

Катод светодиода подключен к земле. Когда сопротивление цифрового потенциометра минимально, ток течет от источника 5 В через резистор 100 Ом и средний вывод потенциометра (имеющий сопротивление - 75 Ом) и далее через светодиод.

Когда сопротивление потенциометра максимально, ток течет через резистор 100 Ом, потенциометр (- 10 кОм), а затем через светодиод. Даже при полностью выведенном потенциометре сопротивление участка цепи будет 175 Ом, что достаточно для ограничения тока через светодиод. При увеличении и уменьшении сопротивления цифрового потенциометра меняется ток через светодиод, а следовательно, его яркость. Этот метод регулирования яркости может оказаться очень полезным, если заняты все выводы ШИМ.

- 194 -

Рис. 9.5. Схема подключения светодиода к потенциометру

Рис. 9.6. Схема подключения цифровых потенциометров

- 195 -

Теперь, учитывая цоколевку, подсоединяем цифровые потенциометры к шине SPI.

На плате Arduino Uno контакт 13 - это SCK, контакт 12 - MISO, контакт 11 MOSI. Контакт 10 будем использовать как SS для одного чипа, а контакт 9 - как SS для другого чипа. Схема подключения приведена на рис. 9.6. Помните, что каждую из микросхем нужно подключить к своей линии SCK, MISO и MOSI.

Еще раз проверьте, что все правильно подключено, и перейдем к написанию программы управления яркостью светодиодов.

9.4.3. Написание программы

Чтобы проверить, что все подключено правильно и работает, напишем простую программу с использованием библиотеки SPI для управления яркостью четырех светодиодов.

Библиотека SPI встроена в Arduino IDE, что сильно облегчает организацию обмена по протоколу SPI. Все, что остается программисту, - подключить библиотеку SPI и отправить данные в соответствии с протоколом SPI с помощью встроенных команд. Конечно, необходимо переключать флажки SS для выбора устройства.

Чтобы отправить команду одному из цифровых потенциометров на изменение яркости светодиода, необходимо выполнить следующее:

• установить на выводе SS требуемой микросхемы низкий уровень;

• отправить байт команды на выбранный потенциометр;

• отправить байт данных - значение для выбранного потенциометра;

• установить на выводе SS выбранной микросхемы высокий уровень.

Программа, приведенная в листинге 9.1, выполняет все описанные шаги: выбирает контакт SS, посылает байт выбора потенциометра и байт значения потенциометра по протоколу SPI. Функция SPI. begin() инициализирует аппаратный интерфейс SPI на плате Arduino и после этого для передачи данных по шине SPI можно использовать команду SPI. transfer().

Контакт выбора SS для первой микросхемы подключается к контакту 10 платы, для второй - к контакту 9. Функция settled() получает номер контакта SS, адрес регистра микросхемы и значение уровня потенциометра и передает данные в соответствующий чип. В цикле loop() яркость всех четырех светодиодов сначала увеличивается, а затем уменьшается. Загрузите программу на плату Arduino и увидите этот эффект.

ПРИМЕЧАНИЕ

Посмотреть видеоклип, демонстрирующий работу SPI цифрового потенциометра в качестве регулятора яркости, можно на странице http:/1 www.exploringarduino.com/content/ch9. Этот видеофайл доступен также на сайте издательства Wiley.

Освоив простой пример, в следующем разделе создадим более сложное устройство, добавив звуковой эффект.

- 196 -

Листинг 9.1. Управление несколькоими SPI цифровыми потенциометрами - SPI_led.ino

// Изменение яркости светодиодов не с помощью ШИМ,

// а регулировкой напряжения

// Подключение библиотеки SPI

#include <SPI.h>

// При подключении библиотеки SPI

// по умолчанию используются контакты

// 11 = MOSI, 12 = MISO, 13 = CLK

const int SS1=10; // Контакт выбора SS микросхемы 1

const int SS2=9; // Контакт выбора SS микросхемы 2

const byte REG0=B00000000; // Команда записив регистр 0

// (выбор первого потенциометра)

const byte REG1=B00010000; // Команда записи в регистр 1

// (выбор второго потенциометра)

void setup()

{

// Настройка контактов выбора SS на выход

pinMode(SS1, OUTPUT);

pinMode(SS2, OUTPUT);

// Инициализация аппаратного SPI

SPI.begin();

}

// Подпрограмма выбора и отправки данных для каждого светодиода

// Chip 1 (SS 10) регистр 0 - красный

// Chip 1 (SS 10) регистр 1 - желтый

// Chip 2 (SS 9) регистр о - зеленый

// Chip 2 (SS 9) регистр 1 - синий

void setLed(int SS, int reg, int level)

{

digitalWrite(SS, LOW); // Установить SS в низкий уровень (выбор)

SPI.transfer(reg); // Отправка команды

SPI.transfer(level); // Отправка значения (0-128)

digitalWrite(SS, HIGH); // Установить SS в высокий уровень

}

void loop()

{

for (int i=0; i<=128; i++)

{

setLed(SS1, REG0, i);

setLed(SS1, REG1, i);

- 197 -

setLed(SS2, REG0, i);

setLed(SS2, REG1, i);

delay(10);

}

delay (300);

for (int i=128; i>=0; i--)

{

setLed ( SS1,REG0,i);

setLed ( SS1,REG1,i);

setLed(SS2,REG0,i);

setLed(SS2,REG1,i);

delay(10);

}

delay(300);

}

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК