OpenEdv-开源电子网

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

PID定速闭环电机速度过快会跑飞

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2022-11-5
在线时间
8 小时
发表于 2023-4-25 17:58:57 | 显示全部楼层 |阅读模式
17金钱
我使用定时器读取编码器的值,然后另一个定时器5ms的中断,加上PID,实现定速。问题是只会追加速,就是电机从静止可以跑到我给的期望值,但是如果我给电机一个力,使他当前的速度大于期望,他就会直接跑到全速,不会从高速状态下往期望值修正。求大佬 帮助




附左轮PID和获取编码器以及主函数


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2022-11-5
在线时间
8 小时
 楼主| 发表于 2023-4-25 18:01:37 | 显示全部楼层
int Left_pid(int shuduA,int qiwangA,float kp1,float ki1,float kd1)
{
        static int error1=0,old_error1=0,Integral1=0;
        static int value1=0;
       
        error1=qiwangA-shuduA;

        Integral1+=error1;
        if(error1==0)      Integral1 =0;
        if(Integral1>1000) Integral1=1000;        //积分限幅
        if(Integral1<-1000)Integral1=-1000;        //积分限幅
       
        value1 = (kp1*(error1)+ki1*Integral1+kd1*old_error1);
        old_error1=error1;        
               
        if(value1>999) value1=999;if(value1<-999)value1=-999;
       
        return value1;
}
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2022-11-5
在线时间
8 小时
 楼主| 发表于 2023-4-25 18:02:15 | 显示全部楼层
void Get_Motor_Speed(int *leftSpeed,int *rightSpeed)
{
        static int leftWheelEncoderNow    = 0;
        static int rightWheelEncoderNow   = 0;
        static int leftWheelEncoderLast   = 0;
        static int rightWheelEncoderLast  = 0;       
       
        //记录本次左右编码器数据
                leftWheelEncoderNow += getTIMx_DetaCnt(TIM4);
          rightWheelEncoderNow += getTIMx_DetaCnt(TIM3);
               
        //5ms测速           
                *leftSpeed   = (leftWheelEncoderNow - leftWheelEncoderLast);
          *rightSpeed  = (rightWheelEncoderNow - rightWheelEncoderLast);

        //记录上次编码器数据
          leftWheelEncoderLast  = leftWheelEncoderNow;                    
          rightWheelEncoderLast = rightWheelEncoderNow;                  
}
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2022-11-5
在线时间
8 小时
 楼主| 发表于 2023-4-25 18:03:19 | 显示全部楼层
                 PWM_Num3 = Left_pid(leftSpeedNow,10,80,0,5);
                 if(PWM_Num3 <=0)   {GPIO_ResetBits(GPIOB,GPIO_Pin_14);  GPIO_SetBits(GPIOB,GPIO_Pin_15);}
                 if(PWM_Num3 >0)   {GPIO_SetBits(GPIOB,GPIO_Pin_14);GPIO_ResetBits(GPIOB,GPIO_Pin_15);}
                 TIM_SetCompare1(TIM1,abs(PWM_Num3));
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 09:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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