2 шаговых двигателя и зависания.

78125

✩✩✩✩✩✩✩
1 Дек 2019
76
2
Есть полноценный механизм протяжки, который имеет точность до сантиметра, этого достаточно для расчета.
Отвечу кусочками кода, так может понятнее выйдет)
1. MainSpeedMax = 4000 Гц
//при генерации меандра реальная частота будет в два раза меньше заданной из-за особенности работы самого таймера.
const float PeredatochnoeChislo = 3.1 ; //передаточное число между шестернями привода
SpinsNow = Steps/1600/PeredatochnoeChislo
2. StepsForMM = 200
3. Внутренний диаметр 90 внешний 200, ширина витка 2мм. Витки и слои не считаем - нужна длина (ее считает Master)
4. Намотчик как бы подматывает за выдачей кабеля выбирая слабину, по датчику провисания
 

78125

✩✩✩✩✩✩✩
1 Дек 2019
76
2
Есть новости.
Приделал лог, и дождался появления ошибки!
Смотрите, в какой то момент, абсолютно внезапно, значение оборотов принимает левое значение из будущего:
Шаги растут, текущие обороты тоже, а вот сохраненные обороты ушли сами вперед и все встало.
Кусок кода, где все трое связаны, прилагаю.
Все эти вычисления идут в блоке с запретом прерывания.
Есть идеи?

C++:
unsigned int Spins = 0; //обороты
unsigned int SpinsNow = 0; //обороты
const float PeredatochnoeChislo = 3.1; //передаточное число между шестернями привода

....
noInterrupts();
....
SpinsNow = Steps/1600/PeredatochnoeChislo;
if (SpinsNow>Spins) { // каждый оборот
                     Spins = SpinsNow;
                    ....
                    }
interrupts();
 

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

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Хм, попробуйте явно задать атомарность кода изменения этих переменных.
 

bort707

★★★★★★✩
21 Сен 2020
3,067
915
пусть товарищ выложит поный код сюда, как он это сделал на другом форуме. У него там прерывания выключены практически на все время loop(), хотя на прошлой странице @poty ему ясно сказал, что так делать не следует.
 
Изменено: