freescale智能车舵机PID运算
智能车PID的算法推荐
PID( Proportional Integral Derivative )控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒性(稳定性)好和可靠性高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性控制系统。
模拟PID控制系统原理框图PID是一种线性控制器,它根据给定值r in(k)与实际输出值y out(k)的差值e(t)构成控制方案,利用运放实现模拟PID的一个例子:式中:以上为典型模拟PID应用例子。
关于各调节器的作用说明:♥比例调节器P1、起调节作用与输出量和给定量的差成正比,有差就有调节作用,所以他的调节结果总是有差存在,这种调节不可消除差,所以叫这种调节为有静差调节;2、但这种调节作用快,能很快减小误差,是最常用的一种调节器!3、积分I调节慢,所以PI是最常用的一种搭配!♥积分调节器I1、是给定量与输出量的差对时间的积分,在电路里就是用给定量与输出量的差给电容充电,只要时间足够长,电容器的电压总会到达给定量,使输出量与给定量的差为零;2、积分调节器是一种无静差调节器,意思是说可调节到给定值,做到精确、准确输出;♥微分控制调节器D1、,这种控制总是以输出量与给定量的差的变化率成正比,差变化越剧烈,调节作用越大,差变化越平稳,调节作用越弱;2、这种微分调节作用,使得输出量平稳而很少波动;3、这种微分调节作用,对输出量的变化、波动产生强烈的阻尼、抑制的作用,就像摩擦力的作用;数字式PID应用:增量式PID的算式为:如果换换成智能车里的方向控制就变为:Pwm_offset=PWMMiddle+PID_P*(error-last_error)+PID_I*(error)+PID_D*(error+pre_error-2*la st_error);其中:error=middle-offset,注意这个公式里的offset应该有正负之分,左右偏移的值互为相反。
这样自然就确定了最后的方向。
智能汽车控制策略及PID算法分析
智能汽车控制策略及其PID 算法分析作者:王保磊机电1103-11221077目录背景简介一.智能汽车竞赛简介: (1)系统建立二.控制策略: (1)2.1:理论分析 (2)2.2 : PID 控制规律的离散化 (3)2.3 : matlab 分析 (4)2.4 :系统校正 (9)总结三.总结: (14)一.智能汽车竞赛简介。
全国大学生“飞思卡尔”杯智能汽车竞赛是在规定的模型汽车平台上,使用飞思卡尔半导体公司的 8 位、 16 位微控制器作为核心控制模块,通过增加道路传感器、电机驱动电路以及编写相应软件,制作一个能够自主识别道路的模型汽车,按照规定路线行进,以完成时间最短者为优胜。
因而该竞赛是涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的比赛。
摄像头组比赛规则:采用模拟或数字摄像头对赛道信息进行采集,通过硬件二值化并进行软件信息处理,获得赛道信息,采用规定的舵机和电机控制小车的行走。
相同的赛道,竞速,完成赛道时间短的队伍获胜。
下图为赛道示意图和实际赛道照片。
为保证小车一直沿着黑色引导线快速行驶,系统主要的控制对象是小车的转向和车速。
即应使小车在直道上以最快的速度行驶。
在进入弯道的时刻尽快减速,且角度的转向要适合弯道的曲率,确保小车平滑地转弯,并在弯道中保持恒速。
从弯道进入直道时,小车的舵机要转向至中间,速度应该立即得到提升,直至以最大的速度行进。
为实现上述控制思想,我们采用不同的控制方法来控制小车的转角和速度。
下图为小车的实物模型:二.控制策略。
2.1:理论分析:Ov7620 数字摄像头采集到的赛道信息为采集点灰度值,这些灰度值与设定的阀值进行比较转化为二进制信息,利用这些二进制信息可以确定赛道黑线位置,进而确定小车当前位置及理想通过曲线。
求得理想通过曲线上各点的斜率进而确定赛道类型,通过算法控制电机转速,以保证小车安全通过赛道防止侧翻和打滑。
计算小车的当前位置横坐标值即摄像头视野中线与理想通过曲线与横坐标交点的差值。
飞思卡尔智能车技术报告
第六届“飞思卡尔”杯全国大学生智能汽车邀请赛技术报告学校:队伍名称:参赛队员:带队教师:关于技术报告和研究论文使用授权的说明本人完全了解第六届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:带队教师签名:日期:摘要随着现代科技的飞速发展,人们对智能化的要求已越来越高,而智能化在汽车相关产业上的应用最典型的例子就是汽车电子行业,汽车的电子化程度则被看作是衡量现代汽车水平的重要标志。
同时,汽车生产商推出越来越智能的汽车,来满足各种各样的市场需求。
本文以第六届全国大学生智能车竞赛为背景,主要介绍了智能车控制系统的机械及硬软件结构和开发流程。
机械硬件方面,采用组委会规定的标准 A 车模,以飞思卡尔半导体公司生产的80管脚16 位单片机MC9S12XS128MAA 为控制核心,其他功能模块进行辅助,包括:摄像头数据采集模块、电源管理模块、电机驱动模块、测速模块以及无线调试模块等,来完成智能车的硬件设计。
软件方面,我们在CodeWarrior IDE 开发环境中进行系统编程,使用增量式PD 算法控制舵机,使用位置式PID 算法控制电机,从而达到控制小车自主行驶的目的。
另外文章对滤波去噪算法,黑线提取算法,起止线识别等也进行了介绍。
关键字:智能车摄像头图像处理简单算法闭环控制无线调试第一章引言飞思卡尔公司作为全球最大的汽车电子半导体供应商,一直致力于为汽车电子系统提供全范围应用的单片机、模拟器件和传感器等器件产品和解决方案。
飞思卡尔公司在汽车电子的半导体器件市场拥有领先的地位并不断赢得客户的认可和信任。
其中在8 位、16 位及32 位汽车微控制器的市场占有率居于全球第一。
飞思卡尔公司生产的S12 是一个非常成功的芯片系列,在全球以及中国范围内被广泛应用于各种汽车电子应用中。
PID算法在智能车方向控制中的应用
PID算法在智能车方向控制中的应用智能车是指能够感知、分析、决策和执行动作的汽车。
它可以通过集成传感器、图像识别、机器学习和控制算法来实现自主导航和安全驾驶。
在智能车的控制系统中,方向控制是一个重要的组成部分。
PID算法是智能车方向控制中常用的一种算法,它能够通过实时调整车辆转向角度来实现车辆的精确控制。
PID算法是一种反馈控制算法,它通过不断地对系统输出与期望输出的差异进行检测和调整,以实现控制系统的稳定。
PID算法由比例控制、积分控制和微分控制三个部分组成。
比例控制部分根据系统输出与期望输出的差异进行比例调整,积分控制部分根据系统输出与期望输出的累积差异进行积分调整,微分控制部分根据系统输出与期望输出的变化速率进行微分调整。
这三个部分共同作用,通过实时调整控制信号来达到期望输出。
在智能车的方向控制中,PID算法可以通过以下步骤应用:1.传感器数据获取:智能车通常配备了多种传感器,如惯性传感器、陀螺仪和激光雷达等,用于感知车辆的运动状态和周围环境。
PID算法需要读取传感器数据作为反馈信号。
2.设置期望输出:根据预定的路线或目标,可以设置一个期望的转向角度作为系统的期望输出。
3.计算误差:将传感器数据中获取的实际转向角度与期望转向角度进行比较,计算得出误差。
误差可以表示为实际转向角度减去期望转向角度的差异。
4.比例控制:根据误差的大小,比例控制部分会调整控制信号的大小,从而影响车辆的转向角度。
比例系数越大,车辆的响应速度越快,但可能会引起过冲或震荡现象。
5.积分控制:积分控制部分会通过累积误差来调整控制信号,从而消除系统的稳态误差。
积分系数越大,车辆的稳定性越好,但可能会引起过冲现象。
6.微分控制:微分控制部分会通过测量误差的变化率来调整控制信号,从而降低车辆的震荡现象。
微分系数越大,车辆的稳定性越好,但可能会引起过度补偿。
7.发送控制信号:根据比例控制、积分控制和微分控制的结果,生成控制信号并发送给车辆的转向系统,从而实现转向角度的调整。
智能车PID算法实现原理讲解
智能车PID算法实现原理讲解引言智能车是一种能够通过传感器收集环境信息,然后分析、决策、控制并实现自主导航的车辆。
PID(Proportional-Integral-Differential)控制算法是智能车中常用的一种控制方法,可以实现对车辆的位置、速度等参数进行精确调节。
本文将对PID算法的实现原理进行详细讲解。
一、PID控制算法原理PID控制算法是一种经典的反馈控制算法,通过对系统的误差进行连续检测和调整,使得系统能够自动调整到期望值附近并保持稳定。
PID算法由三个部分组成:比例控制(P),积分控制(I)和微分控制(D)。
1.比例控制(P)比例控制是基于误差的当前值来进行控制调整的,它通过将误差乘以一个比例系数来调整控制量的变化。
这意味着当误差增大时,控制量的变化也会增大。
2.积分控制(I)积分控制是基于误差的历史累积值来进行控制调整的,它通过将误差的累积值乘以一个积分系数来调整控制量的变化。
这意味着当误差持续存在时,控制量的变化会逐渐增大,从而更好地调整系统。
3.微分控制(D)微分控制是基于误差的变化率来进行控制调整的,它通过将误差的变化率乘以一个微分系数来调整控制量的变化。
这意味着当误差快速变化时,控制量的变化也会被加大。
二、PID算法实现步骤基于PID算法的智能车控制实现需要按照以下步骤进行:1.设定目标值(设定值)和实际值(反馈值)。
目标值为期望的位置或速度,实际值通过传感器获取。
2.计算误差。
误差可以通过将设定值减去实际值得到。
3.计算比例控制量。
比例控制量可以通过将误差乘以比例系数得到。
4.计算积分控制量。
积分控制量可以通过将误差的累积值乘以积分系数得到。
5.计算微分控制量。
微分控制量可以通过将误差的变化率乘以微分系数得到。
6.将比例控制量、积分控制量和微分控制量相加得到最终的控制量。
7.根据最终的控制量来调整车辆的状态,例如调整轮速、转向角度等。
8.循环执行上述步骤,使得车辆能够持续地调整控制量,使得实际值逐渐接近设定值,从而实现稳定的控制。
智能车速度控制pid(电机闭环控制算法)
智能车速度控制pid(电机闭环控制算法)对于智能车的电机闭环控制算法,我之所以标题没有写上智能车电机PID闭环控制算法是因为PID 算法根本就不是特别好的适用于智能车这种变化很快的系统,对于智能车,电机的调速可以说是时时刻刻再进行调速控制的,我上面说描述的经典PID 算法,都是针对一些惰性系统,也就是说是变化比较慢的系统的,所以对于智能车的电机调速采用完完整整的PID 算法,是根本不可取的,及时采用了,你必须要经过一些变换和改进才能使用。
以上的简述只是鄙人自己的看法,如有错误,请各位高手指正。
现在估计您会疑问,PID 不适用于智能车的电机控制,那什么才适用呢?鄙人原来做过智能车,从鄙人本身的理解,P 算法控制电机,也就是比例控制是最好的,反应速度快,控制精度高,不存在积分和微分效应,非常适用于适用于控制周期短的系统,当然,对于一些特殊的逻辑控制算法,可能要采用PD算法,用微分来做补偿,防止震荡和超调。
下面来说下电机控制算法从开始的加入到最终的确定的方法:当然这一切的前提就是安装了编码器,车速有反馈,只有加上编码器,有了反馈,才能组成一个闭环系统。
当然您也可以加上码盘,或者霍尔开关等一切可以返回车速的东西都可以。
(1)首先建议在车速比较慢的时候,采用PID 算法来控制电机,为什么开始要建议您采用PID 呢?主要是为了让您更加深刻理解PID 算法的精髓和调试步骤方法等,有助于以后对控制算法更加深入的研究和书写。
调试PID 三个参数的方法,很多地方都提供了,我在这里简单的说下:首先将ID 参数都变为0,先调整P 比例参数,调整到速度基本上跟您给定的速度差不多,也就是说基本稳定在您给定的脉冲数,当然这个时候会非常的震荡,不要担心,接下来调整I,调整I 的结果就是震荡会消除很多,但是车速会变化缓慢,也就是说会有一些延迟,然后再调整D,调整D 的结果就是增强调节的灵活性和预见性,在给定速度变化的过程中,能够以一个平稳过渡来变换,而且速度可以长时间稳定在给定速度附近,然后PID 三个参数的基本范围就确定了,然后再根据实际的跑车来微调这些参数,当然在您调试PID之前,请仔细阅读PID 理论知识,这样有助于您的调试和理解,。
飞思卡尔智能车电磁组分区算法介绍
飞思卡尔智能车电磁组分区算法介绍写在之前的话:1、⽬前我是⼀名在校学⽣,这也是我第⼀次写博客,不周之处,请多谅解;2、此算法并⾮原创,借鉴⾃⼭东德州学院第⼋届⽩杨队(PS:个⼈看法,对于⼀些⼈把别⼈的开源东西改头换⾯⼀下就说是⾃⼰的原创⾏为⼗分鄙视);3、对于此算法的理解和说明并⾮纸上谈兵,算法已经被我运⽤到了⼩车⽐赛中并取得好的成绩(具体就不多说了,⽐赛时车莫名其妙坏了,⽐赛前调试的速度绝对能进国赛,⽐较遗憾),总之这算法是我尝试过的最好的算法;4、这⼀次所介绍的只是路径算法和⼀些知识普及,后⾯有时间会介绍其余部分算法及许多好的思路(舵机电机控制思路(不只是简单的PID),双车策略);5、希望对于这⽅⾯有涉及的⼈能与我联系并交流或指出不⾜之处。
---------------------------------------------------------------分割线-----------------------------------------------------------------------------⼀、没有这⽅⾯了解的可以看看 飞思卡尔智能车分为三组:摄像头、光电、电磁,我做的是电磁车,三种车队区别在于传感器的不同,所以获得路径信息的⽅法也不⼀样,摄像头和光电识别的是赛道上的⿊线(⽩底赛道),⽽电磁车则是检测埋在赛道下的通⼊100mh电流的漆包线,摄像头和光电采⽤的是摄像头和ccd作为传感器,电磁则是⽤电感放在漆包线周围,则电感上就会产⽣感应电动势,且感应电动势的⼤⼩于通过线圈回路的磁通量成正⽐,⼜因为漆包线周围的磁感应强度不同,因此不同位置的电感的感应电动势就不同,因此就可以去确定电感位置;因此在车⼦前⾯设置了50cm的前瞻,电感布局如下(怎么发不了图⽚):分为两排,前排3个,编号0,1,2(前期还加了两个竖直电感⽤来帮助过直⾓弯,后来改为了⼋字电感);后排2个,编号3,4;现在车⼦获得了不同位置的感应电动势的⼤⼩了,但这些值是不能处理的:1、感应电动势太微弱;2、是模拟信号,信号太微弱就放⼤它;这就涉及到模拟电路的知识了,就不多说了(因为要把这讲完到PCB绘制的篇幅就⾜够写另开⼀号专门写这些⽅⾯来(PS:题外话(我的题外话⽐较多)):放⼤部分外围你设计的再好也抵不过⼀个更好的芯⽚,有两个例⼦,⼀个是我⾃⼰的:之前⽤的是NE5532,但是效果不理想,加了好多什么滤波,补偿,都⽤上,没⽤,软件⾥处理后⾯再说,后来⼀狠⼼换了AD620,感觉像是春天来了,因为它是仪⽤放⼤器,还有就是贵。
飞思卡尔智能车简介
智能车制作F R E E S C A L E学院:信息工程学院班级:电气工程及其自动化132 学号:6101113078姓名:李瑞欣目录:1. 整体概述2.单片机介绍3.C语言4.智能车队的三个组5.我对这门课的建议一、整体概述智能车的制作过程包括理论设计、实际制作、整车调试、现场比赛等环节,要求学生组成团队,协同工作。
内容涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科多专业。
下面是一个智能车的模块分布:总的来说智能车有六大模块:信号输入模块、控制输出模块、数据处理模块、信息显示模块、信息发送模块、异常处理模块。
1、信号输入模块:智能车通过传感器获知赛道上的路况信息(直道,弯道,山坡,障碍物等),同时也通过传感器获取智能车自身的信息(车速,电磁电量等)。
这些数据构成了智能车软件系统(大脑)的信息来源,软件系统依靠这些数据,改变智能车的运行状态,保证其在最短的时间内按照规定跑完整个赛道。
2、控制输出模块:智能车在赛道上依靠转向机构(舵机)和动力机构(电机)来控制运行状态,这也是智能车最主要的模块,这个模块的好坏直接决定了你的比赛成绩。
电机和舵机都是通过PWM控制的,因此我们的软件系统需要根据已有的信息进行分析计算得到一个合适的输出数据(占空比)来控制电机和舵机。
3数据处理模块:主要是对电感、编码器、干簧管的数据处理。
信号输入模块得到的数据非常原始,有杂波。
基本上是不能直接用来计算的。
因此需要有信号处理模块对采集的数据进行处理,得到可用的数据。
4信息显示模块:智能车调试过程中,用显示器来显示智能车的部分信息,判断智能车是否正常运行。
正式比赛过程中可关闭。
主流的显示器有:Nokia 5110 ,OLED模块等,需要进行驱动移植。
5信息发送模块智能车的调试过程中,我们需要观察智能车的实时状态(采集的信号是否正常,输出是否正常),这个时候就需要用到信息发送模块,将智能车运行时的数据发送到电脑上就行分析处理。
pid算法控制舵机
pid算法控制舵机章节一:引言(约200字)本文将探讨PID算法在舵机控制中的应用。
舵机是一种常见的电动机构,在机器人控制、航空航天领域等多个领域中被广泛应用。
而PID算法作为一种经典的控制方法,具有良好的稳定性和鲁棒性。
通过将PID算法应用于舵机控制中,可以实现对舵机的位置、速度和加速度等参数的精确控制,从而满足各种实际应用的需求。
章节二:PID算法原理及框架(约300字)PID算法是指通过对系统的误差、误差变化率和误差积分进行加权求和,计算出控制量的大小来实现目标控制的一种反馈控制算法。
PID算法基本框架如下:首先,通过测量系统的输出值和目标值的差异来得到误差;然后,将误差通过比例、积分、微分三个部分进行处理,得到PID控制量;最后,将PID控制量作为输入量,对系统进行控制。
章节三:PID算法在舵机控制中的应用(约300字)PID算法在舵机控制中常常应用于位置控制。
首先,通过测量舵机的当前位置和目标位置的差异来计算出误差;然后,根据比例、积分、微分三个参数对误差进行处理,得到PID控制量;最后,将PID控制量转化为PWM信号,控制舵机的转动角度。
通过不断调整PID参数,可以实现对舵机位置的精确控制。
另外,PID算法还可以应用于舵机的速度和加速度控制。
在速度控制中,通过测量舵机转动角度的变化率和目标角速度的差异来计算速度误差;而在加速度控制中,通过测量转动角度变化率的变化率和目标加速度的差异来计算加速度误差。
然后,根据比例、积分、微分三个参数对误差进行处理,得到相应的PID控制量,通过PWM信号控制舵机的转速和加速度。
章节四:PID算法在舵机控制中的应用案例(约200字)本文选取了一种基于PID算法的舵机控制应用案例进行研究。
通过将PID算法应用于舵机的位置控制中,实现对舵机的精确控制。
策略具体是:首先,通过测量舵机的当前位置和目标位置的差异来计算出误差;然后,根据比例、积分、微分三个参数对误差进行处理,得到PID控制量;最后,将PID控制量转化为PWM信号,控制舵机的转动角度。
舵机的pid控制
舵机的pid控制舵机的PID控制第一章:引言(200字)舵机作为一种常见的控制元件,广泛应用于机械、电子等领域。
PID(Proportional Integral Derivative)控制是一种经典的控制策略,被广泛用于舵机的控制系统中。
本章将介绍舵机的基本原理和PID控制的基本概念,为后续章节的讨论做铺垫。
第二章:舵机原理(300字)本章将介绍舵机的基本原理。
舵机主要由电机、减速器和位置反馈装置组成。
当输入控制信号到达舵机时,电机会根据信号的大小和方向旋转,减速器将电机的转动转化为角度的改变,位置反馈装置将当前舵机位置的信号反馈给控制系统。
进一步,我们将分析舵机的工作原理和角度控制方法,以便后续章节的PID控制算法的设计和仿真。
第三章:PID控制算法(400字)本章将重点讨论PID控制算法在舵机中的应用。
PID控制算法包含比例项、积分项和微分项,分别用来消除舵机的静态误差、减小超调和改善系统的动态响应。
在舵机的PID控制中,我们需要根据具体的应用需求来调整PID参数。
对于一些要求较高的应用,如无人机的姿态控制等,可以采用自适应PID控制算法。
此外,本章还将介绍PID控制算法的设计和调试方法。
第四章:仿真与实验结果(200字)本章将利用仿真和实验结果验证舵机的PID控制算法的有效性。
首先,我们将使用MATLAB或Simulink等软件工具搭建舵机的控制系统模型,并通过仿真来验证PID控制算法的性能。
接下来,我们将设计和实施一系列实验,通过对比不同PID参数设置和不同输入信号对舵机控制性能的影响,评估所提出的PID控制算法的性能。
结论(100字)通过本论文的研究,我们验证了PID控制算法在舵机控制系统中的有效性。
通过合理设置PID参数,我们能够达到较好的控制性能,如较小的超调、快速响应和高精度控制。
这对于提高机械装置和机器人的运动精度和稳定性具有重要意义,也为舵机控制系统的设计和应用提供了有效的参考。
智能车PID 算法实现原理讲解
为了实现PID控制所需要的等间隔采样,我们使用了一个定时中断,每2ms进行一次数据采样和PID计算。
与此并行,系统中还设计了一个转速脉冲检测中断,从而实现了转速检测。
为了调试的需要,程序中还在main{}函数中加入了相关的调试代码,这部分代码有最低的优先级,可以在保证不影响控制策略的情况下实现发送调试数据等功能。
检测环节对整个控制系统的质量起到至关重要的作用4。
3。
2 PID控制调整速度本系统采用的是增量式数字PID控制,通过每一控制周期(10ms)读入脉冲数间接测得小车当前转速vi_FeedBack,将vi_FeedBack与模糊推理得到的小车期望速度vi_Ref比较,由以下公式求得速度偏差error1与速度偏差率d_error。
error1 = vi_Ref– vi_FeedBack;(公式3) d_error = error1 –vi_PreError;(公式4)公式4中, vi_PreError为上次的速度偏差。
考虑到控制周期较长,假设按2.5m/s的平均速度计算,则一个控制周期小车大概可以跑过2.5cm,如果按这种周期用上述PID调节速度,则会导致加速减速均过长的后果,严重的影响小车的快速性和稳定性。
为了解决这个问题,可以在PID调速控制中加入BANG—BANG控制思想:根据error1的大小,如果正大,则正转给全额占空比;如果负大,则自由停车或给一个反转占空比;否则就采用PID计算的占空比.PID控制算法为了使赛车平滑得保持在黑线中央,即使赛车的偏移量平滑地保持在0,实用了PID控制算法.P为比例参数,D为微分参数。
基准值为0,PID输入为水平偏移量X0,PID输出为转角,转角方向:向左转为正,向右转为负。
P参数在智能车控制器中表示水平偏差量的权,D参数在智能车控制器中表示水平偏差速度的权.水平偏差量直接反映了赛车偏离黑线的程度,例如赛车偏向黑线的左边越厉害,则赛车的右转角度将越大。
《智能车PID算法的设计》实验综述
对高 阶系统非 常有利 ,它加快 了系统 的跟 踪速度 。但微分 的作用 对输入信 号的 噪声 很敏感 ,对那 些噪声 较大 的系统一般不 用微
分 ,或在 微分起作用之前先对输入信号进行 滤波 。
由于计算 机控制是 一种采样控 制 ,它只能根据 采样时刻 的偏差计算控 制量 ,而不能像模 拟控制那样连 续输 出控制量 ,进行 连
u ): 窆
J=0
J=0
de(t) e(kT)-e[(k-1)T]
—
—
—
—
:
(2)
上式 中,为了计算 方便 将 e( 简化成 e 则可 以得 到离散的 PID表达式为
《智 能车 PID算法 的设计》实验综述
李概 金力
(安徽 中医药大学 医药信息工程学院 ,安徽 合 肥 230031) 摘要 :智能车PID算法的设 计实验综合运用 了C语 言程序设计 、单片机 原理及 现代控 制理论等课程知识 。学生通过 实验 , 掌握 智能车PID算法的基本原理 ,提 高学生综合运 用知识和创新能力。 关键词 :PID算法 ;智 能车 ;舵机控制 中图 分 类 号 :TP318 文献 标 识 码 :A 文章 编 号 :1009-3044(2013)16—3826—04
鉴 于上述原 因,文献[3]中采 用模 拟 PID控制器 ,该控制 器是一种负反馈 闭环 控制 ,通 常将被控对象 串联连 接 ,设 置在负反馈 闭
环 控制 的前 向通 道上 。模 拟PID控制器的控制规律为 :
,
.+
d ,、
u = e )+TJoe(t)dt+ 】
‘ i
(1)
其 中,K 为 比例系数 ; 为积分常数 ;Td为微分常数 。
舵机及PID控制
占空比:在周期型的现象中,某种现象发生后持续的时间与总时间的比
-->例如,在成语中有句话:「三天打渔,两天晒网」,如果以三天为一个周期,“打渔”的这个成语说得很对,就拿来它做例子,根据这个成语,大家也应该懂占空比的意思了。
-->组成:舵盘、减速齿轮组、位置反馈电位计、直流电机、控制电路等
-->工作原理:控制信号→控制电路板→电机转动→齿轮组减速→舵盘转动→位置反馈电位计→控制电路板反馈。
-->输入线:中间红色——电源线Vcc;黑色——地线GND;白色/橘黄色——控制信号线
-->信号:pwm信号,其中脉冲宽度从0.5-2.5MS,相对应的舵盘位置为0-180度,呈线性变化。
--&g机用PID控制是使小车保持在赛道中央,即偏移距离为0.根据传感器反馈过来的偏移距离用PID计算出给舵机的脉宽,这样就会使小车的偏移距离为0。在飞思卡尔智能车项目里面,我们就会用到PID算法,比如车爬坡和平底连续拐弯时。
PID算法的应用基础最开始是对PCB板上的运放的PID参数就行调校。P对应于运放增益;I是运放输入和输出端之间接一个电容引入反馈,就是控制器的输出和输入误差会累积起来影响输出;D就是运放输入端串接一个电容,起的微分作用是阻止输出与输入误差的变化,结合示波器来观察控制电机的PID参数设定。
PID控制:一种调节器控制规律为比例、积分、微分的控制。其中:P:比例(proportion)、I:积分(integral)、D:导数(derivative)
-->其输入e(t)与输出u(t)的关系为:
式子中Kc为比例系数,T1为积分时间参数,Td为微分时间常数。
-->
各个参数的意义作用:
小车循迹的pid算法
小车循迹的pid算法小车循迹的PID算法引言:小车循迹是一种常见的机器人应用场景,它能够通过感知地面上的黑线或其他标记物,实现自动导航。
PID控制算法是循迹小车中常用的控制算法之一,它通过对误差进行反馈调节,使小车能够准确地跟随黑线运动。
本文将介绍PID算法的基本原理及其在循迹小车中的应用。
一、PID控制算法的基本原理PID控制算法是一种经典的反馈控制算法,它由比例(P)、积分(I)和微分(D)三个部分组成。
PID控制器根据当前误差的大小和变化率,计算出一个控制量,用于调节系统的输出,使得误差尽可能接近零。
具体来说,PID控制器的计算公式如下:输出 = Kp * 偏差 + Ki * 积分项 + Kd * 微分项其中,Kp、Ki和Kd分别是比例、积分和微分系数,偏差是当前误差,积分项是历史误差的累加,微分项是误差的变化率。
通过调节这三个系数,可以得到合适的控制效果。
二、PID算法在循迹小车中的应用在循迹小车中,PID算法可以用于控制小车的转向角度,以实现沿着黑线行驶。
具体来说,循迹小车通过感知地面上的黑线,将其转化为电信号输入到PID控制器中。
PID控制器根据当前偏差和偏差的变化率,计算出相应的控制量,用于调节小车的转向角度。
1. 比例控制(P):比例控制是PID控制算法的基础部分,它根据当前偏差的大小,产生一个与偏差成正比的控制量。
在循迹小车中,比例控制可以使小车快速响应偏差,但容易产生震荡。
2. 积分控制(I):积分控制是为了解决比例控制产生的静差问题而引入的,它根据历史偏差的累加,产生一个与偏差累加值成正比的控制量。
在循迹小车中,积分控制可以消除偏差,使得小车能够更加稳定地行驶。
3. 微分控制(D):微分控制是为了解决比例控制产生的震荡问题而引入的,它根据偏差的变化率,产生一个与偏差变化率成正比的控制量。
在循迹小车中,微分控制可以使小车对偏差的变化更加敏感,从而减少震荡。
综合应用:在循迹小车中,PID控制算法通常会综合应用比例、积分和微分控制,以实现更好的控制效果。
电磁组智能车简介
3.电机
4.舵机
5.车模
6.主控芯片电路板
四、编译环境
1、16位单片机所用编译软件:CodeWarrior
2、32位单片机所用编译软件:IAR
/*****************************************/ Volume serial number is 706C-C11E EXTI.H #ifndef _EXTI_H_ #define _EXTI_H_
Freescale Smart Car
电磁组智能车
2013 D车运行原理 控制方法 硬件介绍 编译环境
一、电磁组小车运行原理
1.车模通过感应由赛道中心导线产生的交变磁场进行路径检测
2.要让小车自己沿着赛道跑就要让小车能通过传感器的信号自动的识别当前所 处的位置,以及距离赛道中心的大概距离。我们通过制作传感器来采集模拟信 号,然后传给单片机,然后编程来实现小车位置的判别以及控制小车采取相应 动作。
Hello Tomorrow!
Thanks
/************************************* *******************************/ /*! * \brief Kinetis Identify * \return None * typedef enum exti_cfg * This is primarly a reporting function that { displays information zero_down = 0x08u, //低电平触发,内部下 拉 * about the specific CPU to the default rising_down = 0x09u, //上升沿触发,内部下 terminal including: 拉 * - Kinetis family falling_down = 0x0Au, //下降沿触发,内部下 * - package 拉 * - die revision either_down = 0x0Bu, Projects //跳变沿触发,内部下 Programs * - P-flash size 拉 * - Ram size one_down = 0x0Cu, //高电平触发,内部下 */ 拉 |void cpu_identify (void) //用最高位标志上拉和下拉 |{ zero_up = 0x88u, //低电平触发,内部上拉 | /* Determine the Kinetis family */ rising_up = 0x89u, //上升沿触发,内部上拉 | switch((SIM_SDID & falling_up = 0x8Au, //下降沿触发,内部上拉 SIM_SDID_FAMID(0x7))>>SIM_SDID_FAMID_S either_up = 0x8Bu, //跳变沿触发,内部上拉 one_up = 0x8Cu //高电平触发,内部上拉 HIFT) | { +----} exti_cfg; | case 0x0: void exti_init(PORTx, uint8 n, exti_cfg); | printf("\nK10-");
智能车舵机PD运算
/**********************舵机增量式PID算法*********************** double ref = 0;//设置参数设定值double feb = 0;//采样反馈过程值int pwm_var = 0; //PID调整量int PWM_out = 0; //PWM输出量double Uo = 0;double Ek = 0;double Ei = 0;double Ed = 0;#define Kp 8 //PID调节的比例常数#define Ti 0.05 //PID调节的积分常数#define Td 0.02 //PID调节的微分时间常数#define T 0.02 //采样周期#define Kpp Kp * ( 1 + (T / Ti) + (Td / T) ) #define Ki (-Kp) * ( 1 + (2 * Td / T ) )#define Kd Kp * Td / T//#define Kpp 4//#define Ki 0.8//#define Kd 20//误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡#define Emin 3//调整值限幅,防止积分饱和#define Umax 100#define Umin -100//输出值限幅#define Pmax 15500#define Pmin 200///////////////////////////////////////////////////////////////////////// PID运算 ///////void pid_ctrl(void){Ek = ref - feb; //差值运算if( fabs(Ek) < Emin ) //误差的阀值(死区控制??){pwm_var = 0;}else{Uo = Kpp*Ek + Ki*Ei + Kd*Ed;//PID计算Ed = Ei;Ei = Ek;pwm_var = (int)Uo; //制转化调整量,PWM为整数if(pwm_var >= Umax)pwm_var = Umax; //调整值限幅,防止积分饱和 if(pwm_var <= Umin)pwm_var = Umin; //调整值限幅,防止积分饱和 }PWM_out += pwm_var; //调整PWM输出if(PWM_out > Pmax)PWM_out = Pmax; //输出值限幅if(PWM_out < Pmin)PWM_out = Pmin; //输出值限幅TBCCR1 = PWM_out;//输出给寄存器,改变PWM占空比}#define G_Kp 8 //P 8#define G_Ki 15 //I#define G_Kd 0 //Dint error;int pre_error;int last_error;int U_error;uint U_Pre1=9000; //摆头舵机中心位置uint U_Pre2=8600; //方向舵机中心位置uchar sum;uchar temp,tt,ss;/**************************************************函数:delay_ms()描述:延迟x*10微秒**************************************************/void delay(uint time){while(time--){_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);}}void display(){sum = 0;error = 0;/*********************************/PORTA = 0x00;delay(100);if(PORTA_PA0 == 1){sum++;error -= 12;}/*********************************/ PORTA = 0x02;delay(100);if(PORTA_PA0 == 1){sum++;error -= 10;}/*********************************/ PORTA = 0x04;delay(100);if(PORTA_PA0 == 1){sum++;error -= 8;}/*********************************/ PORTA = 0x08;delay(100);if(PORTA_PA0 == 1){sum++;error -= 6;}/*********************************/ PORTA = 0x0a;delay(100);if(PORTA_PA0 == 1){sum++;error -= 4;}/*********************************/ PORTA = 0x0c;delay(100);if(PORTA_PA0 == 1){sum++;error -= 2;}/*********************************/ PORTA = 0x10;delay(100);if(PORTA_PA0 == 1){sum++;error += 2;}/*********************************/ PORTA = 0x12;delay(100);if(PORTA_PA0 == 1){sum++;error += 4;}/*********************************/ PORTA = 0x14;delay(100);if(PORTA_PA0 == 1){sum++;error += 6;}/*********************************/ PORTA = 0x18;delay(100);if(PORTA_PA0 == 1){sum++;error += 8;}/*********************************/ PORTA = 0x1a;delay(100);if(PORTA_PA0 == 1){sum++;error += 10;}/*********************************/ PORTA = 0x1c;delay(100);if(PORTA_PA0 == 1){sum++;error += 12;}PORTA = 0x17; //激光消影/*********************************/if((sum>0)&&(sum<5)){error = (int)(error/(sum));if(error>4)U_error = 220;else if(error<-4)U_error = -220;else if(error>6)U_error = 320;else if(error<-6)U_error = -320;else if(error>8)U_error = 420;else if(error<-8)U_error = -420;elseU_error = ((G_Kp*(error-pre_error)+G_Ki*error+G_Kd*(error-2*pre_err or+last_error)));if(U_error >420)U_error = 420;else if(U_error <-420)U_error = -420;U_Pre1 += U_error;if(U_Pre1>12000)U_Pre1 = 12000;else if(U_Pre1<6000)U_Pre1 = 6000;PWMDTY01 = U_Pre1;if(U_Pre1 > 9000) U_Pre2 = (8600+(((U_Pre1-9000)*9)/10));else U_Pre2 = (8600-(((9000-U_Pre1)*7)/10));if(U_Pre2 > 9800) U_Pre2 = 9800;else if(U_Pre2 < 7400) U_Pre2 = 7400;PWMDTY45 = U_Pre2;}last_error=pre_error;pre_error=error;/**********************///速度调节if((U_Pre2>9600)||(U_Pre2<7600)){if(temp == 6){PTP_PTP7 = 1; //电机正转delay(100);PTP_PTP7 = 0;}if(temp == 1){tt++;if(tt == 1)PWMDTY3 = 50;} else{tt = 0;temp = 1;}}else if((U_Pre2>9400)||(U_Pre2<7800)){if(temp == 2){tt++;if(tt == 2)PWMDTY3 = 70;} else{tt = 0;temp = 2;}}else if((U_Pre2>9200)||(U_Pre2<8000)){if(temp == 3){tt++;if(tt == 2)PWMDTY3 = 75;} else{tt = 0;temp = 3;}}else if((U_Pre2>9000)||(U_Pre2<8200)){if(temp == 4){tt++;if(tt == 2)PWMDTY3 = 80;} else{tt = 0;temp = 4;}}else if((U_Pre2>8700)||(U_Pre2<8500)){if(temp == 5){tt++;if(tt == 2)PWMDTY3 = 83;}else{tt = 0;temp = 5; }}else if((U_Pre2<8700)||(U_Pre2>8500)) //直道{if(temp == 6){tt++;if(tt == 2)PWMDTY3 = 85;}else{tt = 0;temp = 6; }}/************************************************************/ }。
基于Freescale9S+12DG128的智能车控制系统设计
传感器模块, 是智能车的 “眼睛” , 可以通过一定的前瞻性, 提前 感知前方的跑道信息, 为智能车的 “大脑” 做出决策提供必要的依据 和充足的反应时间。 电源模块, 是整个智能车的 “力量源泉” , 统提供合适而又稳定 的电源。 电机驱动模块, 驱动直流电机和伺服电机完成智能车的加减速 控制和转向控制。 速度检测模块, 检测反馈智能车后轮的转速, 用于速度的闭环 控制。 辅助调试模块主要用于智能车系统的功能调试、 智能车状态监 控等方面。
3.3 PID 控制
P ID控制策略其结构简单, 稳定性好, 可靠性高, 并且易于实 现。 其缺点在于控制器的参数整 定相当繁琐, 需要很强的工程经 验。 相对于其他的控制方式, 在成 熟性和可操作性上都有着很大的 优势。 所以最后我们选择了P I D 的控制方式。 在电机速度的控制上, 选用 了增量式P ID控制, 使电机能够 根据道路情况快速准确的改变转 速, 实现入弯时减速, 出弯时加 速。 在本方案中, 使用试凑法来确
数控技术
数字技术 与应用
基于 Freescale9S 12DG128 的智能车控制系统设计
秦健强 贾旭 刘凤国 张晓军
(山东交通学院信电学院 山东济南 250023)
摘要: 本智能车控制系统采用飞思卡尔16位单片机MC9S12DG128作为核心控制单元, 自主构思控制方案及系统设计, 主要包括传感器信 号采集处理、 控制算法及执行、 直流电机驱动、 转向舵机控制等。 较好的完成在规定跑道, 特别是弯道、 坡道的竞速要求。 关键词: MC9S12XS128 传感器 闭环反馈控制 速度闭环控制 舵机控制 中图分类号:TP242 文献标识码: A 文章编号: 1007-9416(2012)09-0006-03
3.5 系统软件流程图
PID算法原理及调整规律
PID算法原理及调整规律一、PID算法简介在智能车竞赛中,要想让智能车根据赛道的不断变化灵活的行进,PID算法的采用很有意义。
首先必须明确PID算法是基于反馈的。
一般情况下,这个反馈就是速度传感器返回给单片机当前电机的转速。
简单的说,就是用这个反馈跟预设值进行比较,如果转速偏大,就减小电机两端的电压;相反,则增加电机两端的电压。
顾名思义,P指是比例(Proportion),I指是积分(Integral),D指微分(Differential)。
在电机调速系统中,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。
要想搞懂PID算法的原理,首先必须先明白P,I,D各自的含义及控制规律:2 比例P:比例项部分其实就是对预设值和反馈值差值的发大倍数。
举个例子,假如原来电机两端的电压为U0,比例P为0.2,输入值是800,而反馈值是1000,那么输出到电机两端的电压应变为U0+0.2*(800-1000)。
从而达到了调节速度的目的。
显然比例P越大时,电机转速回归到输入值的速度将更快,及调节灵敏度就越高。
从而,加大P值,可以减少从非稳态到稳态的时间。
但是同时也可能造成电机转速在预设值附近振荡的情形,所以又引入积分I解决此问题。
2 积分I:顾名思义,积分项部分其实就是对预设值和反馈值之间的差值在时间上进行累加。
当差值不是很大时,为了不引起振荡。
可以先让电机按原转速继续运行。
当时要将这个差值用积分项累加。
当这个和累加到一定值时,再一次性进行处理。
从而避免了振荡现象的发生。
可见,积分项的调节存在明显的滞后。
而且I值越大,滞后效果越明显。
2 微分D:微分项部分其实就是求电机转速的变化率。
也就是前后两次差值的差而已。
也就是说,微分项是根据差值变化的速率,提前给出一个相应的调节动作。
可见微分项的调节是超前的。
并且D值越大,超前作用越明显。
可以在一定程度上缓冲振荡。
智能小车pid算法
3.1寻迹算法采用PID(PD)控制算法,如果某时刻检测到黑线偏左,就要向左转弯;如果检测到黑线偏右,就要向右转。
偏得越多,就要向黑线方向打越大的转角。
这就是比例控制(P)。
遗憾的是,因为小车有惯性。
假设黑线偏左,说明小车偏右了,需要左传舵,等到小车回到中心的时候,停止转舵,可是小车的惯性会使车身继续左转,直到冲过黑线,黑线又偏右。
然后控制过程反复,车身是在左右摇摆中向前行走的。
这种摇摆叫做“超调”,超调越大,控制越不稳定,容易出轨。
为了克服惯性,我们除了位置信息之外,还需要知道轨迹的变化趋势。
我们可以用黑线位置的微分值来提前得到变化趋势。
用本次位置减去前次位置求出差值,就大致知道偏移量的变化趋势。
将该差值和比例相加后一起作为控制量,即可实现提前控制。
这就叫做比例微分控制(PD控制)/*PID(PD)控制算法*/int PID_Control(signed char Position){int Temp_P,Temp_D,Temp_PID,Temp_I,k; //声明三个变量,用于存放P、I、D三分量的运算结果(I没用上)if(Position==-128) return (No_black); //错误处理(值得改进的地方)else{Temp_I=Position;for(k=0;k<5;k++)Temp_I+=Last_Position[k];Temp_I*=I_coefficient;Temp_P=P_coefficient*Position; //计算比例分量(P)=比例系数*本次位置差Temp_D=D_coefficient*(Position-Last_Position[5]); //计算微分分量(D)=微分系数*(本次位置差-前3次的位置差)//注意由于采样比较快,用本次位置-前3次位置才有足够大的控制量Last_Position[6]=Last_Position[5];Last_Position[4]=Last_Position[3];Last_Position[3]=Last_Position[2];Last_Position[2]=Last_Position[1];Last_Position[1]=Last_Position[0];Last_Position[0]=Position; /*保存前5次的位置,以备用。
舵机pid控制算法的优点及介绍
舵机pid控制算法的优点及介绍舵机是一种常用的电子元件,用于控制机械装置的转动,如机器人、汽车、航空模型等。
为了准确控制舵机的转动,科学家们提出了舵机PID控制算法,该算法具有许多优点,并在许多领域得到广泛应用。
一、舵机PID控制算法的介绍舵机PID控制算法是一种基于比例(P)、积分(I)和微分(D)的控制方法,通过对输出信号进行调节,使舵机转动到期望位置。
具体来说,PID控制算法通过不断地计算误差信号的P、I和D项,并将其加权求和,得到最终的控制信号,将舵机转到期望位置。
以下是PID控制算法的三个核心部分:1. 比例项(P):比例项使用误差信号的比例来进行控制。
它的作用是根据当前误差的大小,产生一个与误差成比例的控制信号。
比例项可以帮助舵机更快地接近期望位置,但它不能消除稳定性问题并且有可能引起震荡。
2. 积分项(I):积分项考虑误差的历史累积。
它的作用是消除稳态误差,确保舵机最终能够达到准确位置。
积分项可以帮助舵机准确度更高,但如果过度增大积分项的权重,可能会导致系统不稳定。
3. 微分项(D):微分项使用误差变化率来进行调节。
它的作用是抑制系统的超调和减小震荡时间。
微分项可以帮助舵机更快地响应变化,并减少超调,但如果过度增大微分项的权重,有可能会增加噪声干扰。
二、舵机PID控制算法的优点舵机PID控制算法具有以下几个优点:1. 稳定性:PID控制算法通过P、I和D三个项的控制,可使舵机在达到期望位置后保持稳定。
通过适当调整PID参数,可以保证系统在不同条件下都能稳定工作。
2. 鲁棒性:PID控制算法对于外部干扰或参数变化具有一定的鲁棒性。
在舵机运行过程中,如果遇到负载变化、电源波动等情况,PID控制算法能够及时调整输出信号,保持舵机的准确控制。
3. 精确度:PID控制算法能够准确地控制舵机的位置,使其尽可能接近期望位置。
调整PID参数可以进一步提高舵机的精确度,满足不同应用需求。
4. 响应速度:PID控制算法对于舵机的响应速度较快。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**********************舵机增量式PID算法*********************** double ref = 0;//设置参数设定值double feb = 0;//采样反馈过程值int pwm_var = 0; //PID调整量int PWM_out = 0; //PWM输出量double Uo = 0;double Ek = 0;double Ei = 0;double Ed = 0;#define Kp 8 //PID调节的比例常数#define Ti 0.05 //PID调节的积分常数#define Td 0.02 //PID调节的微分时间常数#define T 0.02 //采样周期#define Kpp Kp * ( 1 + (T / Ti) + (Td / T) )#define Ki (-Kp) * ( 1 + (2 * Td / T ) )#define Kd Kp * Td / T//#define Kpp 4//#define Ki 0.8//#define Kd 20//误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡#define Emin 3//调整值限幅,防止积分饱和#define Umax 100#define Umin -100//输出值限幅#define Pmax 15500#define Pmin 200///////////////////////////////////////////////////////////////////////// PID运算 ///////void pid_ctrl(void){Ek = ref - feb; //差值运算if( fabs(Ek) < Emin ) //误差的阀值(死区控制??){pwm_var = 0;}else{Uo = Kpp*Ek + Ki*Ei + Kd*Ed;//PID计算Ed = Ei;Ei = Ek;pwm_var = (int)Uo; //制转化调整量,PWM为整数if(pwm_var >= Umax)pwm_var = Umax; //调整值限幅,防止积分饱和 if(pwm_var <= Umin)pwm_var = Umin; //调整值限幅,防止积分饱和 }PWM_out += pwm_var; //调整PWM输出if(PWM_out > Pmax)PWM_out = Pmax; //输出值限幅if(PWM_out < Pmin)PWM_out = Pmin; //输出值限幅TBCCR1 = PWM_out;//输出给寄存器,改变PWM占空比}#define G_Kp 8 //P 8#define G_Ki 15 //I#define G_Kd 0 //Dint error;int pre_error;int last_error;int U_error;uint U_Pre1=9000; //摆头舵机中心位置uint U_Pre2=8600; //方向舵机中心位置uchar sum;uchar temp,tt,ss;/**************************************************函数:delay_ms()描述:延迟x*10微秒**************************************************/void delay(uint time){while(time--){_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);_asm(nop);}}void display(){sum = 0;error = 0;/*********************************/PORTA = 0x00;delay(100);if(PORTA_PA0 == 1){sum++;error -= 12;}/*********************************/PORTA = 0x02;delay(100);if(PORTA_PA0 == 1){sum++;error -= 10;}/*********************************/PORTA = 0x04;delay(100);if(PORTA_PA0 == 1){sum++;error -= 8;}/*********************************/ PORTA = 0x08;delay(100);if(PORTA_PA0 == 1){sum++;error -= 6;}/*********************************/ PORTA = 0x0a;delay(100);if(PORTA_PA0 == 1){sum++;error -= 4;}/*********************************/ PORTA = 0x0c;delay(100);if(PORTA_PA0 == 1){sum++;error -= 2;}/*********************************/ PORTA = 0x10;delay(100);if(PORTA_PA0 == 1){sum++;error += 2;}/*********************************/ PORTA = 0x12;delay(100);if(PORTA_PA0 == 1){sum++;error += 4;}/*********************************/PORTA = 0x14;delay(100);if(PORTA_PA0 == 1){sum++;error += 6;}/*********************************/ PORTA = 0x18;delay(100);if(PORTA_PA0 == 1){sum++;error += 8;}/*********************************/ PORTA = 0x1a;delay(100);if(PORTA_PA0 == 1){sum++;error += 10;}/*********************************/ PORTA = 0x1c;delay(100);if(PORTA_PA0 == 1){sum++;error += 12;}PORTA = 0x17; //激光消影/*********************************/ if((sum>0)&&(sum<5)){error = (int)(error/(sum));if(error>4)U_error = 220;else if(error<-4)U_error = -220;else if(error>6)U_error = 320;else if(error<-6)else if(error>8)U_error = 420;else if(error<-8)U_error = -420;elseU_error = ((G_Kp*(error-pre_error)+G_Ki*error+G_Kd*(error-2*pre_err or+last_error)));if(U_error >420)U_error = 420;else if(U_error <-420)U_error = -420;U_Pre1 += U_error;if(U_Pre1>12000)U_Pre1 = 12000;else if(U_Pre1<6000)U_Pre1 = 6000;PWMDTY01 = U_Pre1;if(U_Pre1 > 9000) U_Pre2 = (8600+(((U_Pre1-9000)*9)/10));else U_Pre2 = (8600-(((9000-U_Pre1)*7)/10));if(U_Pre2 > 9800) U_Pre2 = 9800;else if(U_Pre2 < 7400) U_Pre2 = 7400;PWMDTY45 = U_Pre2;}last_error=pre_error;pre_error=error;/**********************///速度调节if((U_Pre2>9600)||(U_Pre2<7600)){if(temp == 6){PTP_PTP7 = 1; //电机正转delay(100);}if(temp == 1){tt++;if(tt == 1)PWMDTY3 = 50;}else{tt = 0;temp = 1;}}else if((U_Pre2>9400)||(U_Pre2<7800)){if(temp == 2){tt++;if(tt == 2)PWMDTY3 = 70;}else{tt = 0;temp = 2;}}else if((U_Pre2>9200)||(U_Pre2<8000)){if(temp == 3){tt++;if(tt == 2)PWMDTY3 = 75;}else{tt = 0;temp = 3;}}else if((U_Pre2>9000)||(U_Pre2<8200)){if(temp == 4){tt++;if(tt == 2)PWMDTY3 = 80;}else{tt = 0;temp = 4;}}else if((U_Pre2>8700)||(U_Pre2<8500)){if(temp == 5){tt++;if(tt == 2)PWMDTY3 = 83;}else{tt = 0;temp = 5; }}else if((U_Pre2<8700)||(U_Pre2>8500)) //直道{if(temp == 6){tt++;if(tt == 2)PWMDTY3 = 85;}else{tt = 0;temp = 6; }}/************************************************************/ }。