ШИМ: эмуляция аналоговых выводов на плате Arduino

Сигналы ШИМ

С помощью цифровых и аналоговых контактов, которые вы можете использовать на своей плате Arduino, вы можете получать или отправлять электрические сигналы для управления или получения данных из ваших электронных проектов. Кроме того, в этом типе пластин есть и другие очень интересные сигналы, и это PWM который может имитировать аналоговый сигнал, но не является аналоговым. То есть это цифровые контакты, которые могут действовать аналогично (не так), как аналоговый сигнал.

Эти типы сигналов очень практичны, когда вы не только хотите использовать цифровые сигналы HIGH и LOW, то есть 1 или 0, ON и OFF, но вы хотите пойти дальше и описать несколько более сложные сигналы. Например, можно регулировать скорость Двигатель постоянного тока, или интенсивность света для соленоида и т. д.

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

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

Электронные схемы можно разделить на два больших семейства или категории: цифровой и аналоговый. Говоря о цифровой электронике, мы используем величины с дискретными значениями, то есть двоичную систему, представленную электрическими сигналами низкого или высокого напряжения, чтобы интерпретировать состояние тех битов, которые обрабатываются. С другой стороны, когда это аналоговая схема, используются величины с непрерывными значениями.

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

В случае аналогов нет этих двух больших групп или вариантов, поскольку здесь они представляют собой непрерывные сигналы, которые всегда будут зависеть от La Señal текущая система. Например, в громкоговорителе подаваемый вами сигнал зависит от звука, который вы хотите воспроизвести. То же самое с микрофоном, который будет генерировать аналоговый сигнал в зависимости от принимаемого звука. Конечно, вы также видели это со многими другими датчиками, которые мы описали в этом блоге и которые действуют с аналоговыми сигналами (и, следовательно, должна была быть создана формула, чтобы впоследствии значения могли быть рассчитаны или обусловлены в эскизах Arduino IDE. ) ...

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

По пример, датчик Холла цифрового типа может определять только наличие или отсутствие близлежащего магнитного поля. Вместо этого аналоговый датчик на эффекте Холла может это делать, а также определять плотность упомянутого магнитного поля благодаря аналоговому сигналу, который он генерирует на своем выходе. Зная, как хорошо интерпретировать этот сигнал большего или меньшего напряжения, вы легко можете узнать эту величину. У вас есть другие примеры множества величин природы, которые вы можете количественно измерить с помощью аналоговой системы, такие как температура, время, давление, расстояние, звук и т. Д.

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

При этом аналоговый сигнал Это будет напряжение или электрический ток, которые постоянно меняются со временем. На графике аналоговый сигнал будет одночастотным синусоидальным сигналом.

Что же касается цифровой сигнал, представляет собой напряжение, ступенчато изменяющееся во времени. То есть, если он представлен на графике, это будет сигнал шага, который не изменяется непрерывно, а изменяется шагами или дискретными приращениями.

Вы должны знать, что существуют схемы перехода от аналогового сигнала к цифровому или наоборот. Эти конвертеры они известны как ЦАП (цифро-аналоговый преобразователь) и АЦП (аналого-цифровой преобразователь). И они очень часто встречаются во многих устройствах, которые мы используем сегодня, например, телевизорах, компьютерах и т. Д. С их помощью вы можете преобразовывать цифровые сигналы, используемые этим оборудованием, на электронный уровень для работы с другими периферийными устройствами или частями, работающими в аналоговом режиме.

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

Что такое ШИМ?

графический рабочий цикл

Хотя ШИМ (широтно-импульсная модуляция) или широтно-импульсная модуляция, имеет цифровую основу, форма его сигнала напоминает несколько «квадратный» аналоговый сигнал. Это позволяет с помощью цифровых импульсов изменять сигнал для имитации аналоговой системы, как я уже комментировал ранее. Фактически, если вы посмотрите на название, оно уже дает вам представление о том, что оно делает, по ширине цифровых импульсов.

Это полезно для Arduino поскольку есть много автоматизмов или электронных компонентов, которые вы можете добавить в свои проекты, и это не способны обеспечить настоящий аналоговый сигнал, но они используют эту ШИМ для работы. Они также не могут использовать дискретный аналоговый сигнал, то есть, который имеет скачки напряжения, чтобы напоминать цифровой. Что они могут сделать, так это использовать цифровой выход -Vcc или Vcc цифрового типа для генерации этого своеобразного сигнала ...

Следовательно, ШИМ - это своего рода «трюк», с помощью которого Arduino и другие системы могут взаимодействовать с этим типом сигналов, которые они не становятся полностью аналоговыми или традиционными цифровыми. Чтобы сделать это возможным, они постоянно держат цифровой выход активным в течение определенного времени или выключенным, в зависимости от интереса. Это далеко не то, что было бы цифровым тактовым сигналом или сигналом двоичного кода, импульсы которого имеют одинаковую ширину.

В своих проектах с Arduino вы можете проверить этот тип сигналов ШИМ, в которых поддерживается постоянная частота импульсных триггеров с течением времени, но ширина этих импульсов варьируется. Фактически, это называется рабочим циклом, когда сигнал поддерживается на высоком уровне по отношению к общему циклу. Следовательно, рабочий цикл указан в%.

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

Но будьте осторожны, потому что, если устройство поддерживает предел Vcc и превышается с помощью PWM, оно может быть повреждено. Поэтому всегда необходимо соблюдать значения, указанные в таблицах данных, предоставленных производителями. Кроме того, в некоторых устройствах, таких как двигатели постоянного тока, реле, электромагнитов и т. д., пропадание напряжения после рабочего цикла может означать, что индуктивные нагрузки могут вызвать повреждение. Вот почему защиты своевременно.

ШИМ на Arduino

Шина Arduino I2C

Теперь, когда вы знаете, как это работает, давайте посмотрим на конкретный случай ШИМ в мире Arduino ...

PWM: распиновка на 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.
  • Ардуино из-за: в данном случае имеется 13 8-битных выходов ШИМ. Они подключены к контактам со 2 по 13, а также к двум другим аналоговым выходам, дискретизированным ЦАП с разрешением 12 бит.

Когда вы говорите о разрешении 8 или 12 бит и т. Д. В этом типе выходов PWM, вы имеете в виду пространство для маневра, которое у вас есть. С участием 8 бит имеют 256 уровней Между которыми вы можете варьироваться, а 12 бит увеличиваются до 4096 уровней.

Управление с помощью таймеров

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

В случае таймеров, связанных с каждым выводом ШИМ, он будет варьироваться в зависимости от типа платы 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

Предварительно масштабированный регистр разделит время на целое число, а таймер сделает все остальное, чтобы управлять каждым из связанных выходов ШИМ. Изменение значения реестра может изменить частоту. В частота Также они будут разными в зависимости от Таймера и тарелки:

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

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

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

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

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

Схема ШИМ Arduino со светодиодом

Если вы хотите увидеть на месте, как ШИМ работает на Arduino, лучшее, что вы можете сделать, это подключить измерительные провода вольтметр или мультиметр (в функции измерения напряжения) между выводом PWM, который вы выбрали для использования, и выводом заземления или GND платы Arduino. Таким образом, на экране измерительного устройства вы сможете увидеть, как изменяется напряжение на цифровом выходе, благодаря этой уловке с ШИМ.

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

Если вы используете светодиод, запомните сопротивление на катоде и GND.

к исходный код Чтобы управлять микроконтроллером платы Arduino, чтобы все работало, вы должны вставить его в Arduino IDE (в данном случае я использовал вывод ШИМ 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 подключен к последовательному порту, но я не знаю, как и что менять, чтобы выводились разные напряжения. Мне пришлось внести незначительные изменения в код, чтобы он скомпилировался. Большое спасибо за Вашу помощь