ШІМ: емуляція аналогових контактів на платі Arduino

ШІМ-сигнали

За допомогою цифрових та аналогових контактів, які ви можете використовувати на платі Arduino, ви можете отримувати або надсилати електричні сигнали для управління або отримання даних з ваших електронних проектів. Крім того, у цього типу плит є й інші дуже цікаві сигнали, і це такі ШІМ, які можуть емулювати аналоговий сигнал, не будучи фактично аналоговим. Тобто це цифрові висновки, які можуть діяти подібним чином (не однаково) як аналоговий сигнал.

Ці типи сигналів дуже практичні, коли ви не тільки хочете використовувати цифрові сигнали ВИСОКОГО і НИЗЬКОГО, тобто 1 або 0, УВІМКНЕНО і ВИМКНЕНО, але ви хочете піти далі і описати дещо складніші сигнали. Наприклад, можна модулювати швидкість a двигун постійного струму, або інтенсивність світла для соленоїда тощо.

Аналоговий проти цифрової системи

Аналоговий та цифровий сигнал

Електронні схеми можна розділити на дві великі родини або категорії: цифровий та аналоговий. Говорячи про цифрову електроніку, ми використовуємо величини з дискретними значеннями, тобто двійкову систему, представлену електричними сигналами низької або високої напруги, для інтерпретації стану тих бітів, які обробляються. З іншого боку, коли це аналогова схема, використовуються величини з безперервними значеннями.

Внутрішні цифрові системи можна знайти по черзі комбінованого типу та послідовного типу. Тобто перші - це ті, в яких вихід системи залежить лише від стану входів. З іншого боку, в послідовні включаються елементи пам'яті, і вихід буде залежати від поточного стану входів та попереднього збереженого стану.

У випадку з аналогами цих двох великих груп чи варіантів немає, оскільки тут вони є безперервними сигналами, від яких завжди буде залежати сигналу чинна система. Наприклад, у гучномовці подається на нього сигнал залежить від звуку, який ви хочете відтворити. Те саме з мікрофоном, який буде генерувати аналоговий сигнал залежно від звуку, який він приймає. Звичайно, ви також бачили це з багатьма іншими датчиками, які ми описали в цьому блозі, і які діють з аналоговими сигналами (і, отже, потрібно було створити формулу, щоб пізніше значення могли бути обчислені або обумовлені в ескізах Arduino IDE ) ...

Ці характеристики одного і іншого змушують деяких мати свої переваги і недоліки, як зазвичай майже у всьому. Наприклад, цифрові, як правило, дешевші, швидші, легші у розробці, інформацію можна легше зберігати, вони мають більшу точність, їх можна запрограмувати, вони не настільки вразливі до впливу шуму тощо. Але це також правда, що з аналогами ви можете працювати з більш складними сигналами.

За приклад, датчик ефекту Холла цифрового типу може виявляти лише наявність або відсутність поруч магнітного поля. Натомість аналоговий датчик ефекту Холла може це зробити, а також визначати щільність згаданого магнітного поля завдяки аналоговому сигналу, який він генерує на своєму виході. Знаючи, як добре інтерпретувати сигнал більшої чи меншої напруги, ви можете легко знати цю величину. У вас є інші приклади в безлічі величин природи, які ви можете кількісно виміряти за допомогою аналогової системи, такі як температура, час, тиск, відстань, звук тощо.

Аналоговий та цифровий сигнал

Сказано, a аналоговий сигнал Це буде напруга або електричний струм, який змінюється з часом і безперервно. Якщо зобразити графічно, аналоговим сигналом буде одиночна синусоїда.

Що стосується цифровий сигнал, - напруга, яка поступово змінюється щодо часу. Тобто, якщо він представлений на графіку, це буде ступінчастий сигнал, який не змінюється безперервно, а змінюється в кроках або дискретних кроках.

Ви повинні знати, що існують схеми для переходу від аналогового сигналу до цифрового або навпаки. Ці перетворювачі вони відомі як ЦАП (цифро-аналоговий перетворювач) та АЦП (аналого-цифровий перетворювач). І вони дуже поширені в багатьох пристроях, якими ми користуємося сьогодні, таких як телевізор, комп’ютери тощо. За допомогою них ви можете перетворити цифрові сигнали, що використовуються цим обладнанням, на електронний рівень для роботи з іншими периферійними пристроями або частинами, які працюють в аналоговому режимі.

За приклад, динамік або мікрофон з аналоговими сигналами, що працює зі звуковою картою, або цифрові відеокарти, які мали знаменитий чіп RAMDAC для портів аналогових моніторів ... В Arduino цей тип перетворювачів також використовується для декількох проектів, як ми побачимо ...

Що таке ШІМ?

графічний робочий цикл

Хоча ШІМ (широтно-імпульсна модуляція), або широтно-імпульсна модуляція, має цифрову базу, форма його сигналу нагадує дещо «квадратний» аналоговий сигнал. Це дозволяє за допомогою цифрових імпульсів змінювати сигнал для емуляції аналогової системи, як я вже коментував раніше. Насправді, якщо ви подивитесь на назву, вона вже дає вам підказки про те, що вона робить, через ширину цифрових імпульсів.

Це вигідно для Arduino оскільки існує безліч автоматизмів або електронних компонентів, які ви можете додати до своїх проектів не здатні подавати справжній аналоговий сигнал, але вони використовують цей ШІМ для роботи. Вони також не можуть використовувати дискретизований аналоговий сигнал, тобто який спрямовується на стрибки напруги, щоб нагадувати цифровий. Що вони можуть зробити, це використовувати цифровий вихід -Vcc або Vcc цифрового типу для генерації цього своєрідного сигналу ...

Тому ШІМ - це свого роду "фокус", за допомогою якого Arduino та інші системи можуть взаємодіяти з такими типами сигналів, які вони не є цілком аналоговими і не є звичайними цифровими. Щоб це стало можливим, вони підтримують цифровий вихід активним протягом певного часу або відключено, залежно від зацікавленості. Це далеко не те, що було б цифровим годинником або сигналом двійкового коду, імпульси якого мають однакову ширину.

У своїх проектах з Arduino ви можете перевірити цей тип ШІМ-сигналів, в яких з часом підтримується постійна частота імпульсних тригерів, але ширина цих імпульсів варіюється. Насправді це називається робочим циклом, коли сигнал тримається на високому рівні по відношенню до загальної кількості циклу. Отже, робочий цикл дається у%.

Пам'ятайте, що в ШІМ ви працюєте не так, як в аналоговому сигналі, між різними значеннями напруги, і воно коливається між ними. У випадку ШІМ це квадратний сигнал у цифровому стилі та максимальне значення якого - Vcc. Наприклад, якщо ви працюєте з джерелом живлення 3 В, ви можете подавати імпульси 3 В або 0 В, але не 1 В або будь-яке інше проміжне значення, яке могло б відбуватися у реальному аналозі. У такому випадку буде змінюватися ширина імпульсу, яку ми можемо підтримувати на 30% при цьому високому значенні Vcc, або 60%, щоб надати йому більше потужності тощо

Але будьте обережні, тому що якщо пристрій підтримує обмеження Vcc та перевищує ШІМ, це може бути пошкоджено. Тому завжди потрібно було б дотримуватися значень таблиць даних, що надаються виробниками. Крім того, в деяких пристроях, таких як двигуни постійного струму, реле, електромагніти тощо, зняття напруги після робочого циклу може означати, що індуктивні навантаження можуть спричинити пошкодження. Ось чому огородження своєчасно.

ШІМ на Arduino

Шина Arduino I2C

Тепер, коли ви знаєте, як це працює, давайте розглянемо конкретний випадок ШІМ у світі Arduino ...

ШІМ: розписування на Arduino

На платах Arduino можна знайти кілька контактів, що реалізують апаратний ШІМ. Ви можете ідентифікувати їх на самій друкованій платі, оскільки вони мають символ ~ (мала голова) поряд з нумерацією штифтів. Це також може бути зроблено за допомогою програмного забезпечення в коді Arduino, але це перевантажить мікроконтролер роботою, щось абсурдне, коли це можна зробити власноруч та апаратно ...

  • Arduino UNO, Mini та Nano- У вас є 6 8-розрядних ШІМ-виходів на контактах 3, 5, 6, 9, 10 і 11, які матимуть це ~ прямо перед номером.
  • arduino мега- На цій найпотужнішій платі Arduino у вас є 15 8-бітових ШІМ-виходів. Вони знаходяться на штифтах з 2 по 13 і з 44 по 46.
  • Arduino Duet: у цьому випадку є 13 8-бітових ШІМ-виходів. Вони розташовані на виводах 2-13, плюс два інших аналогових виходи, дискретизовані ЦАП з 12-бітовою роздільною здатністю.

Коли ви говорите про 8-бітову або 12-бітову роздільну здатність тощо, в цьому типі ШІМ-виходів ви маєте на увазі наявний у вас простір для маневру. С 8 бітів мають 256 рівнів Між якими ви можете варіювати, і 12 бітів піднімаються до 4096 рівнів.

Керування за допомогою таймерів

Для апаратного управління ШІМ, Arduino використовуватиме таймери для нього. Кожен присутній таймер може обслуговувати 2 або 3 ШІМ-виходи. Регістр порівняння для кожного виходу доповнює цю систему, так що, коли час досягає значення реєстру, стан або значення виходу змінюються, щоб зупинити ці робочі цикли. Хоча є два виходи, керовані одним і тим же таймером, обидва можуть мати різні робочі цикли, хоча вони мають однакову частоту.

У випадку таймерів, пов'язаних з кожним ШІМ-контактом, він буде відрізнятися залежно від типу плати Arduino що у вас є:

  • Arduino UNO, Mini та Nano:
    • Таймер0 - 5 і 6
    • Таймер1 - 9 і 10
    • Таймер2 - 3 і 11
  • arduino мега:
    • Таймер0 - 4 і 13
    • Таймер1 - 11 і 12
    • Таймер2 - 9 і 10
    • Таймер3 - 2, 3 і 5
    • Таймер4 - 6, 7 і 8
    • Таймер5 - 44, 45 і 46

Попередньо розрахований регістр буде ділити час на ціле число, а таймер виконує решту, щоб керувати кожним з пов'язаних виходів ШІМ. Зміна значення реєстру може змінити частоту. частоти Вони також будуть різними залежно від таймера та таблички:

  • Arduino UNO, Mini та Nano:
    • Таймер0: дозволяє попередньо масштабувати 1, 8, 64, 256 і 1024. Частота становить 62.5 кГц.
    • Таймер1: з пресетами 1, 8, 64, 256 і 1024. З частотою 31.25 кГц.
    • Timer2: дорівнює Timer1, лише додає попереднє масштабування 32 та 128 на додаток до попередніх.
  • arduino мега:
    • Таймер0, 1, 2: такий же, як і вище.
    • Таймер 3, 4 і 5: з частотою 31.25 кГц і попередньо масштабованим 1, 8, 64, 256 і 1024.

Несумісність і конфлікти

Таймер пов'язаний з виходами не тільки для цієї функції, також використовується іншими. Отже, якщо вони використовуються іншою функцією, ви повинні вибрати між тим чи іншим, ви не можете використовувати обидва одночасно. Наприклад, це деякі несумісності, які ви можете знайти у своїх проектах:

  • Сервобібліотека: Коли ви використовуєте серводвигуни, він інтенсивно використовує таймери, тому може спричинити конфлікти. Зокрема, використовуйте Timer1 для UNO, Nano та Mini, тобто ви не можете використовувати штифти 9 і 10 під час використання ескізу з цією бібліотекою. У Mega це буде залежати від кількості сервоприводів ...
  • SPI: Якщо на платі Arduino використовується зв’язок SPI, для функції MOSI використовується штифт 11. Ось чому цей ШІМ-штир не можна використовувати.
  • Тон: ця функція використовує Timer2 для роботи. Отже, якщо він використовується, ви робите штифти 3 і 11 (або 9 і 10 для Mega) марними.

Практичний тест з Arduino

Схема ШІМ Arduino зі світлодіодом

Якщо ви хочете побачити, як ШІМ працює на місці в Arduino, найкраще, що ви можете зробити, це підключити вимірювальні кабелі вольтметр або мультиметр (функція вимірювання напруги) між ШІМ-контактом, який Ви вибрали для використання, і контактним заземленням або GND плати Arduino. Таким чином, на екрані вимірювального приладу ви зможете побачити, як змінюється напруга із цифровим виходом завдяки цьому трюку ШІМ.

Ви можете замінити вольтметр / мультиметр світлодіодом, щоб побачити, як змінюється інтенсивність світла, двигуном постійного струму або будь-яким іншим елементом, який ви хочете. Я спростив це на схемі з Fritzing зі світлодіодом без більше, але ви знаєте, що це також може представляти підказки мультиметра ...

Якщо ви використовуєте світлодіод, пам’ятайте про опір катода та GND.

в вихідний код Щоб керувати мікроконтролером плати Arduino, щоб все працювало, слід вставити це в IDE Arduino (у цьому випадку я використав ШІМ-штифт 6 Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
Раджу пограти зі цінностями і подивитися результати на світлі або вольтметрі. Програма може отримувати значення від 0 до 9, щоб ви могли бачити, як все змінюється. Для отримання додаткової інформації я раджу вам курс ардуїно що ми маємо у вільному завантаженні ...

Коментар, залиште свій

Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   Хосе - сказав він

    Привіт добрий день. Перш за все я хочу подякувати вам за час, присвячений цьому поясненню для найновіших.
    Я хотів би зробити вам запит. Я намагаюся запустити код на емуляторі proteus 8 для Arguino Mega. Я підключаю вольтметр до виводу 6, Proteus підключений до послідовного порту, але я не знаю, як і що змінювати, щоб виходили різні напруги. Мені довелося внести незначні корективи в код, щоб він скомпілювався. Велике спасибі за вашу допомогу