我正在尝试将我的 PI 控制信号“u[k]”转换为占空比输出,错误 e[k] 控制方向输出....但我认为它可能会更好。
所以我使用 if 语句将 u 的值集中在 0 到 100 之间,因为那是 dc 范围。(我似乎无法在任何地方向 u 或 u[k] 添加“abs”语句以将其保持在积极领域,所以如果有其他方法请告诉我。)
然后 u[k] 的值将成为整个脚本的直流循环。如果误差 e[k] 为正,则顺时针旋转,如果误差为负,则逆时针旋转。同时,u[k] 将控制电机的速度,使其在达到所需角度时减速或加速。让我知道
我仍然有错误
“ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()”
下面是我正在努力的代码片段。任何帮助表示赞赏
def MotorClockwise():
GPIO.output(Motor1, GPIO.LOW) # Motor will move in clockwise direction.
GPIO.output(Motor2, GPIO.HIGH)
def MotorAntiClockwise():
GPIO.output(Motor1, GPIO.HIGH) # Motor will move in anti-clockwise direction.
GPIO.output(Motor2, GPIO.LOW)
def MotorStop():
GPIO.output(Motor1, GPIO.LOW) # Motor will stop.
GPIO.output(Motor2, GPIO.LOW)
GPIO.output(PWMPin, GPIO.LOW)
#PI controller settings
Kp = 12
Ki = 8 #integral Time
r = 4.5 #setpoint angle to be achieved
#intialization
e = np.zeros(N+2)
u = np.zeros(N+2)
for k in range(N+1):
e[k] = r - encoder_angle #calucalted error
#print (f"{e[k]} Error Detected")
#time.sleep(.5)
# PI Controller - produces new contrl signal
u[k] = u[k-1] + Kp*(e[k] - e[k-1]) + (Kp/Ki)*e[k] # discrete version of PI controller
# y[k+1] = (1+Ts*a)*y[k] + Ts*b*u[k] #discrete deff equ of process
#######################下面是我挣扎的地方
while True:
if (u > 100):
u = 100;
if (e[k] > 0) :
PwmValue.ChangeDutyCycle(u)
MotorClockwise()
if (u < -100):
u = -100;
if (e[k] < 0):
PwmValue.ChangeDutyCycle(u)
MotorAntiClockwise()
if (e[k] == 0) and (r == encoder_angle):
MotorStop()
print(f"Motor Stopped & Holding at {encoder_angle} Degrees")
break