Вот так получилось нормально. при ssb степ начинает с 5 гц и может достигать 100 гц на один импульс что равно 36кГц за один оборот. Причем, если на мгновение остановится и продолжить вращать, то скорость падает плавно или вообще не падает, зависит от "мгновения". На этом я запоролся в первых вариантах алгоритма и только сейчас исправил. Мягко работает, без скачков. Если меняется направление, то сразу степ скидывается по умолчанию.
при CW степ начинается от 1Гц
static float32_t getStep(int16_t df) {
float32_t def_level;
if (trx.trx[trx.activRX][trx.nowBandNN[trx.activRX]][MODE] == CW) def_level = 1.0f;
else def_level = 5.0f;
if (df == 0) {
// level = def_level;
delay = 30;
return 0;
}
if (direction && df < 0) {
direction = 0;
level = def_level;
}
if (!direction && df > 0) {
direction = 1;
level = def_level;
}
df = abs(df);
if (trx.trx[trx.activRX][trx.nowBandNN[trx.activRX]][MODE] == CW) {
df /= 2;
}
if (df == 0) df = 1;
if (delay)
delay--;
else {
if (df > 1 && df < 5) {
if (level + 0.5f < 100.0f) level += 0.5f;
} else if (df >= 5) {
if (level + 0.7f < 100.0f) level += 0.7f;
}
}
return level;
}