Как вычесть микро()?
Я пытаюсь рассчитать время между импульсами, сравнивая отметку времени micros(). Я понимаю, что вы не можете просто вычесть unsigned long, но я не могу понять, какова для него альтернатива.
Ниже представлена упрощенная версия кода. На контакте 6 я получаю импульсы длиной 2 мс каждые 2 мс, сравнивая время возврата «-19728». Я планирую сделать импульсы намного короче, как только решу эту математическую задачу.
Примечание к сайту: я использую импульсы, чтобы заставить два Arduino отправлять простые данные через цифровые выводы.
Спасибо.
int pinReceiver = 6;
int val = 0;
int isReceiving = 0;
int pauseLength = 0;
unsigned long timeStart = 0;
void setup() {
Serial.begin(9600);
pinMode(pinReceiver,INPUT);
}
void loop() {
noInterrupts();
val = digitalRead(pinReceiver);
if(val==HIGH){
if(isReceiving==0){ //Импульс начинается
isReceiving = 1;
pauseLength = micros() - timeStart;
Serial.println(pauseLength);
}
} else {
if(isReceiving==1){ //Импульс заканчивается
isReceiving = 0;
timeStart = micros();
}
}
interrupts();
}
@Andi Stancu, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 1
Преобразование длинного числа в целое приведет к переполнению значения, и вы получите значения в отрицательных числах.
Определите pauseLength
как unsigned long
, чтобы он работал.
,
@Sri
Смотрите также:
- Как получить текущее время и дату в Arduino без внешнего источника?
- Как запустить цикл на определенное время?
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Разница между «time_t» и «DateTime»
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Оси X и Y на последовательном плоттере Arduino?
- Несколько неблокирующих таймеров обратного отсчета?
- Библиотека времени Arduino и библиотеки RTC
Расчет вроде правильный. Пожалуйста, попробуйте также использовать
unsigned long
дляpauseLength
. Это может быть ваша проблема, @chrislЭто определенно решило проблему. Я предположил, что, поскольку разница будет такой короткой, она может быть int. Спасибо. Я не знаю, как пометить это как решающий ответ., @Andi Stancu
Я думаю, это больше о том, что вы смешали неподписанные и подписанные типы. Завтра я напишу ответ, который вы можете принять, @chrisl
что произойдет, если вы приведете long к int ? ... pauseLength = (int)(micros() - timeStart);, @jsotola