Почему простое мигание светодиодом не работает при использовании ШИМ mbed.h и Arduino Nano BLE?

arduino-nano led pwm arduino-nano-ble

Я установил очень простую тестовую программу для мигания встроенного светодиода с использованием ШИМ. Следуя примеру mbed и установив период равным 4 секунды (0,25 Гц) и рабочий цикл равным 0,5, ожидаемое поведение будет следующим: Светодиод загорится на 2 секунды и погаснет на 2 секунды. Однако на самом деле светодиод мигает очень быстро (почти незаметно для глаз).

#include "mbed.h"

mbed::PwmOut ledPin = mbed::PwmOut(P0_13); //builtin led pin

void setup() {
  ledPin.period(4.0f);
  ledPin.write(0.0f);
}


void loop() {
  // put your main code here, to run repeatedly:
  ledPin.write(0.5f);
}

Я пробовал добавлять delay() и wait_ns() с разным временем в основной цикл, пробовал оставить основной цикл пустым и установить рабочий цикл в

code>setup(), а также изменение периода на более крупные числа на тот случай, если он был в миллисекундах, но безрезультатно. Не совсем понимаю, чего мне не хватает в этом чрезвычайно простом примере.

, 👍1

Обсуждение

Согласно [примеру mbed](https://os.mbed.com/docs/mbed-os/v6.16/apis/pwmout.html), чтобы создать экземпляр объекта PwmOut, он должен быть PwmOutledPin(P0_13 ). Для setup() установите рабочий цикл на 50% с помощью ledPin.write(0.5f); и удалите код внутри цикла(), поскольку он сам по себе уже является циклом while(1)., @hcheung


1 ответ


0

Пример, на который вы ссылаетесь, имеет бесконечный, но пустой цикл — while(1); — после настройки ШИМ.

Ваш цикл неоднократно выполняет ledpin.out(0.5f);

Я не нашел функции-члена .out(), чтобы знать, что она делает, но моей первой мыслью было бы закомментировать содержимое вашей функции цикла() и позволить ей работать как пустой бесконечный цикл. Затем я бы посмотрел на функцию-член .out и выяснил, каково ее действие. Вывод на вывод обычно является логическим. Если это так с .out(), то 0,5f будет преобразовано в целое число 0, которое идентично логическому значению «false», и этот цикл будет неоднократно выключать светодиод, причем с частотой около мегагерца.

,

Код, который он опубликовал, выполняет ledPin.write(0.5f); внутри loop, а не out., @Nick Gammon