Прошу разобраться с непонятной хренотенью, с которой бодаюсь уже неделю.
Предыстория. Нужно ардуинкой преобразовать входящий шим сигнал (f = 250Hz) в собственно числовую величину этого сигнала (т.е. в проценты заполнения перевести), чтобы дальше уже этими значениями в коде пользоваться. Вначале я хотел просто натравить на шим два аппаратных прерывания на RISING и соответственно FALLING и в прерываниях записывать micros в переменные, а в лупе уже вычитать из одной переменной вторую, а из полученной дельты делать проценты. Но при активации сразу двух прерываний всё начинает работать крайне не стабильно и заставить этот код работать вообще не получилось ни в каком виде. Второй пришедший в голову вариант это использовать прерывание RISING как начало отсчета, а конец брать из быстрого digitalRead:
И всё это работает как часы, но только до тех пор, пока в код не вставишь ещё что нибудь. Стоит дописать например:
Как в порту изредка (раз в 0,1-0,2сек) начинает проскакивать единица независимо от скважности шим на входе. Т.е. переменная delta становится меньше 12мкс. Но почему???
Предыстория. Нужно ардуинкой преобразовать входящий шим сигнал (f = 250Hz) в собственно числовую величину этого сигнала (т.е. в проценты заполнения перевести), чтобы дальше уже этими значениями в коде пользоваться. Вначале я хотел просто натравить на шим два аппаратных прерывания на RISING и соответственно FALLING и в прерываниях записывать micros в переменные, а в лупе уже вычитать из одной переменной вторую, а из полученной дельты делать проценты. Но при активации сразу двух прерываний всё начинает работать крайне не стабильно и заставить этот код работать вообще не получилось ни в каком виде. Второй пришедший в голову вариант это использовать прерывание RISING как начало отсчета, а конец брать из быстрого digitalRead:
C++:
void setup() {
Serial.begin(57600);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt (2), pwmris, RISING);
pinModeFast(3, INPUT);
}
void pwmris() {
flag = true;
pwm = micros();
}
void loop() {
bool fall = digitalReadFast(3);
if (fall == false & flag) {
pwm1 = micros();
flag = false;
delta = pwm1 - pwm;
byte percent = map(delta, 12, 3460, 1, 99);
Serial.println(percent);
}
C++:
if (fall == false & micros() - pwm1 > 5000) Serial.println("0%");