找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3876|回复: 0
收起左侧

直流电机速度控制(PID)闭环

[复制链接]
ID:109480 发表于 2016-3-18 11:44 | 显示全部楼层 |阅读模式
#include "control.h"        
  /**************************************************************************
作者:平衡小车之家
我的淘宝小店:shop114407458。taobao。com
**************************************************************************/
int Target_velocity=50;  //设定速度控制的目标速度为50个脉冲每10ms
int TIM1_UP_IRQHandler(void)  
{   
        if(TIM1->SR&0X0001)//5ms定时中断
        {   
                  TIM1->SR&=~(1<<0);                                       //===清除定时器1中断标志位                 
                  Encoder=Read_Encoder(2);                                  //===读取编码器的值,M法测速,输出为每10ms的脉冲数
                  Led_Flash(100);                                          //===LED闪烁;指示单片机正常运行        
                   Xianfu_Pwm();                                            //===PWM限幅
                  Moto1=Incremental_PI(Encoder,Target_velocity);           //===速度PI控制器
            Set_Pwm(Moto1);                                          //===赋值给PWM寄存器  
        }               
         return 0;         
}

/**************************************************************************
函数功能:赋值给PWM寄存器
入口参数:PWM
返回  值:无
**************************************************************************/
void Set_Pwm(int moto1)
{
                        if(moto1<0)                        AIN2=1,                        AIN1=0;
                        else                   AIN2=0,                        AIN1=1;
                        PWMA=myabs(moto1);
}

/**************************************************************************
函数功能:限制PWM赋值
入口参数:无
返回  值:无
**************************************************************************/
void Xianfu_Pwm(void)
{        
          int Amplitude=7100;    //===PWM满幅是7200 限制在7100
    if(Moto1<-Amplitude) Moto1=-Amplitude;        
                if(Moto1>Amplitude)  Moto1=Amplitude;        
}

/**************************************************************************
函数功能:绝对值函数
入口参数:int
返回  值:unsigned int
**************************************************************************/
int myabs(int a)
{                    
          int temp;
                if(a<0)  temp=-a;  
          else temp=a;
          return temp;
}
/**************************************************************************
函数功能:增量PI控制器
入口参数:编码器测量值,目标速度
返回  值:电机PWM
根据增量式离散]]PID公式
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差  以此类推
pwm代表增量输出
在我们的速度控制闭环系统里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target)
{         
   float Kp=100,Ki=100;        
         static int Bias,Pwm,Last_bias;
         Bias=Encoder-Target;                //计算偏差
         Pwm+=Kp*(Bias-Last_bias)+Ki*Bias;   //增量式PI控制器
         Last_bias=Bias;                           //保存上一次偏差
         return Pwm;                         //增量输出
}


评分

参与人数 1黑币 +60 收起 理由
admin + 60 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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