Не выходит из цикла 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 все еще выполняется. Может ли кто-нибудь увидеть, где я ошибаюсь?

, 👍0


2 ответа


4

int не может хранить 1000000. Это 16-битная переменная со знаком, что означает, что она может храниться только в диапазоне от -32768 до +32767.

>

Для хранения больших чисел необходимо использовать long или unsigned long, которые представляют собой знаковые и беззнаковые 32-битные переменные.

>
,

Еще один вопрос для моего понимания. Почему на последовательном выходе отображаются значения > 32767?, @madewithrealfruit

ms, возможно, был повышен до long, поскольку println ожидает long. Однако «второй» будет содержать -31072. Если у вас неправильный тип переменной, могут произойти странные вещи., @Majenko

Хорошо, спасибо, по крайней мере теперь я знаю, что важно подумать о том, какого типа переменная., @madewithrealfruit


2

В дополнение к ответу Маженко (int на этой платформе не может содержать число больше 32767) у вас есть вторая проблема. Вы, видимо, пытаетесь получить средний тон «до» (261,6 Гц), переключая выход с периодом 1/261,6 секунды. Однако ваш Serial.println требует времени. В частности, при скорости 9600 бод каждый отправленный вами байт займет 1/960 секунды (поскольку на каждый байт приходится 8 бит данных, один стартовый бит и один стоповый бит), и если предположить, что число, которое вы печатаете, составляет примерно 4 цифры плюс каретка. return плюс перевод строки, вы отправляете 6 байт за каждый раз в цикле.

6 байт по 1/960 (1042 мкс) составят 6252 мкс, что полностью затмевает ваши задержки в 1915 мкс.

Каждый раз, когда вы пытаетесь что-то сделать с помощью циклов синхронизации, вам необходимо учитывать, что все в цикле требует времени, а не только ваши операторы delayMicroсекунды.

,