OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3022|回复: 2

四轴PID

[复制链接]

5

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-12-9
在线时间
85 小时
发表于 2016-2-25 14:45:45 | 显示全部楼层 |阅读模式
1金钱
有大神做过小四轴吗,PID程序这么写,无从下手,十分感谢。

最佳答案

查看完整内容[请看2#楼]

程序算法比较简单,关建你的参数要设置正确,这个要根据你的工程来决定,如下程序是PID的基本算法C函数 typedef struct { s32 SumError; s32 LastError; //error[-1] s32 PrevError; //error[-2] s32 SetPoint; //目标值 s32 P; //比例常数 s32 I; //积分常数 s32 D; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-2-25 14:45:46 | 显示全部楼层
本帖最后由 likunxue 于 2016-2-26 02:31 编辑

程序算法比较简单,关建你的参数要设置正确,这个要根据你的工程来决定,如下程序是PID的基本算法C函数

typedef struct
{
s32 SumError;       
s32 LastError;                     //error[-1]
s32 PrevError;                            //error[-2]       
s32 SetPoint;                      //目标值
s32 P;                             //比例常数
s32 I;                             //积分常数
s32 D;                             //微分常数       
}WeiZhiSiFu_PID;



/********************************************************************************************
函数名: PID核心计算(增量式)
调  用: PID_Init(void)
参  数: 无(增量)         
********************************************************************************************/
int IncPIDCalc(WeiZhiSiFu_PID *P,int NextPoint)
    {                
    int error, iIncpid;
    error = P->SetPoint - NextPoint;          //当前误差         
    iIncpid = P->P * error                    //计算比例
            - P->I * P->LastError             //计算微分
            + P->D * P->PrevError;            //计算枳分   
    P->PrevError = P->LastError;              //保存前一次的误差
    P->LastError = error;                     //保存当前误差                  
    return iIncpid;
    }
/********************************************************************************************
函数名: PID核心计算(位置式)
调  用: PID_Init(void)
参  数: 无(增量)     
********************************************************************************************/
int LocPIDCalc(WeiZhiSiFu_PID *P,int NextPoint)
    {
    int error,d_error;
    error = P->SetPoint - NextPoint;          //当前误差
    P->SumError += error;                     //积分
    d_error = error - P->LastError;           //微分
    P->LastError = error;                     //保存当前偏差
    return(P->P *error                        //比例项
           + P->I * P->SumError               //积分项
           + P->D * d_error);                 //微分项
    }

回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2016-2-25 14:50:56 | 显示全部楼层
只用P就可以解决了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 01:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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