Медленно увеличивайте скорость с помощью ШИМ arduino
Я пытаюсь контролировать скорость двигателя постоянного тока с помощью ШИМ. Вот мой код до сих пор:
int motor = 9;
int fadeValue = 5;
void setup() {
pinMode(motor, OUTPUT);
}
void loop() {
for (int fadeValue = 5 ; fadeValue <= 245; fadeValue += 10) {
analogWrite(motor, fadeValue);
delay(100);
if (fadeValue==245) {
fadeValue=255;
break;
}
}
Я хочу, чтобы мотор медленно увеличивал свою скорость, а затем оставался высоким. Однако цикл продолжает повторяться.
Заранее спасибо ребятам.
@zuzu, 👍1
Обсуждение5 ответов
Лучший ответ:
Если вы не хотите, чтобы код повторялся по максимуму, просто добавьте условие в цикл. Ваше решение может выглядеть следующим образом:
int fadeValue = 5;
void loop()
{
if (fadeValue < 255)
{
if (fadeValue >= 245)
{
fadeValue = 255;
}
else
{
fadeValue++;
}
analogWrite(motor, fadeValue);
delay(100);
}
//Другой код здесь
}
Установив значение FadeValue
на другое значение, затухание начнется снова с нового значения до максимального.
Однако цикл продолжает повторяться.
В этом весь смысл loop(). Если вы хотите, чтобы какой-то код запускался только один раз после запуска программы, поместите его в setup()
:
int motor = 9;
int fadeValue = 5;
void setup() {
pinMode(motor, OUTPUT);
for (int fadeValue = 5 ; fadeValue <= 245; fadeValue += 10) {
analogWrite(motor, fadeValue);
delay(100);
if (fadeValue == 245)
{
fadeValue = 255;
break;
}
}
}
void loop() {
}
Почему он съедает отступ моего кода после того, как я отправлю ответ? Досадно, что я не испытывал этого на других сайтах SE., @per1234
@zuzu -- вы должны указать все детали того, что вам нужно, в вопросе, чтобы избежать ненужных ответов..., @Wesley Lee
его можно включить в loop(): включение его в настройку(), если период ускорения длительный, непрактично или неосуществимо в некоторых приложениях.
вы можете использовать счетчик циклов или счетчик времени, чтобы замедлить нарастание, не привязывая микроконтроллер, например:
time_now = time(); //считайте текущее время. или millies()
if (time_now < TIME_RAMPUP) { //все еще нужно увеличить его
if (time_now > time_prev) { //нужно увеличить скорость двигателя
time_prev+=TIME_INC;
motor_dc+=PWM_STEP; //возможно, вы захотите привязать постоянный ток здесь
analogWrite(MOTOR_PIN, motor_dc); //увеличение постоянного тока
}
}
Если вы хотите, чтобы цикл void() выполнялся только один раз, и не хотите помещать свой код в setup() по какой-то странной причине, точно так же, как бесконечный цикл while в конце с задержкой внутри, как это:
void loop()
{
for (int fadeValue = 5 ; fadeValue <= 245; fadeValue += 10)
{
analogWrite(motor, fadeValue);
delay(100);
if (fadeValue==245)
{
fadeValue=255;
break;
}
While(1)
Delay(1000);
}
Не могли бы вы также изменить порядок, в котором находится цикл? Поэтому вместо этого код будет выглядеть так:
void loop() {
if (fadeValue == 245) {
fadeValue=255;
analogWrite(motor, fadeValue); // двигатель останется на самом высоком значении
}
else {
for (int fadeValue = 5 ; fadeValue <= 245; fadeValue += 10) {
analogWrite(motor, fadeValue);
delay(100);
}
}
}
Итак, теперь цикл будет выполняться до тех пор, пока значение fadeValue == 245, и в этот момент цикл не перейдет в цикл for, потому что "если" в операторе if/else выполнено. Я на самом деле не уверен, сработает ли это, но это идея.
*Итак, теперь цикл будет выполняться до тех пор, пока значение fadeValue == 245* - нет, оно будет выполняться до тех пор, пока значение fadeValue **не станет больше** 245, что означает, что тест, равный 245 в начале "цикла", не будет выполнен., @Nick Gammon
- Установите частоту ШИМ на 25 кГц.
- Какова частота PWM-выхода на Arduino
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Генерация частоты ШИМ выше 125 кГц с помощью Arduino Uno
- Увеличить разрядность PWM
- Как вывести истинное аналоговое напряжение на выходной контакт
- PWM-вывод Arduino Nano не функционирует
Ваш код очень творческий. Нам не хватает части, где loop() называется..., @Vladimir Cravero
Я считаю, что компилятор Arduino абстрагирует основную() функцию. Функция loop() автоматически вызывается непрерывно. Кроме того, этот вопрос, вероятно, относится к Arduino SE., @Dan Laks
Вот вызов Arduino AVR Boards
loop ()
: https://github.com/arduino/Arduino/blob/1.8.1/hardware/arduino/avr/cores/arduino/main.cpp#L46, @per1234