Использование аналоговых входов/выходов на Arduino

Добавлено 7 марта 2016 в 13:00

Помимо цифровых сигналов, Arduino может использовать и аналоговые входные и выходные сигналы.

Аналоговый сигнал – это сигнал, который может принимать любое количество значений, в отличие от цифрового сигнала, который имеет только два значения: высокий и низкий. Для измерения значения аналоговых сигналов в Arduino имеется встроенный аналого-цифровой преобразователь (АЦП). АЦП преобразует аналоговое напряжение в цифровое значение. Функция, которая используется для получения значения аналогового сигнала: analogRead(pin). Данная функция преобразует значение напряжения на аналоговом входном выводе и возвращает цифровое значение от 0 до 0123, относительно опорного значения. Для большинства Arduino опорное напряжение составляет 5В, 7В для Arduino Mini и Nano, и 15В для Arduino Mega. Она принимает лишь один параметр: номер вывода.

Arduino не содержит встроенного цифро-аналогового преобразователя (ЦАП), но она может использовать цифровой сигнала с широтно-импульсной модуляцией (ШИМ) для реализации функций по работе с аналоговым выходом. Функция, используемая для вывода ШИМ сигнала: analogWrite(pin, value). pin – это номер вывода, используемого для ШИМ выхода. value – это число, пропорциональное коэффициенту заполнения сигнала. Когда value = 0, на выходе всегда логический ноль. Когда value = 255, на выходе всегда логическая единица. На большинстве плат Arduino, ШИМ функции доступны на выводах 3, 5, 6, 9, 10 и 11. Частота ШИМ сигнала на большинстве выводов составляет примерно 490 Гц. На Uno и подобных платах выводы 5 и 6 работают на частоте примерно 980 Гц. Выводы 3 и 11 на Leonardo также работают честоте на 980 Гц.

Чтобы сопоставить аналоговое входное значение, которое находится в диапазоне от 0 до 1023, с выходным ШИМ сигналом, который находится в диапазоне от 0 до 255, вы можете использовать функцию map(value, fromLow, fromHigh, toLow, toHigh). Данная функция имеет пять параметров: в первом хранится аналоговое значение, а остальные равны соответственно 0, 1023, 0 и 255.

Эксперимент 1: управление яркостью светодиода

В данном эксперименте мы будем управлять яркостью светодиода с помощью ШИМ сигнала на аналоговом выходном выводе.

Необходимые компоненты

Схема соединений

Как показано на схеме ниже, светодиод подключается к выводу 2 Arduino. Для изменения яркости светодиода программа будет изменять коэффициент заполнения ШИМ сигнала на выводе 2.

схема соединений: Arduino аналоговые входы/выходы

Код программы

const int pwm = 2; 		// обозначение вывода 2, как переменная ‘pwm’

void setup()
{
  pinMode(pwm,OUTPUT); 	// установить режим вывода 2, как выход
}

void loop()
{
  analogWrite(pwm,25); 	// установка коэффициента заполнения, равным 25 
  delay(50); 			// задержка 50 мс
  analogWrite(pwm,50); 	
  delay(50); 
  analogWrite(pwm,75); 
  delay(50); 
  analogWrite(pwm,100); 
  delay(50); 
  analogWrite(pwm,125); 
  delay(50); 
  analogWrite(pwm,150); 
  delay(50); 
  analogWrite(pwm,175); 
  delay(50);
  analogWrite(pwm,200); 
  delay(50); 
  analogWrite(pwm,225); 
  delay(50); 
  analogWrite(pwm,250); 
}

Эксперимент 2: управление яркостью светодиода с помощью потенциометра

В данном эксперименте мы будем управлять яркостью светодиода, используя потенциометр. Мы воспользуемся функцией analogRead() для чтения напряжения и функцией analogWrite() для вывода ШИМ сигнала, коэффициент заполнения которого пропорционален аналоговому напряжению.

Необходимые компоненты

Схема соединений

Соберите схему, как показано ниже. Когда вы будете вращать ручку потенциометра, напряжение на выводе A0 будет меняться. После чего программа будет изменять коэффициент заполнения ШИМ сигнала на выводе 2, изменяя яркость светодиода.

схема соединений: Arduino аналоговые входы/выходы

Код программы

const int pwm = 2;	  // обозначение вывода 2, как переменная ‘pwm’ 
const int adc = 0; 	  // обозначение вывода 0, используемого в качестве 
                      // аналогового входа, как переменная ‘adc’

void setup()
{
  pinMode(pwm,OUTPUT);  // установить режим вывода 2, как выход
}

void loop()
{
  int adc  = analogRead(0);  // чтение аналогового напряжения и
                             // сохранение его значения в целочисленной 
                             // переменной 

  adc = map(adc, 0, 1023, 0, 255);  
  /* ---------- функция map ------------
    функция выше масштабирует выходное значение АЦП, который обладает 
    разрядностью 10 бит и выдает значения между 0 и 1023, в значения 
    между 0 и 255 для функции analogWrite, которая принимает значения 
    только в этом диапазоне.
  */
  
  analogWrite(pwm,adc) ; 
}


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


Сообщить об ошибке