找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1144|回复: 0
打印 上一主题 下一主题
收起左侧

(分享设计)一个PID算法,有需要的可以套用

[复制链接]
跳转到指定楼层
楼主
ID:440846 发表于 2018-12-6 13:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "System_init.h"
extern int U_Set;
extern u16 CCR1_Val;

/*==========================================================================================*/
typedef struct PID {
    float SetPoint; // 设定目标Desired value
    float Proportion; // 比例常数Proportional Const
    float Integral; // 积分常数Integral Const
    float Derivative; // 微分常数Derivative Const
    float LastError; // Error[-1]   
    float PrevError; // Error[-2]
    float SumError; // Sums of Errors
} PID;
/*====================================================================================================/
PID计算部分
=====================================================================================================*/
PID   vPID={0,0.1,0.001,0.001,0,0,0};

float PIDCalc( PID *pp, float NextPoint )
{
    float dError,
    Error;
    Error = pp->SetPoint - NextPoint; // 偏差
    pp->SumError += Error; // 积分
    dError = pp->LastError - pp->PrevError; // 当前微分
    pp->PrevError = pp->LastError;
    pp->LastError = Error;

    if(pp->SumError>900)  pp->SumError=900;
    else if(pp->SumError<-900)      pp->SumError=-900;

    return (pp->Proportion * Error // 比例项
    + pp->Integral * pp->SumError // 积分项
    + pp->Derivative * dError // 微分项
    );
}

float Vol(int vSet,int v3){

    float vOut; // PID Response (Output)
    float vIn; // PID Feedback (Input)

    vPID.SetPoint = vSet; // Set PID Setpoint
    vIn = (float)v3; // Read Input
    vOut = PIDCalc ( &vPID,vIn ); // Perform PID Interation     
    return vOut;
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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