подсчёт последовательности меняющую знак и направление.

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Здравствуйте .
Подскажите пожалуйста как создать алгоритм на Ардуино для датчика положения.
Дано:
последовательность чисел от 0 до 2000 поступает от датчика .
Скорость изменения 200мс от0 до 2000 .
направление счёта +/- , т .е может изменяться с разной скоростью и с разным направлением счёта.
Нужно : чтобы каждый раз переходя порог 2000 счетчик продолжал считать 2001,2002,2003. вместо 1,2,3 на датчике.
Так-же и происходило вычитание.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
ну не фига не понятно.. но попробую угадать
переменные
новоезначениедатчика=0
староезначениедатчика=0
счетчик=0

в цикле
новоезначениедатчика=получаем с датчика
счетчик=счетчик+(новоезначениедатчика-староезначениедатчика)
староезначениедатчика=новоезначениедатчика


Одно но! вот тут
счетчик=счетчик+(новоезначениедатчика-староезначениедатчика)
надо предусмотреть переход с 2000 на 0 и с 0 на 2000.
Примерно так:
если новоезначниедатчика==2000 и староезначениедатчика ==0 то разность =-1
если новоезначниедатчика==0 и староезначениедатчика ==2000 то разность =1
но это при условии что все значения будут строго подряд
Тогад в цикле будет

новоезначениедатчика=получаем с датчика
разность=новоезначениедатчика-староезначениедатчика
если новоезначниедатчика==2000 и староезначениедатчика ==0 то разность =-1
если новоезначниедатчика==0 и староезначениедатчика ==2000 то разность =1
счетчик=счетчик+разность
староезначениедатчика=новоезначениедатчика
 
  • Лойс +1
Реакции: серёга73

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Спасибо.
Как раз такая ситуация что числа идут не подряд , а могут даже быть 0,2000,2000,0,0,0,2000,1998,2......
Но "вылет" не более чем на 10 единиц в минус и 10 в плюс.
C++:
 int dtch=0;
int nzn=0;
int szn=0;
int counter=0;

void setup() {


}

void loop() {
nzn=dtch;
counter=(counter+(nzn-szn));
szn=nzn;

//далее пресловутое 0-2000


}
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
тогда в любом случае можно поймать переход через 0. если разность будет больше чем 10, то значит был преход. было 1995, стало 3, 3-1995=-1992, тогда надо прибавить 2000, будет 8. ну и в обратную сторону тоже аналогично
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
я про разницу! а эту разницу уже к итогу прибавляй. Посмотри мой 1-ый пост
разность=новоезначениедатчика-староезначениедатчика
если новоезначниедатчика==2000 и староезначениедатчика ==0 то разность =-1
если новоезначниедатчика==0 и староезначениедатчика ==2000 то разность =1
счетчик=счетчик+разность
 

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Так?
C++:
 int dtch=0;
int nzn=0;
int szn=0;
int counter=0;
int razn=0;
void setup() {


}

void loop() {
nzn=dtch;
razn=nzn-szn;
if((nzn>=1990)&&(szn<=10))//возможно будет  от 1990до 2000 и от 0 до 10
{
  razn=!(nzn+szn);
}
///////////
if((szn>=1990)&&(nzn<=10))//возможно будет  от 1990до 2000 и от 0 до 10
{
  razn=(nzn+szn);
}
////////
counter=counter+razn;
szn=nzn;


}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
я напишу на псеводкоде. переведешь сам.

бесконечный цикл:
новоезначени =считатьс_датчика
разность= новоезначение-староезначение
если разность >10 тогда разность=разность-2000;
если разность <-10 тогда разность=разность+2000;
счетчик=счетчик+разность
тароезначение=новоезначение

Так точно работать будет.
 
  • Лойс +1
Реакции: серёга73

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Вот проверял. одиночное число - новое значение (руками вводил)
3 числа подряд - полученная разность, разность после проверки и сумма. Ограничение 100, не ждать же 2000
9
9 9 9
19
10 10 19
29
10 10 29
39
10 10 39
49
10 10 49
59
10 10 59
69
10 10 69
79
10 10 79
89
10 10 89
95
6 6 95
5
-90 10 105
5
0 0 105
10
5 5 110
5
-5 -5 105
95
90 -10 95
 

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Записал алгоритм так:
C++:
nzn=dtch;//новоезначени =считатьс_датчика
razn=nzn-szn;//разность= новоезначение-староезначение
if(razn>10)//если разность >10
{
  razn=(razn-2000);//тогда разность=разность-2000
}


///////////
if(razn<-10)//если разность <-10
{
  razn=(razn+2000);//тогда разность=разность+2000
}
////////
counter=counter+razn;  // счетчик=счетчик+разность  
szn=nzn; //cтарое значение = новое значение
И не пошло...

Любые значения счетчика равно значению датчика , а должно после 1992 вместо 8 появиться 2008,2020,2028...
Вот они в сериале:
60 60
40 40
12 12
1976 1976
1948 1948
1936 1936
1928 1928
1932 1932
1940 1940
1944 1944
1960 1960
1980 1980
1992 1992
8 8
20 20
28 28
32 32
36 36
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Как объявлены переменные ?

И если у тебя будут считаться нормальными разбежки в 30, то надо менят условия 10 на 30, или даже больеш. Возьми сразу четверть диапазона

Вот что выходит, если по условию до 10, а задается разность больше (последняя строка)
10
10 10 1010
1980
1970 -30 980
10
-1970 30 1010
20
10 10 1020
5
-15 1985 3005
И еще одно замечание , условия проверки делай совместно, т.е. если тот (то то), иначе если (то то и то то)
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
нормально, что при уменьшении счетчик пойдет в минус ?

пояснение, когда ты задаешь изменение 30, то у тебя рушиться логика, и получается изменение большим. Либо обрабатывай по другому как то.
 

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Заработало!
Ошибся сам и вместо counter(счётчик) выводил в сериал переменную nzn(новое значение).
Немного "подглючивает" ,но в основном работает.
-Спасибо.

нормально, что при уменьшении счетчик пойдет в минус ?
Так и надо, это нормально.

Вот что получается:
1836 1836
1848 1848
1848 1848
1864 1864
1860 1860
1872 1872
1872 1872
1880 1880
1876 1876
1900 1900
1904 1904
1932 1932
1944 1944
1956 1956
1956 1956
1976 1976
1984 1984
1992 1992
12 2012
20 2020
16 2016
32 2032
40 2040
48 2048
52 2052
60 2060
68 2068
68 2068
92 2092
96 2096
108 2108
104 2104
120 2120
132 2132
140 2140
136 2136
156 2156
156 2156
156 2156
168 2168
172 2172
164 2164
188 2188
176 2176
192 2192
188 2188
192 2192
192 2192
188 2188
192 2192
192 2192
196 2196
188 2188
196 2196
192 2192
200 2200
188 2188
208 2208
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Ну вроде бы соотв. описанной логике, правда разбежка более 10, но это не важно. А уж так ли ты задумывал или нет - я не знаю.
 

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Нужно еще сделать медианный фильтр , отсеивающий "всплеск" , например было 1000 ,1010,1020 ,1021 и вдруг 1100 -это отсеиваем.и оставляем 1021.
@Старик Похабыч, Может подскажите где подсмотреть?
 

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Пробовал фильтры на входе, но им не нравится этот переход с 0 на 2000 , фильтры неадекватно реагируют...
Пришлось ставить условия запрета добавления к счетчику числа 2000(или -2000) ,если разница была больше разбежки.
Иначе при переходе через 0 иногда добавлялось 2000 при ходе туда-сюда 0-2000-0-2000 результат должен быть 0 , а получалось 2000 и фильтр здесь не подмога...
Затем уже на выходе поставил фильтр.
 

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Сделал так , что оно так и получается ,-если разность некорректна , то она не проходит .
Вот что получилось:
Прогнал через фильтр и поделил на 10.
 
Изменено:

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@серёга73, не совсем понял, какая у вас проблема. Зачем ноль перехолить? Есть же функция abs() она возвращает безнаковое число. Вам ведь просто минус нужно откинуть, если я правильно понял?
 

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Нет эта функция не подойдёт.
Энкодер считает от 0 до 2000 , а мне нужно чтобы считал от 0 до 9999 вперёд и от 0 до-9999 назад ,преобразовав последовательность 0-2000.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
А почему энкодер считает от 0 до 2000 ? он абсолютный ?
Обычный энкодер указывает только направление. И кмк используя его было бы гораздо проще получить требуемое
 

серёга73

✩✩✩✩✩✩✩
16 Сен 2020
20
1
Это, сельсин у него 0-360 градусов оборот.И измеряя фазу в нем(её сдвиг} в мкс получается 0-2000. Из него Энкодер как-бы получается абсолютный если фазировка неизменна.
В отличии от сельсина например у резольвера другой принцип работы.
Сельсин это трехфазный трансформатор в котором вращается отдельная 4я обмотка в которой фаза будет принимать свой знак относительно положения внутри этого трансформатора посредствам вала.
 
Изменено:
  • Лойс +1
Реакции: kostyamat