我给你一段PID的代码:#define AA_KPVALUE 150 #define AA_KIVALUE 100 #define AA_KDVALUE 30typedef struct PID { sint an_Ref//
角度PID,角度
设定值 sint an_FeedBack//角度PID,角度反馈值 sint an_PreError//角度PID,前一次,角度误差,,an_Ref - an_FeedBack sint an_PreDerror//角度PID,前一次,角度误差之差,d_error-PreDerrorsint an_Kp//角度PID,Ka = Kp sint an_Ki//角度PID,Kb = Kp * ( T / Ti ) sint an_Kd//角度PID, sint an_PreU//
舵机控制输出值}PIDPID sPID//申请一个PID类型的变量void PIDInit(void)//PID初始化 { sPID.an_Ref = 0 sPID.an_FeedBack = 0 sPID.an_PreError = 0 sPID.an_PreDerror = 0 sPID.an_Kp = AA_KPVALUEsPID.an_Ki = AA_KIVALUEsPID.an_Kd = AA_KDVALUEsPID.an_PreU = 0 }unsigned int PIDCalc( PID *pp )//返回值赋给舵机 { sint error,d_error,dd_errorerror = pp->an_Ref - pp->an_FeedBackd_error = error - pp->an_PreErrordd_error = d_error - pp->an_PreDerrorpp->an_PreError = errorpp->an_PreDerror = d_errorpp->an_PreU +=pp->an_Kp*error+pp->an_Ki*d_error+pp->an_Kd*dd_error return ( pp->an_PreU )}在主函数中初始化PID,将设定值与返回值设置好后,调用unsigned int PIDCalc( PID *pp )把返回值给舵机。设定值就是你想要让舵机转的角度赋给sPID.an_Ref,返回值就是舵机现在的角度。因为是一个闭环控制系统,需要将角度量化以后的值返回,赋给sPID.an_FeedBack,这个算法会根据设定值与现在所处的角度计算出下一次所偏转的角度,这是一种增量式数字PID的算法。若想修改转的速度就修改宏定义中这三个参数的值,其中AA_KPVALUE影响最大。希望对你有所帮助
通过级联
减速齿轮带动电位器
旋转。将舵机方波信号进行细分,一定时间内让信号变宽一点点,这样就可以控制舵机转速了,想要多慢都行。控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。
它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
评论列表(0条)