找回密码
 注册
查看: 380|回复: 1
打印 上一主题 下一主题

一个简单的电机与驱动PID算法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-7 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
一个简单的电机与驱动PID算法
) z+ M( Z: }+ _( G
) `6 p9 P+ F2 c. b; y9 zPID
8 `; F6 l  Z! ?- \6 o
8 E/ i8 }  w% E
  • #include <hidef.h>      /* common defines and macros */
  • #include "derivative.h"      /* derivative-specific definitions */
  • #include <mc9s12xs128.h>
  • //定义PID参数
  • #define VV_KPVALUE 3       //比例
  • #define VV_KIVALUE 40     //积分
  • #define VV_KDVALUE 3     //微分
  • #define VV_MAX 10000       //返回的最大值,是pwm的周期值
  • #define VV_MIN 0
  • #define VV_DEADLINE 0X08   //速度PID,设置死区范围
  • typedef struct PID       //定义数法核心数据
  • {
  • signed int vi_Ref;      //速度PID,速度设定值
  • signed int vi_FeedBack;  //速度PID,速度反馈值
  • signed long vi_PreError;  //速度PID,前一次,速度误差,,vi_Ref - vi_FeedBack
  • signed long vi_PreDerror; //速度PID,前一次,速度误差之差,d_error-PreDerror;
  • unsigned int v_Kp;      //速度PID,Ka = Kp
  • unsigned int v_Ki;      //速度PID,Kb = Kp * ( T / Ti )
  • unsigned int v_Kd;      //速度PID,
  • signed long vl_PreU;    //电机控制输出值
  • }PID;
  • PID  sPID;                //  PID Control Structure
  • void PIDInit(void)
  • {
  • sPID.vi_Ref = 0 ;        //速度设定值
  • sPID.vi_FeedBack = 0 ;  //速度反馈值
  • sPID.vi_PreError = 0 ;   //前一次,速度误差,,vi_Ref - vi_FeedBack
  • sPID.vi_PreDerror = 0 ;   //前一次,速度误差之差,d_error-PreDerror;
  • sPID.v_Kp = VV_KPVALUE;
  • sPID.v_Ki = VV_KIVALUE;
  • sPID.v_Kd = VV_KDVALUE;
  • sPID.vl_PreU = 0 ;      //电机控制输出值
  • }
  • unsigned int v_PIDCalc( PID *pp )
  • {
  • signed long  error,d_error,dd_error;
  •   error = (signed long)(pp->vi_Ref - pp->vi_FeedBack); // 偏差计算
  •   d_error = error - pp->vi_PreError;
  •   dd_error = d_error - pp->vi_PreDerror;
  •   pp->vi_PreError = error; //存储当前偏差
  • pp->vi_PreDerror = d_error;
  • if( ( error < VV_DEADLINE ) && ( error > -VV_DEADLINE ) ); //设置调节死区
  •               //速度PID计算
  •   pp->vl_PreU += (signed long)(  pp -> v_Kp * d_error + pp -> v_Ki * error  + pp->v_Kd*dd_error);
  • else if( pp->vl_PreU >= VV_MAX )   //速度PID,防止调节最高溢出
  •   pp->vl_PreU = VV_MAX;
  • else if( pp->vl_PreU <= VV_MIN ) //速度PID,防止调节最低溢出
  •   pp->vl_PreU = VV_MIN;
  • else
  • ;
  •    return ( pp->vl_PreU  );  // 返回预调节占空比
  • }
  • void main(void) {
  •   /* put your own code here */
  •    Initmcu();
  •     IncPIDInit();
  • int g_CurrentVelocity=0;   //全局变量也初始化
  • int g_Flag=0;                //全局变量也初始化
  • EnableInterrupts;
  •   While(1)
  • {
  •    if (g_Flag&&vi_FeedBack)
  •       {
  •           PWMOUT+=  v_PIDCalc( PID *pp );
  •             g_Flag&=~ vi_FeedBack;
  • }
  • }
  • }
  •   for(;;) {
  •     _FEED_COP(); /* feeds the dog */
  •   } /* loop forever */
  •   /* please make sure that you never leave main */
  • }6 T$ }) F6 {% h( d; m" n4 H' Y
! w7 g: `. r0 g' S4 Q# {2 y- S

5 O( n/ E) _% ?6 i) f6 s8 S5 f. e% Q5 p) i. ^
0 Y, ~% p. M2 r3 Z
- m6 Y8 J) L, n7 C+ B3 }

该用户从未签到

2#
发表于 2020-1-7 18:11 | 只看该作者
这个好,不知道能不能调通
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-5-30 08:17 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表