最近在调BLDC电机,我在t的例程上直接改的,原来的时候是先开环启动然后闭环,这种能够直接启动起来。但是启动过程中有开环切闭环的台阶。后来改成了直接闭环启动,但是稍微给电机加点负载,电机就启动不起来了,得手掰一下才能起。空载就能闭环直接起,就不知道是怎么回事。正常情况下,速度为0时,闭环控制不应该给最大的占空比么,怎么会启不来呢,?各位前辈,能给点建议么?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
最近在调BLDC电机,我在t的例程上直接改的,原来的时候是先开环启动然后闭环,这种能够直接启动起来。但是启动过程中有开环切闭环的台阶。后来改成了直接闭环启动,但是稍微给电机加点负载,电机就启动不起来了,得手掰一下才能起。空载就能闭环直接起,就不知道是怎么回事。正常情况下,速度为0时,闭环控制不应该给最大的占空比么,怎么会启不来呢,?各位前辈,能给点建议么?
经过测试法现闭环启动起不来的时候占空比为0了;可是PID的输出在反馈速度为0的时候怎么会为0呢,我测过v.term.out也是0,但v.data.v1不是0啊;而且我在仿真的时候也发现在反馈速度为0时,占空比一直是最大啊,?呀,就很不明白是怎么回事?
#define PID_GR_MACRO(v) \
\
/* proportional term */ \
v.data.up = _IQmpy(v.param.Kr, v.term.Ref) - v.term.Fbk; \
\
/* integral term */ \
v.data.ui = _IQmpy(v.param.Ki, _IQmpy(v.data.w1, (v.term.Ref - v.term.Fbk))) + v.data.i1; \
v.data.i1 = v.data.ui; \
\
/* derivative term */ \
v.data.d2 = _IQmpy(v.param.Kd, _IQmpy(v.term.c1, (_IQmpy(v.term.Ref, v.param.Km) - v.term.Fbk))) - v.data.d2; \
v.data.ud = v.data.d2 + v.data.d1; \
v.data.d1 = _IQmpy(v.data.ud, v.term.c2); \
\
/* control output */ \
v.data.v1 = _IQmpy(v.param.Kp, (v.data.up + v.data.ui + v.data.ud)); \
v.term.Out= _IQsat(v.data.v1, v.param.Umax, v.param.Umin); \
v.data.w1 = (v.term.Out == v.data.v1) ? _IQ(1.0) : _IQ(0.0); \
大哥,您的问题解决没?小弟也遇到同样的问题,电机启动那块总是出问题,能抖动,需要用手掰才能转。您知道怎么回事吗?