《2022年2022年结构体定义 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年结构体定义 .pdf(4页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、/* * 结构体定义区 * */ typedef struct PID int16_t pConst; / 比例常数 Proportional Const int16_t iConst; / 积分常数 Integral Const int16_t dConst; / 微分常数 Derivative Const int16_t position; int16_t hisPosition; int16_t lastPosition10; PID; /* * 函数名称: PID 参数初始化* 功能描述:初始化PID 参数,并实现P、I、D 三个参数的整定* 参数列表:* 返回结果:无*/ void
2、PIDInit(PID *iPID) memset(iPID, 0, sizeof(iPID); / 将所有值清零iPID-pConst = 2; / 比例常数 Proportional Const iPID-iConst = 0; / 积分常数 Integral Const iPID-dConst = 8; / 微分常数 Derivative Const /* * 函数名称: PID 控制程序* 功能描述:* 参数列表:* 返回结果:无*/ void PIDCalc( PID *cPID) int16_t pGain; /P 增益名师资料总结 - - -精品资料欢迎下载 - - - - -
3、- - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - int16_t iGain; /I 增益int16_t dGain; /D 增益int16_t pidGain; /控制量cPID-position = Discretized(PIN_RED & 0X1F); /对采集的循迹信号进行离散化处理得到位置信息cPID-hisPosition += cPID-position; /记录偏差之和cPID-lastPosition3 = cPID-lastPosition2; cPID-lastPos
4、ition2 = cPID-lastPosition1; / cPID-lastPosition1 = cPID-lastPosition0; / cPID-lastPosition0 = cPID-position; / pGain = (cPID-pConst) * (cPID-position); /计算比例分量 (P)=比例系数 *本次位置差iGain = (cPID-iConst) * (cPID-hisPosition); /计算积分分量(I)= 积分系数 *偏差之和dGain = (cPID-dConst) * (cPID-position) - (cPID-lastPositi
5、on3); /计算微分分量(D)= 微分系数 *( 本次位置差 -前 3 次的位置差 ) / 由于采样比较快,用本次位置-前 3 次位置才有足够大的控制pidGain = pGain + iGain + dGain; /P分量和 D 分量相加,得到控制量。if (pidGain 320) pidGain = 320; /模糊化处理,防止增量溢出if (pidGain -320) pidGain = -320; pidGain = pidGain/10; SetMotors(pidGain); / 将控制量传入电机控制函数进行控制 /* * 函数名称:电机调速* 功能描述:通过得到的pidVal
6、ue 来改变占空比大小* 参数列表:* 返回结果:*/ void SetMotors(int16_t pidV alue) / PWM_CON = _BV(ENA) | _BV(ENB) | _BV(CTRL0) |!_BV(CTRL1) | _BV(CTRL2) |!_BV(CTRL3); /left / PWM_CON = _BV(ENA) | _BV(ENB) | !_BV(CTRL0) | _BV(CTRL1) |!_BV(CTRL2) | _BV(CTRL3); /right 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
7、 - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - / PWM_CON = _BV(ENA) | _BV(ENB) | _BV(CTRL0) |!_BV(CTRL1) |!_BV(CTRL2) | _BV(CTRL3); /back PWM_CON = _BV(ENA) | _BV(ENB) | !_BV(CTRL0) | _BV(CTRL1) | _BV(CTRL2) |!_BV(CTRL3); /forward g_dutyL = 36 + pidValue; / 改变 PWM 值g_dutyR = 36 - pidValue; /*
8、 * 函数名称: Discretized * 功能描述:对从循迹板采集的数据进行离散化处理* 参数列表:* * 返回结果:* */ int16_t Discretized(uint8_t temp) switch (temp) / 将位置信号进行离散化 case 0 x1b: g_position = 0; break; case 0 x1d: g_position = 10; / 正,左加右减,向右转break; case 0 x17: g_position = -10; /负,左加右减,右转break; case 0 x1e: g_position = 20; / 正,左减右加,极左转br
9、eak; case 0 x0f: g_position = -20; /负,左加右减,极右转break; case 0 x1c: g_position = 40 ; /正,左减右加,极左转break; case 0 x07: g_position = -40 ; /负,左加右减,极右转break; default: g_position = 0; break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - return g_position; 这上面的参数中10、20、40 以及 pConst、iConst、dConst 都是先定了个大致范围,然后根据实际效果更改而得到的。不知道大家对这个算法和其参数的设定有什么想法?名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -
限制150内