Arduino:Примеры/SPIDigitalPot

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

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

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

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

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

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

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

AD5206 pins.jpg

AD5206 pinsDescript.jpg

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

Цепь

AD5206 arduino bb2.png

Схема

AD5206 arduino sch.png

Код

 1 /*
 2 Управление цифровым потенциометром
 3   
 4 Этот скетч осуществляет управление цифровым потенциометром AD5206.
 5 Этот датчик обладает 6 потенциометр-каналами.
 6 
 7 У каждого канала имеется по три контакта, имеющих следующие
 8 наименования:
 9 A – подсоединяется к напряжению
10 W – это движок потенциометра; когда вы задаете ему то или иное
11 значение, это меняет уровень сопротивления
12 B – подсоединяется к «земле»
13 
14 AD5206 совместим с SPI, и чтобы управлять им, вам нужно отправить два
15 байта. Один будет содержать информацию о номере канала 
16 (с 0-ого по 5-ый), а второй – значение сопротивления для этого канала
17 (от 0 до 255).
18 
19 Цепь:
20 * Все A-контакты AD5206 подсоединены к +5V
21 * Все B-контакты AD5206 подсоединены к «земле»
22 * Светодиоды и 220-омовые резисторы последовательно подсоединены от каждого W-контакта к «земле»
23 * CS – к 10-ому цифровому контакту (контакт SS)
24 * SDI – к 11-ому цифровому контакту (контакт MOSI)
25 * CLK – к 13-ому цифровому контакту (контакт SCK)
26  
27 Создан 10 августа 2010 Томом Иго (Tom Igoe).
28  
29 За оригинальный урок благодарим Хизер Дьюи-Хэгборг (Heather Dewey-Hagborg), 2005 
30 */
31 
32 
33 // Подключаем библиотеку SPI:
34 #include <SPI.h>
35 
36 // Делаем 10-ый контакт SS-контактом (т.е. контактом Slave Select)
37 // для цифрового потенциометра:
38 const int slaveSelectPin = 10;
39 
40 void setup() {
41   // Делаем SS-контакт выходным:
42   pinMode (slaveSelectPin, OUTPUT);
43   // Инициализируем SPI:
44   SPI.begin(); 
45 }
46 
47 void loop() {
48   // Пробегаемся по шести каналам цифрового потенциометра:
49   for (int channel = 0; channel < 6; channel++) { 
50     // Меняем сопротивление на канале с минимального на максимальное:
51     for (int level = 0; level < 255; level++) {
52       digitalPotWrite(channel, level);
53       delay(10);
54     }
55     // Будучи на максимуме, ждем секунду:
56     delay(100);
57     // Меняем сопротивление на канале с максимального на минимальное:
58     for (int level = 0; level < 255; level++) {
59       digitalPotWrite(channel, 255 - level);
60       delay(10);
61     }
62   }
63 
64 }
65 
66 void digitalPotWrite(int address, int value) {
67   // Задаем SS-контакту значение LOW, чтобы выбрать чип:
68   digitalWrite(slaveSelectPin,LOW);
69   // Отсылаем через SPI адрес и значение:
70   SPI.transfer(address);
71   SPI.transfer(value);
72   // Задаем SS-контакту значение HIGH, чтобы отменить выбор чипа:
73   digitalWrite(slaveSelectPin,HIGH); 
74 }

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

См.также

  1. Arduino SPI LIbrary
  2. BarometricPressureSensor

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