Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/SPIDigitalPot

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Управление цифровым потенциометром при помощи 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

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

  1. Arduino - Controlling a Digital Potentiometer Using SPI