Не выходит из цикла for
Я новичок в Arduino и пытаюсь использовать ШИМ для генерации сигнала через зуммер. Я создал цикл for
, однако цикл for
, похоже, не прерывается, когда переменная ms
имеет значение < 1000000.
int second = 1000000; //1 секунда в микросекундах
void setup() {
pinMode(3, OUTPUT);
Serial.begin(9600);
}
void loop() {
//Играем среднюю C в течение 1 секунды
for(int ms=0; ms <= second; ms+=3830)
{
digitalWrite(3, HIGH);
delayMicroseconds(1915);
digitalWrite(3, LOW);
delayMicroseconds(1915);
Serial.println(ms);
}
Serial.write("Finished C");
}
На последовательном выводе мы видим, что значение ms
превышает 1000000, но цикл for
все еще выполняется. Может ли кто-нибудь увидеть, где я ошибаюсь?
2 ответа
int
не может хранить 1000000. Это 16-битная переменная со знаком, что означает, что она может храниться только в диапазоне от -32768 до +32767.
Для хранения больших чисел необходимо использовать long
или unsigned long
, которые представляют собой знаковые и беззнаковые 32-битные переменные.
В дополнение к ответу Маженко (int
на этой платформе не может содержать число больше 32767) у вас есть вторая проблема. Вы, видимо, пытаетесь получить средний тон «до» (261,6 Гц), переключая выход с периодом 1/261,6 секунды. Однако ваш Serial.println требует времени. В частности, при скорости 9600 бод каждый отправленный вами байт займет 1/960 секунды (поскольку на каждый байт приходится 8 бит данных, один стартовый бит и один стоповый бит), и если предположить, что число, которое вы печатаете, составляет примерно 4 цифры плюс каретка. return плюс перевод строки, вы отправляете 6 байт за каждый раз в цикле.
6 байт по 1/960 (1042 мкс) составят 6252 мкс, что полностью затмевает ваши задержки в 1915 мкс.
Каждый раз, когда вы пытаетесь что-то сделать с помощью циклов синхронизации, вам необходимо учитывать, что все в цикле требует времени, а не только ваши операторы delayMicroсекунды
.
- Пассивный зуммер работает с AnalogWrite(), но не с DigitalWrite(). Он также имеет постоянный статический шум.
- все работает независимо, но не вместе. Пьезо не генерирует тон
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Генерация частоты ШИМ выше 125 кГц с помощью Arduino Uno
- Увеличить разрядность PWM
- Как вывести истинное аналоговое напряжение на выходной контакт
- Цепь с зуммером не работает
Еще один вопрос для моего понимания. Почему на последовательном выходе отображаются значения > 32767?, @madewithrealfruit
ms
, возможно, был повышен до long, поскольку println ожидает long. Однако «второй» будет содержать -31072. Если у вас неправильный тип переменной, могут произойти странные вещи., @MajenkoХорошо, спасибо, по крайней мере теперь я знаю, что важно подумать о том, какого типа переменная., @madewithrealfruit