PWM: емулиране на аналогови щифтове с вашата платка Arduino

ШИМ сигнали

С цифровите и аналоговите щифтове, които можете да използвате на вашата платка Arduino, можете да получавате или изпращате електрически сигнали за управление или получаване на данни от вашите електронни проекти. Освен това в този тип плоча има и други много интересни сигнали и това са ШИМ, които могат да емулират аналогов сигнал, без всъщност да са аналогови. Тоест те са цифрови щифтове, които могат да действат по подобен начин (не по същия начин) като аналогов сигнал.

Този тип сигнали са много практични, когато не само искате да използвате цифрови ВИСОКИ и НИСКИ сигнали, т.е. 1 или 0, ВКЛ и ИЗКЛ малко по-сложни сигнали. Например, възможно е да се модулира скоростта на a двигател постоянен ток, или интензивността на светлината на светлината, за соленоид и др.

Аналогова срещу цифрова система

Аналогов срещу цифров сигнал

Електронните вериги могат да бъдат разделени на две големи семейства или категории: цифров и аналогов. Когато говорим за цифрова електроника, ние използваме величини с дискретни стойности, т.е. двоична система, представена от електрически сигнали с ниско или високо напрежение, за да интерпретираме състоянието на тези битове, които се обработват. От друга страна, когато е аналогова схема, се използват величини с непрекъснати стойности.

В рамките на цифровите системи може да се намери на свой ред тези от комбинационен тип и тези от последователен тип. Тоест първите са тези, при които изходът на системата зависи само от състоянието на входовете. От друга страна, в последователните се включват елементи на паметта и изходът ще зависи от текущото състояние на входовете и предишното съхранено състояние.

В случая на аналозите няма тези две големи групи или варианти, тъй като тук те са непрекъснати сигнали, от които винаги ще зависи сигнала текуща система. Например в високоговорител подаденият към него сигнал ще зависи от звука, който искате да възпроизведете. Същото е и с микрофона, който ще генерира аналогов сигнал в зависимост от звука, който получава. Със сигурност сте го виждали и с много други сензори, които сме описали в този блог и които действат с аналогови сигнали (и следователно трябва да се създаде формула, така че по-късно стойностите да могат да бъдат изчислени или обусловени в скиците на Arduino IDE ) ...

Тези характеристики на едното и другото карат някои да имат свои собствени предимства и недостатъци, както е обичайно в почти всичко. Например цифровите са склонни да бъдат по-евтини, по-бързи, по-лесни за разработване, информацията може да се съхранява по-лесно, те имат по-голяма точност, могат да бъдат програмирани, те не са толкова уязвими към въздействието на шума и т.н. Вярно е също така, че с аналогов е възможно да се работи с по-сложни сигнали.

Por ejemplo, сензорът на Хол-ефект от цифров тип може да открива само наличието или отсъствието на близкото магнитно поле. Вместо това аналоговият сензор за ефект на Хол може да направи това и също така да определи плътността на споменатото магнитно поле благодарение на аналогов сигнал, който генерира на изхода му. Като знаете как да интерпретирате добре сигнала с по-голямо или по-малко напрежение, лесно можете да разберете тази величина. Имате други примери в множество величини от природата, които можете да измерите количествено с аналогова система, като температура, време, налягане, разстояние, звук и т.н.

Аналогов срещу цифров сигнал

Като се има предвид, а аналогов сигнал Това ще бъде напрежение или електрически ток, който варира във времето и непрекъснато. Ако се графицира, аналоговият сигнал ще бъде едночестотна синусоида.

Тъй като цифров сигнал, е напрежение, което варира постепенно по отношение на времето. Тоест, ако е представен в графика, това ще бъде стъпков сигнал, който не се променя непрекъснато, а се променя в стъпки или дискретни стъпки.

Трябва да знаете, че има схеми за преминаване от аналогов сигнал към цифров или обратно. Тези преобразуватели те са известни като DAC (цифрово-аналогов преобразувател) и ADC (аналогово-цифров преобразувател). И те са много често срещани в много устройства, които използваме днес, като телевизор, компютри и т.н. С тях можете да конвертирате цифровите сигнали, използвани от това оборудване, на електронно ниво за работа с други периферни устройства или части, които работят в аналогов режим.

Por ejemplo, високоговорител или микрофон с аналогови сигнали, който работи със звукова карта, или цифрови графични карти, които са имали известния RAMDAC чип за портовете за аналогов монитор ... В Arduino този тип преобразуватели се използват и за множество проекти, както ще видим ...

Какво е ШИМ?

графичен работен цикъл

Въпреки че ШИМ (модулация с широчина на импулса) или широчинно-импулсна модулация, има цифрова основа, формата на сигнала му наподобява донякъде "квадрат" аналогов сигнал. Той позволява чрез цифрови импулси да променя сигнала, за да емулира аналогова система, както вече коментирах по-рано. Всъщност, ако погледнете името, то вече ви дава улики за това, което прави, чрез ширината на цифровите импулси.

Това е от полза за Arduino тъй като има много автоматизми или електронни компоненти, които можете да добавите към вашите проекти и това не са в състояние да осигурят истински аналогов сигнал, но те използват този ШИМ за работа. Те също така не могат да използват дискретизиран аналогов сигнал, тоест, който преминава към скокове на напрежение, за да наподобява цифров. Това, което могат да направят, е да използват цифров изход -Vcc или Vcc от цифров тип, за да генерират този странен сигнал ...

Следователно PWM е един вид „трик“, с който Arduino и други системи могат да си взаимодействат с този тип сигнали, които те не са съвсем аналогови, нито са конвенционални цифрови. За да е възможно, те поддържат цифров изход активен за определено време или изключено, в зависимост от интереса през цялото време. Това далеч не е това, което би бил цифров часовник или двоичен кодов сигнал, чиито импулси имат еднаква ширина.

Във вашите проекти с Arduino можете да проверите този тип ШИМ сигнали, при които с течение на времето се поддържа постоянна честота на импулсните задействания, но ширината на тези импулси варира. Всъщност се нарича Duty Cycle, когато сигналът се поддържа високо по отношение на общия цикъл. Следователно дежурният цикъл е даден в%.

Не забравяйте, че в ШИМ не работите като в аналогов сигнал, между различни стойности на напрежението и той варира между тях. В случая на ШИМ това е квадратен сигнал в цифров стил и чиято максимална стойност е Vcc. Например, ако работите с 3V захранване, можете да дадете 3V или 0V импулси, но не 1V или някаква друга междинна стойност, каквато би се получила в реален аналог. Това, което ще варира в този случай, е ширината на импулса, която можем да поддържаме 30% при тази висока Vcc стойност, или 60%, за да му придадем повече мощност и т.н.

Но бъдете внимателни, защото ако дадено устройство поддържа Vcc ограничение и е надвишено с ШИМ, то може да бъде повредено. Така че винаги би било необходимо да се спазват стойностите на таблиците с данни, предоставени от производителите. Също така в някои устройства като DC двигатели, релета, електромагнити и др., отнемането на напрежение след цикъл на задействане може да означава, че индуктивните товари могат да причинят щети. Ето защо защити своевременно.

ШИМ на Arduino

Автобус Arduino I2C

След като вече знаете как работи, нека видим конкретния случай на ШИМ в света на Arduino ...

PWM: pinout на Arduino

На дъските на Arduino можете да намерите няколко щифта, които изпълняват хардуерна ШИМ. Можете да ги идентифицирате на самата печатна платка, защото те имат символ ~ (малка глава) заедно с номерирането на щифтовете. Това може да се направи и от софтуер в кода на Arduino, но това би претоварило микроконтролера с работа, нещо абсурдно, когато може да бъде направено от самото начало и от хардуер ...

  • Arduino UNO, Mini и Nano- Имате 6 8-битови PWM изхода на щифтове 3, 5, 6, 9, 10 и 11, които ще имат това ~ точно пред номера.
  • Arduino Mega: На тази най-мощна платка Arduino имате 15 8-битови PWM изхода. Те са на щифтове от 2 до 13 и от 44 до 46.
  • Arduino Due: в този случай има 13 8-битови PWM изхода. Те са на щифтове 2 до 13, плюс два други аналогови изхода, дискретизирани от ЦАП с 12-битова резолюция.

Когато говорите за 8-битова или 12-битова разделителна способност и т.н., в този тип ШИМ изходи имате предвид пространството за маневриране, което имате. С 8 бита имат 256 нива между които можете да варирате и 12-те бита достигат до 4096 нива.

Контрол с таймери

За хардуерен ШИМ контрол, Arduino ще използва таймерите за него. Всеки настоящ таймер може да обслужва 2 или 3 PWM изхода. Регистърът за сравнение за всеки изход допълва тази система, така че когато времето достигне стойността на регистъра, състоянието или стойността на изхода се променя, за да спре тези работни цикли. Въпреки че има два изхода, контролирани от един и същ таймер, и двата могат да имат различни работни цикли, въпреки че имат еднаква честота.

В случай на таймерите, свързани с всеки PWM пин, той ще варира в зависимост от вида на дъската Arduino че имаш:

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

Предкалираният регистър ще раздели времето на цяло число, а таймерът прави останалото, за да контролира всеки от свързаните PWM изходи. Промяната на стойността на системния регистър може да промени честотата. The честота Те също ще бъдат различни в зависимост от таймера и табелата:

  • Arduino UNO, Mini и Nano:
    • Timer0: позволява предварително мащабиране на 1, 8, 64, 256 и 1024. Честотата е 62.5 Khz.
    • Таймер1: с предварителни настройки от 1, 8, 64, 256 и 1024. С честота 31.25 Khz.
    • Timer2: равен на Timer1, само че добавя предварително скалиране на 32 и 128 в допълнение към предишните.
  • Arduino Mega:
    • Таймер 0, 1, 2: същото като по-горе.
    • Таймер 3, 4 и 5: с честота 31.25 Khz и предварително мащабирани 1, 8, 64, 256 и 1024.

Несъвместимости и конфликти

Таймерът свързано с изходите не е само за тази функция, се използва и от други. Следователно, ако те се използват от друга функция, трябва да избирате между едната или другата, не можете да използвате и двете едновременно. Например, това са някои от несъвместимостите, които можете да намерите във вашите проекти:

  • Серво библиотека: Когато използвате серво мотори, таймерите се използват интензивно, така че това може да генерира конфликти. По-конкретно използвайте Timer1 за UNO, Nano и Mini, тоест не можете да използвате щифтове 9 и 10, докато използвате скица с тази библиотека. В Mega това ще зависи от броя на серво ...
  • SPI: Ако се използва SPI комуникация на платката Arduino, щифт 11 се използва за функцията MOSI. Ето защо този ШИМ щифт не може да се използва.
  • Тонус: тази функция използва Timer2 за работа. Така че, ако се използва, правите щифтове 3 и 11 (или 9 и 10 за Mega) безполезни.

Практически тест с Arduino

ШИМ на Arduino с LED

Ако искате да видите на място как PWM работи на Arduino, най-доброто нещо, което можете да направите, е да свържете измервателните проводници на волтметър или мултицет (във функция за измерване на напрежението) между PWM щифта, който сте избрали да използвате, и заземяващия щифт или GND на платката Arduino. По този начин на екрана на измервателното устройство ще можете да видите как се променя напрежението с цифров изход, благодарение на този трик с ШИМ.

Можете да замените волтметъра / мултиметъра със светодиод, за да видите как варира интензивността на светлината, с мотор с постоянен ток или с друг елемент, който искате. Опростих го в диаграмата с Fritzing с LED без повече, но знайте, че може да представлява и върховете на мултиметър ...

Ако използвате LED, запомнете съпротивлението на катода и GND.

за изходния код За да контролирате микроконтролера на платката Arduino, за да накара всичко да работи, трябва да го вмъкнете в Arduino IDE (в този случай използвах PWM пин 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 е свързан към сериен порт, но не знам как и какво да променя, така че да се извеждат различни напрежения. Трябваше да направя незначителни корекции в кода, за да го компилирам. Благодаря ви много за вашата помощ