DS 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба Все не могу понять, или вам жалко поделиться опытом или просто нечего сказать. могу сказать как я делал очень пид регулятор.. Kp = коэффицент пропрц. Ki = интегр постоянная Kd = дифф постоянная [П] proporc = Kp*(Ustavka_i-izm) [И] INT = (Tpwm*Kp*(ustavka_I-izm)/Ki [Д] Diff = (Kd*Kp*(LAST_izm-izm))/Tpwm OUT(pid) = Diff+INT+proporc ;======================== Для И канала Вы либо здесь ошиблись, либо в программе - там должна стоять сумма всех предыдущих (ustavka_I-izm). Без этого нет интеграла, и регулятор неустойчив. Кстати, в источниках питания не применяется, как правило Д канал, поскольку он обостряет переходной процесс, который может нагнуть или источник, или нагрузку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BALDA 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба дело в том что у меня вся это приблуда запускалась только при изменении значения ос ну а так то конечно и обязательно сумма до текущего измерения... ну а так как значение у меня могло измениться только на +- 1 А все это и не прокатитло... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Starick 0 1 апреля, 2006 Опубликовано 1 апреля, 2006 · Жалоба Я полностью соглашаюсь с Ковровым. Тот пример программного ПИД регулятора, который Вы привели и стало основой моего одного проекта. Так как именно разделение вычислений каждого звена ПИД регулятора позволило гибко настроить его коэффициенты на готовом объекте. Только одно замечание: Вы не предусмотрели такую особенность, как насыщение интегратора, при котором необходимо отключить накопление ошибки интегрального звена. В довесок приведу часть кода для Имейдж Крафта delta=present_period-zadanie_oborotov; PID=delta*Kp; if(!(status_flag&(1<<saturation_flag))) { integral=integral+delta; } temp=Ki*integral/1000; PID=PID+temp; temp=Kd*(delta-delta1)/1000; PID=PID+temp; delta1=delta; status_flag&=(~(1<<saturation_flag)); //////////////////////////////////////////////////////////////////////////////// PWM=PID>>12; if(PWM>127) { PWM=127; status_flag|=(1<<saturation_flag); } if(PWM<-127) { PWM=-127; status_flag|=(1<<saturation_flag); } OCR2=PWM+127; Может написано и убого, но понятно. Этот регулятор применялся именно для стабилизации частоты вращения двигателя. Коэфициенты подбирались уже на "живую". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться