Arduino:Примеры/SPIDigitalPot

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Управление цифровым потенциометром при помощи SPI[1]

В этом уроке вы научитесь, как управлять цифровым потенциометром AD5206 при помощи протокола SPI. О том, что такое SPI, читайте в уроке о SPIEEPROM.

Цифровые потенциометры требуются в том случае, когда вам нужно менять сопротивление в цепи не вручную, а цифровым способом. Это применимо в таких задачах, как, например, изменение яркости светодиода, регулировка звукового сигнала и генерация нот. В данном же примере мы будем управлять яркостью шести светодиодов, для чего воспользуемся цифровым потенциометром с шестью каналами. Впрочем, эту инструкцию можно применить и для SPI-коммуникации с другими девайсами, потребуется разве что некоторая модификация.

Необходимое оборудование

  • Цифровой потенциометр AD5206;
  • Микроконтроллерный модуль Arduino;
  • 6 светодиодов;
  • 6 резисторов на 220 Ом;
  • Провода-перемычки;

Введение в то, как работает цифровой потенциометр AD5206

Паспортные данные AD5206 можно посмотреть тут.

AD5206 – это 6-канальный цифровой потенциометр. Это значит, что в него встроено 6 регулируемых резисторов (потенциометров), каждым из которых можно управлять индивидуально и электронно. Кроме того, у каждого из этих потенциометров имеется по 3 контакта, которые можно подсоединять так же, как и у механического потенциометра. Эти контакты обозначаются как Ax, Bx и Wx (к примеру, A1, B1 и W1). Например, в этом примере мы будем использовать все эти регулируемые резисторы в качестве делителей напряжения: у каждого один из контактов (контакт B) будет иметь значение HIGH, другой (контакт A) – LOW, а третий (центральный контакт; движок) будет отвечать за изменение сопротивления. Максимальным сопротивлением AD5206 будет 10 кОм, разбитые на 255 интервалов (где 255 – это максимум, а 0 – минимум).

Цепь

Схема

Код

/*
Управление цифровым потенциометром
  
Этот скетч осуществляет управление цифровым потенциометром AD5206.
Этот датчик обладает 6 потенциометр-каналами.

У каждого канала имеется по три контакта, имеющих следующие
наименования:
A – подсоединяется к напряжению
W – это движок потенциометра; когда вы задаете ему то или иное
значение, это меняет уровень сопротивления
B – подсоединяется к «земле»

AD5206 совместим с SPI, и чтобы управлять им, вам нужно отправить два
байта. Один будет содержать информацию о номере канала 
(с 0-ого по 5-ый), а второй – значение сопротивления для этого канала
(от 0 до 255).

Цепь:
* Все A-контакты AD5206 подсоединены к +5V
* Все B-контакты AD5206 подсоединены к «земле»
* Светодиоды и 220-омовые резисторы последовательно подсоединены от каждого W-контакта к «земле»
* CS – к 10-ому цифровому контакту (контакт SS)
* SDI – к 11-ому цифровому контакту (контакт MOSI)
* CLK – к 13-ому цифровому контакту (контакт SCK)
 
Создан 10 августа 2010 Томом Иго (Tom Igoe).
 
За оригинальный урок благодарим Хизер Дьюи-Хэгборг (Heather Dewey-Hagborg), 2005 
*/


// Подключаем библиотеку SPI:
#include <SPI.h>

// Делаем 10-ый контакт SS-контактом (т.е. контактом Slave Select)
// для цифрового потенциометра:
const int slaveSelectPin = 10;

void setup() {
  // Делаем SS-контакт выходным:
  pinMode (slaveSelectPin, OUTPUT);
  // Инициализируем SPI:
  SPI.begin(); 
}

void loop() {
  // Пробегаемся по шести каналам цифрового потенциометра:
  for (int channel = 0; channel < 6; channel++) { 
    // Меняем сопротивление на канале с минимального на максимальное:
    for (int level = 0; level < 255; level++) {
      digitalPotWrite(channel, level);
      delay(10);
    }
    // Будучи на максимуме, ждем секунду:
    delay(100);
    // Меняем сопротивление на канале с максимального на минимальное:
    for (int level = 0; level < 255; level++) {
      digitalPotWrite(channel, 255 - level);
      delay(10);
    }
  }

}

void digitalPotWrite(int address, int value) {
  // Задаем SS-контакту значение LOW, чтобы выбрать чип:
  digitalWrite(slaveSelectPin,LOW);
  // Отсылаем через SPI адрес и значение:
  SPI.transfer(address);
  SPI.transfer(value);
  // Задаем SS-контакту значение HIGH, чтобы отменить выбор чипа:
  digitalWrite(slaveSelectPin,HIGH); 
}

Авторство оригинального урока принадлежит Хизер Дьюи-Хэгборг (Heather Dewey-Hagborg), а к модификации приложили руку Том Иго (Tom Igoe) и Кристиан Церрито (Christian Cerrito).

См.также

  1. Arduino SPI LIbrary
  2. BarometricPressureSensor

Внешние ссылки