4.02.1. Лабораторная работа №4.2.1.md


Визуализация ШИМ-сигнала

Тема работы

Мы знаем, что ШИМ — это очень быстрые прямоугольные импульсы. Но можно ли их «поймать» с помощью простой команды digitalRead()? Что она покажет, если сигнал меняется сотни раз в секунду? В этой лабораторной работе мы проведём интересный эксперимент - сгенерируем ШИМ-сигнал на одном пине и будем считывать его с помощью digitalRead() на другом. А результат визуализируем с помощью Плоттера по последовательному соединению.

Цель

  • Научиться использовать Плоттер по последовательному соединению для визуализации данных.
  • Наглядно увидеть природу ШИМ-сигнала с помощью цифровых инструментов.
  • Понять, как digitalRead() воспринимает очень быстрые сигналы.

Оборудование и материалы

  • Отладочная плата Рудирон.
  • 1 соединительный провод.
  • USB-кабель для подключения Рудирона к компьютеру.
  • Компьютер с настроенной средой Arduino IDE.

Ход работы

  1. Успеет ли digitalRead()?

    ШИМ-сигнал на Рудироне переключается между HIGH и LOW сотни раз в секунду. Команда digitalRead() тоже работает очень быстро, но не мгновенно. Когда мы пытаемся прочитать такой быстрый сигнал, мы как бы делаем «моментальный снимок» состояния пина. В зависимости от того, в какой именно момент времени произойдёт чтение — в момент импульса (HIGH) или в момент паузы (LOW), — мы получим 1 или 0.

    Если коэффициент заполнения ШИМ маленький, то большую часть времени на пине будет LOW, и вероятность «поймать» LOW будет высокой. Если же коэффициент большой, то почти всегда мы будем считывать HIGH.

  2. Сборка схемы

    Схема предельно проста. Нам нужно лишь соединить один ШИМ-пин с одним обычным цифровым входом.

    • Возьмите соединительный провод.
    • Один его конец подключите к пину 5 (который поддерживает ШИМ).
    • Другой конец подключите к пину 2.

    Вот и всё! Мы будем генерировать сигнал на пине 5 и тут же измерять его на пине 2.

  3. Написание и загрузка кода

    • Установите перемычку PRG | RUN в положение PRG.
    • В Arduino IDE введите следующий код:

      const int pwmPin = 5;
      const int readPin = 2;
      
      void setup() {
        // Инициализируем последовательный порт на высокой скорости
        Serial.begin(115200); 
      
        pinMode(pwmPin, OUTPUT);
        pinMode(readPin, INPUT);
      
        // Устанавливаем ШИМ с коэффициентом заполнения ~40% (100 из 255)
        analogWrite(pwmPin, 100);
      }
      
      void loop() {
        // В бесконечном цикле считываем состояние пина
        // и выводим его в Serial для плоттера
        Serial.println(digitalRead(readPin));
      }
      
    • Нажмите кнопку «Upload», чтобы загрузить код на плату.
  4. Проверка работы в Плоттере

    • После загрузки откройте Плоттер по последовательному соединению (Tools → Serial Plotter).
    • Вы увидите график, который прыгает между значениями 0 и 1. Это и есть наши «моментальные снимки» ШИМ-сигнала.
    • Теперь поэкспериментируйте! Измените значение в analogWrite():
      • Поставьте analogWrite(pwmPin, 10);. Загрузите код. График будет почти всё время находиться на уровне 0, лишь изредка подпрыгивая до 1.
      • Поставьте analogWrite(pwmPin, 250);. Загрузите код. Теперь график будет почти всегда на уровне 1, лишь изредка падая до 0.

Результаты

Вы «поймали» ШИМ-сигнал с помощью digitalRead()! Вы наглядно увидели, что он состоит из последовательности нулей и единиц, а коэффициент заполнения определяет, как часто мы будем «ловить» то или иное состояние.

Анализ результатов

Этот эксперимент доказывает, что ШИМ — это не какое-то «аналоговое колдовство», а реальный цифровой сигнал, который очень быстро переключается.

  • При analogWrite(pwmPin, 10) сигнал находится в состоянии HIGH очень короткое время, поэтому digitalRead() чаще всего «видит» LOW (ноль).
  • При analogWrite(pwmPin, 250) сигнал почти всё время находится в состоянии HIGH, и digitalRead() почти всегда считывает HIGH (единицу).

Выводы

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

Вопросы для самопроверки

  1. Почему при чтении ШИМ-сигнала с помощью digitalRead() мы видим и нули, и единицы?
  2. Как изменится вид графика в плоттере, если установить analogWrite() в значение 200?
  3. Что произойдёт, если убрать analogWrite() из setup() и просто написать digitalWrite(pwmPin, HIGH)? Что вы увидите в плоттере? А если digitalWrite(pwmPin, LOW)?
  4. Почему для этого эксперимента важна высокая скорость Serial.begin(115200)?
  5. Можно ли таким способом точно измерить коэффициент заполнения ШИМ? Почему да или нет?

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