Файл: Лабораторная работа 2 (Формирование управляющих воздействий).pdf

Добавлен: 15.11.2018

Просмотров: 1092

Скачиваний: 11

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

 

не  зависит  от  разрядности  преобразуемого  кода.  Однако  по  быстродействию 
последовательный  ЦАП  значительно  уступает  параллельным  цифро-аналоговым 
преобразователям, что ограничивает область его применения [2]. 

Параллельные ЦАП 

Среди  параллельных  ЦАП  наблюдается  наибольшее  разнообразие.  К  тому  же  по 

многим параметрам они значительно превосходят последовательные ЦАП. 

Дельта-сигма ЦАП 

Дельта-сигма  ЦАП  относятся  к  классу  ЦАП  передискретизации.  Их  работа 

основана  на  изменяемой  плотности  импульсов.  Такие  преобразователи  при  небольшой 
собственной  разрядности  обеспечивают  достаточно  большую  разрядность  итогового 
преобразования.  На  ЦАП  поступает  импульсный  сигнал  с  постоянной  длительностью 
импульсов,  но  с  изменяемой  скважностью,  который  формируется  с  помощью  цепи 
отрицательной обратной связи. Цепь отрицательной обратной связи выполняет функцию 
фильтра  высоких  частот  для  шума  квантования.  Быстродействие  дельта-сигма  ЦАП 
достигает сотни тысяч отсчетов в секунду, разрядность – 24 бит. [4]. 

Ход работы 

Если лабораторная работа выполняется не в аудитории, то её можно выполнить в 

симуляторе,  например,  Virtual  Breadboard  (http://www.virtualbreadboard.com/),  Virtronics 
Simulator 

for 

Arduino 

(http://www.virtronics.com.au/), 

Autodesk 

123D 

Circuits 

(https://circuits.io/), Fritzing (http://fritzing.org/home/) или любом другом. 

Управление RGB-светодиодом с общим катодом через дискретные порты 

Изучение  принципов  работы  с  исполнительными  устройствами  через  дискретные 

интерфейсы контроллера Arduino начнём с простого. Роль исполнительного устройства (а 
точнее  даже  трёх  исполнительных  устройств)  будет  играть  RGB-светодиод  на  печатной 
плате (рисунок 4а). RGB-светодиод содержит в одном корпусе три светодиода (триаду) – 
красный (R, Red), зелёный (G, Green) и синий (B, Blue). 

 

 

а) RGB-светодиод с общим катодом на 

печатной плате; 

б) электрическая принципиальная схема 

печатной платы с RGB-светодиодом с 

общим катодом 

Рисунок 4 – RGB-светодиод с общим катодом 


background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

 

У  RGB-светодиода  с  общим  катодом  отрицательные  выводы  (катоды) 

светоизлучающих  диодов  (СИД)  соединены  общей  точкой,  а  положительные  выводы 
(аноды)  через  токоограничивающие  резисторы  выведены  на  три  штырька  разъёма 
(рисунок 4б). 

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

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

 

Рисунок 5

 

– Кнопка с подтягивающим резистором на печатной плате 

Электрическая схема подключения  RGB-светодиода с общим катодом и кнопки к 

Arduino показана на рисунке 6, а соответствующий код – в листинге 1. 

 

Рисунок 6

 

– Электрическая схема подключения RGB-светодиода с общим катодом 

и кнопки к Arduino 

Листинг 1 – Управление одним исполнительным устройством на примере 

RGB-светодиода с общим катодом 

#define RLED_PIN 3 

//Номер порта для подключения красного светодиода

 

#define GLED_PIN 5 

//Номер порта для подключения зелёного светодиода

 

#define BLED_PIN 6 

//Номер порта для подключения синего светодиода

 

#define BTN_PIN 2  

//Номер порта для подключения кнопки

 

 
bool btnState; 

//Состояние кнопки (нажата/не нажата)

 

 
void setup() 

 

// put your setup code here, to run once: 

  pinMode(RLED_PIN, OUTPUT); 

//Настроить порты

 

  pinMode(GLED_PIN, OUTPUT); 

//светодиодов на вывод

 

  pinMode(BLED_PIN, OUTPUT); 

//дискретных сигналов

 

  pinMode(BTN_PIN, INPUT);   

//Настроить порт кнопки на ввод сигнала

 


background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

 

 
void loop() 

 

// put your main code here, to run repeatedly: 

  btnState = digitalRead(BTN_PIN); 

//Считать состояние кнопки в переменную

 

  if (btnState == 1) digitalWrite(RLED_PIN, HIGH); 
    else digitalWrite(RLED_PIN, LOW); 
  delay(50); 

//Задержка программы длительностью 50 мс

 

После  загрузки  программы  в  плату  Arduino  можно  посмотреть  результат  её 

выполнения  –  при  нажатии  на  кнопку,  подачей  на  выход  контроллера  высокого 
логического  уровня  (лог.  1),  включается  красный  светодиод,  а  после  отпускания  кнопки 
он гаснет (на выход подаётся низкий логический уровень, лог. 0). 

Модифицируйте программу так, чтобы: 

1)  включался светодиод другого цвета; 
2)  включалось одновременно несколько светодиодов; 
3)  при  первом  нажатии  и  отпускании  кнопки  зажигался  один  (или  несколько) 

светодиод, а при втором – он гас. 

Управление RGB-светодиодом с общим анодом через дискретные порты 

Помимо RGB-светодиодов с общим катодом существуют также и RGB-светодиоды 

с общим анодом (общий «+»). У RGB-светодиода с общим анодом (рисунок 7а), наоборот, 
положительные  выводы  (аноды)  светоизлучающих  диодов  соединены  общей  точкой,  а 
отрицательные выводы (катоды) через токоограничивающие резисторы выведены на три 
штырька  разъёма  (рисунок  7б).  Теперь  для  того,  чтобы  зажечь  отдельный  светодиод 
триады, нужно будет вывести на порт, к которому подключён светодиод, сигнал низкого 
уровня (лог. 0), а чтобы погасить – сигнал высокого уровня (лог. 1). 

 

 

а) RGB-светодиод с общим анодом на 

печатной плате; 

б) электрическая принципиальная схема 

печатной платы с RGB-светодиодом с 

общим анодом 

Рисунок 7 – RGB-светодиод с общим анодом 

Электрическая  схема  подключения  RGB-светодиода  с  общим  анодом  и  кнопки  к 

Arduino показана на рисунке 8, а модифицированный код программы – в листинге 2. 


background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

 

 

Рисунок 8

 

– Электрическая схема подключения RGB-светодиода с общим анодом и 

кнопки к Arduino 

Листинг 2 – Управление одним исполнительным устройством на примере 

RGB-светодиода с общим анодом 

#define RLED_PIN 3 

//Номер порта для подключения красного светодиода

 

#define GLED_PIN 5 

//Номер порта для подключения зелёного светодиода

 

#define BLED_PIN 6 

//Номер порта для подключения синего светодиода

 

#define BTN_PIN 2  

//Номер порта для подключения кнопки

 

 
bool btnState; 

//Состояние кнопки (нажата/не нажата)

 

 
void setup() 

 

// put your setup code here, to run once: 

  pinMode(RLED_PIN, OUTPUT); 

//Настроить порты

 

  pinMode(GLED_PIN, OUTPUT); 

//светодиодов на вывод

 

  pinMode(BLED_PIN, OUTPUT); 

//дискретных сигналов 

  digitalWrite(RLED_PIN, HIGH); 

//Погасить все

 

  digitalWrite(GLED_PIN, HIGH); 

//светодиоды

 

  digitalWrite(BLED_PIN, HIGH); 

//триады

 

  pinMode(BTN_PIN, INPUT);   

//Настроить порт кнопки на ввод сигнала

 


 
void loop() 

 

// put your main code here, to run repeatedly: 

  btnState = digitalRead(BTN_PIN); 

//Считать состояние кнопки в переменную

 

  if (btnState == 1) digitalWrite(RLED_PIN, LOW); 
    else digitalWrite(RLED_PIN, HIGH); 
  delay(50); 

//Задержка программы длительностью 50 мс

 

Предложите другие способы модифицировать программы. 

Усложним  задачу.  Теперь  будем  управлять  всей  триадой  светодиодов. 

Единственной  кнопкой  будем  перебирать  все  возможные  цвета  RGB-светодиода, 
подключённого  к  дискретным  портам  вывода,  а  всего  их  можно  воспроизвести  2

3

-1=7 

цветов  и  одно  состояние  «погашены  все».  Можно  написать  программу,  где  бы 
устанавливалось  каждое  состояние  триады  светодиодов,  путём  установки  сигналов 
(HIGH/LOW) на трёх дискретных выводах. Но можно найти более изящное решение. Для 
этого  построим  куб  соседних  чисел,  описывающий  все  возможные  состояния  триады 
светодиодов (рисунок 9). 


background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

10 

 

 

Рисунок 9

 

– Куб соседних чисел состояний триады RGB-светодиода 

Для RGB-светодиода с общим катодом состояние лог. 1 соответствует зажжённому 

светодиоду,  а  лог.  0  –  погашенному.  Для  RGB-светодиода  с  общим  катодом  наоборот  – 
состояние  лог.  1  соответствует  погашенному  светодиоду,  а  лог.  0  –  зажжённому.  Для 
обхода куба нужно выбрать начальное состояние, пройти по всем дугам по одному разу, и 
вернуться в начальное состояние. Код программы приведён в листинге 3. 

Листинг 3 – Управление тремя исполнительным устройством на примере 

RGB-светодиода с общим анодом 

#define RLED_PIN 3 

//Номер порта для подключения красного светодиода

 

#define GLED_PIN 5 

//Номер порта для подключения зелёного светодиода

 

#define BLED_PIN 6 

//Номер порта для подключения синего светодиода

 

#define BTN_PIN 2  

//Номер порта для подключения кнопки

 

 
bool btnState = 0; 

//Состояние кнопки (нажата/не нажата)

 

byte cntClick = 0; 

//Счётчик количества нажатий кнопки

 

 
void setup() 

 

// put your setup code here, to run once: 

  pinMode(RLED_PIN, OUTPUT); 

//Настроить порты 

  pinMode(GLED_PIN, OUTPUT); 

//светодиодов на вывод

 

  pinMode(BLED_PIN, OUTPUT); 

//дискретных сигналов

 

  digitalWrite(RLED_PIN, HIGH); 

//Погасить все

 

  digitalWrite(GLED_PIN, HIGH); 

//светодиоды 

  digitalWrite(BLED_PIN, HIGH); 

//триады

 

  pinMode(BTN_PIN, INPUT); 

//Настроить порт кнопки на ввод сигнала 


 
void loop() 

 

// put your main code here, to run repeatedly: 

  btnState = digitalRead(BTN_PIN); 

//Считать состояние кнопки в переменную

 

  if (btnState == 1) 

//Если кнопка нажата, то... 

  { 
    while (btnState == 1) 

//ждать, пока кнопка не отпущена

 

    
      delay(10); 

//Через 10 мс 

      btnState = digitalRead(BTN_PIN); 

//прочитать состояние кнопки ещё раз 

    
    cntClick++; 

//Теперь можно сосчитать нажатие на кнопку

 

    if (cntClick > 7) cntClick = 0; 

//Если это 8-е нажатие, считать его 0-вым 

  }