武汉科技大学智能汽车设计及制作论文(编辑修改稿)内容摘要:

001000 case 0x014: error=15。 worse/=2。 break。 //000011000 000011000 case 0x010: error=0。 worse/=2。 break。 //000010000 0x08 case 0x030: error=15。 worse/=2。 break。 //000110000 0x18 case 0x020: error=30。 worse/=2。 break。 //000100000 0x10 case 0x060: error=45。 worse/=2。 break。 //001100000 0x30 case 0x040: error=60。 worse/=2。 break。 //001000000 0x20 case 0x0c0: error=75。 worse/=2。 break。 //011000000 0x60 case 0x080: error=95。 worse/=2。 break。 //010000000 0x40 case 0x180: error=115。 worse/=2。 break。 //110000000 0xC0 case 0x100: error=135。 worse/=2。 break。 //1 0000 0000 0x80 //左 case 0x00: error=error_history[ERROR_HISTORY_NUM1]。 worse++。 break。 //00000000 0x00 default: error=error_history[ERROR_HISTORY_NUM1]。 worse++。 break。 //其他情况时,保持上一次偏差 } } // void servo_control(void) //舵机控制 { char i=0。 if(ABS(errorerror_history[ERROR_HISTORY_NUM1])120) //如果两次的偏差过大,则保持上一次的偏差 error=error_history[ERROR_HISTORY_NUM1]。 //防止不确定情况(如红外管冲出跑道)造成的偏差跳变 for(i=0。 iERROR_HISTORY_NUM1。 i++) //记录偏差 { error_history[i]=error_history[i+1]。 } error_history[ERROR_HISTORY_NUM1]=error。 //根据偏差计算舵机角度输出 PID_out = ( 28*error_history[ERROR_HISTORY_NUM1] //比例 + servo_D*(error_history[ERROR_HISTORY_NUM1]error_history[ERROR_HISTORY_NUM2])//微分 )/150。 //这里使用乘以一个大的系数再除以一个数的方法 servo_PWM = SERVO_MID_PWM + PID_out。 //控制舵机 if(servo_PWMSERVO_LEFT_MAX_PWM) //限幅 servo_PWM=SERVO_LEFT_MAX_PWM。 //防止舵机超过极限值 if(servo_PWMSERVO_RIGHT_MAX_PWM) servo_PWM=SERVO_RIGHT_MAX_PWM。 } void motor_control(void) //电机控制 { char SUM=0。 //历次偏差和 char i=0。 for(i=0。 iERROR_HISTORY_NUM。 i++) //对历次偏差绝对值求和 SUM=SUM+error_history[i]。 if(SUM =25 amp。 amp。 SUM=10) //向右拐 { right_motor_PWM=speed_expect2*servo_F*SUM/500。 left_motor_PWM=speed_expectservo_I*SUM/500。 } else if (SUM =10 amp。 amp。 SUM25) //向左拐 {right_motor_PWM=speed_expect+servo_I*SUM/500。 left_motor_PWM=speed_expect+servo_F*SUM/500。 } else if (SUM。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。