считываем сигнал из таходатчика (переход через ноль) - это наши реальные обороты.
вешаем на прерывание ноль attachInterrupt(0, tachoChange, RISING);
это значение подаем в пид регулятор как Input = rpm;
далее в пид регулятор загружаем желаемое значение Setpoint = target;
далее, после того, как пид сделает свои магические вычисления, в переменной Output будет значение мощности, которое нужно подать на мотор, чтобы Input приблизился к SetPoint.
принцип регулирования мощности - фазовый.
не прерывание 1 вешаем переход через ноль сети attachInterrupt(1, zeroCross, RISING);
как только произошел переход через ноль, стартуем таймер, который тем короче, чем большую мощьность нудно подать на мотор.
тоесть если нужно дать 100%, то таймер должен быть ноль, тиристор сразу открывается - целая полуволна сетевого напряжения пошла в мотор.
если нужно 50%, то нужно подождать 5мс, потом включить тиристор - тем самым половинка полуволны идет в мотор.
и тд.
сейчас смотрю в код и вижу, что таймер задается в диапазоне 0-93мс(93 потому что детекция ноля происходит не точно в ноле а смещена). и это не правильно - потому как длина одной полуволны всего 10мс. однако это может и не быть ошибкой если таймер ведет отсчет в 100нс интервалах - нужно проверить остановку флагов в настройке таймера.
как бы я делал сейчас:
пока пид не используем вообще. допилить код так, чтобы он мог плавно регулировать нагрузку с шагом в 1% (или грубее - по желанию) по показаниям потенциометра.
меняем
Код: Выделить всё
outPID = Output;
target = map(target, 0, 1023, 1, 200);
Setpoint = target;
Код: Выделить всё
// outPID = Output;
target = map(target, 0, 1023, 1, 100);
outPID = target;
причем мотор можно пока не насиловать - достаточно смотреть осцилографом как меняется момент включения симистора.
как только заработает "силовая" управляющая часть, проверить как считаются показания таходатчика и только потом подключать пид и настраивать его.

