Добрый день, господа сторожилы форума. Буквально пару недель назад решил начать осваивать мир Ардуинок.
Без особой предыстории, перейду сразу к делу. Есть 2 Ардуинки. Уно и Нано. На данный момент изучаю принципы работы с портами. В целях обучения и усложнения заданий решил на одной Ардуинке сделать переменный генератор сигнала, а на другой приёмник.
Вот простенький код генератора:
Спойлер
-
int holl;
-
int period;
-
void setup() {
-
pinMode(7, OUTPUT);
-
}
-
void loop() {
-
holl = analogRead(A0); // потенциометр на 10КОм, для изменения частоты сигнала
-
holl = map(holl, 0, 1023, 200, 20000);
-
holl = constrain(holl, 200, 20000);
-
period = 1000000 / holl; //получили изменяемый период
-
tone(7, holl);
-
}
Генератор проверил зуммером. Сигнал есть и корректно меняется. Во всяком случае, мой расчёт действительно попадает в слуховой диапозон.
А это код приёмника:
Спойлер
-
bool sig;
-
unsigned long st1;
-
unsigned long st2;
-
void setup() {
-
// put your setup code here, to run once:
-
Serial.begin(9600);
-
pinMode(7, INPUT_PULLUP);
-
}
-
void loop() {
-
sig = digitalRead(7);
-
if (sig == 1) {
-
st1 = micros();
-
}
-
st2 = micros()-st1;
-
Serial.println(st2);
-
}
По моей логике, переменная st1 должна обновляться только тогда, когда на входе порта есть сигнал. А так как счётчик micros() работает и отсчитывает постоянно, то время между обновлениями, должно как раз быть разницей между постоянно меняющимся micros() и перезаписываемым каждый такт st1, что по формуле считается в переменную st2 и выводиться в порт.
Но в порту какая-то тарабарщина из значений:
Спойлер
3120
9360
4
4
3120
4
3120
9360
15600
22880
30160
37440
4
4
4
3120
4
3120
9360
4
3120
9360
15600
22880
30160
4
3120
9360
Причём, на изменение частоты с генератора, цифры действительно меняются.
Вот кусок данных с монитора при 200Гц:
Спойлер
3120
9360
4
3112
4
3120
9360
4
3120
4
3120
9360
4
3120
А вот кусок из монитора при 20КГц:
Спойлер
3120
9360
15600
4
3120
9368
15600
22880
4
Там где цифра 4, я ещё понимаю, что это данные, когда условие не выполняется (на порт приходит 0), но по ходу программы st2 имея разрядность в 4мкС выдаёт и их. А вот что за другие цифры, я понять не могу. Почему иногда по нескольку значений проскакивает за проход? Почему такие разные значения? По моим подсчётам, минимальная частота в 200Гц, должна иметь период целых 5 миллисекунд и чисто по идее, должно успевать рассчитываться Ардуинками.