精华内容
下载资源
问答
  • 5. 编码器PID控制

    万次阅读 多人点赞 2017-12-11 13:08:33
    编码器基础对机器人实现位置和速度的控制需要使用传感器获取机器人运动的信息,编码器是常用的方式。常见的编码器有增量式编码器和绝对式编码器。绝对式编码器绝对式编码器通过对码盘上的各个位置设计特定的编码,...

    ###编码器基础
    对机器人实现位置和速度的控制需要使用传感器获取机器人运动的信息,编码器是常用的方式。常见的编码器有增量式编码器和绝对式编码器。
    ####绝对式编码器
    绝对式编码器通过对码盘上的各个位置设计特定的编码,可以输出转动轴的绝对位置信息。
    绝对式编码器码盘

    ####增量式编码器
    增量式编码器无法直接得到轴的绝对位置信息。对于轴的每一圈转动,增量式编码器提供一定数量的脉冲(通常编码器参数中用n线/n脉冲来表示)。通过测量脉冲的数量可以得到旋转的角度,或者测量单位时间内的脉冲数可以得到轴的转速。
    增量式编码器原理

    但这里涉及到方向的问题,单纯从一相的脉冲输出无法判断轴的旋转方向,所以通常增量式编码器通过输出AB两相脉冲实现方向的测量。AB两相脉冲之间相差90°。

    AB相脉冲

    例如上图中的增量式编码器脉冲,当编码器正转时,B相脉冲的上升沿对应A相高电平,而当编码器反转时,B相上升沿对应A向低电平。如此判断旋转方向。

    旋转编码器很重要的参数是其每圈输出的脉冲数,以400线的编码器为例,每转动一圈,AB相各输出400个脉冲。通过4倍频可以实现更高的测量精度。

    4倍频

    所谓4倍频就是对AB相的上升沿和下降沿均作检测,这样在一个周期内有四种状态,如下:
    正向

    旋转方向为正向时,A相上升沿对应B相低电平 -> B相上升沿对应A相高电平 -> A相下降沿对应B相高电平 -> B相下降沿对应A相低电平
    反向

    旋转方向为反向时,B相上升沿对应A相低电平 -> A相上升沿对应B相高电平 -> B相下降沿对应A相高电平 -> A相下降沿对应B相低电平

    ####测试代码
    具体代码实现可以通过Arduino中的中断判断CHANGE很容易实现4倍频。

    #define Phase_A 2   //定义A相引脚
    #define Phase_B 3   //定义B相引脚
    
    unsigned long time;
    long Position = 0;
    
    boolean A = false;
    boolean B = false;
    
    void setup()
    {
        pinMode(Phase_A, INPUT_PULLUP);//内部上拉,防止信号干扰
        pinMode(Phase_B, INPUT_PULLUP);
    
        attachInterrupt(0, Interrupt_A, CHANGE);//检测上升沿、下降沿
        attachInterrupt(1, Interrupt_B, CHANGE);//检测上升沿、下降沿
    
        Serial.begin(115200); //初始化Arduino串口
    }
    
    void loop(){
        time = millis();
        if(time%30 == 0){
            Serial.println(Position,DEC);
        }
    }
    
    void Interrupt_A(){ 
        if(A == false){
            if( B == false){Position = Position + 1;A == true;}
            else{Position = Position - 1;A == true;}
        }
        else{
            if( B == false){Position = Position - 1;A == false;}
            else{Position = Position + 1;A == false;}
        }
    }
    
    void Interrupt_B(){ 
        if(B == false){
            if( A == false){Position = Position - 1;B == true;}
            else{Position = Position + 1;A == true;}
        }
        else{
            if( A == false){Position = Position + 1;B == false;}
            else{Position = Position - 1;B == false;}
        }
    }
    

    ###PID控制
    ####PID控制的原理
      在工程实际中,PID控制是应用最为广泛控制方式。PID为比例、积分、微分的缩写。当被控制的系统的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象﹐或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量来对系统进行控制。

    比例(P)控制

    比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。
    ######积分(I)控制
      在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。
    ######微分(D)控制
      在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。 自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入“比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。

    ####实际模型
    对于3WD全向小车,在对整体运动进行解算后得到各个轮子的期望转速Vd,以这个转速作为PID控制的输入,输出为控制电机的PWM值,反馈则为通过编码器反馈值计算出的实际速度V。闭环系统如下:
    PID模型

    在实际操作中,由于是通过程序进行PID的计算,无法达到连续的积分和微分计算,所以用离散处理。给定PID控制频率,周期性地进行PID控制计算。

    主要参数:
    pid_interval 控制周期 ms
    kp 比例系数
    ki 积分系数
    kd 微分系数
    ko 统一放大缩小比例

    ####具体实现
    见下pibot firmware代码分析

    展开全文
  • stm32,AB编码器pid调节
  • AB相编码器程序,这是AB相编码器程序,AB相编码器程序AB相编码器程序
  • 基于TI drivers库函数,实现编码器电机定速、定角控制示例
  • 11开发目标1:TIM1的4个通道生成PWM,CH1—PWM1 CH2—PWM2 CH3—PWM3 CH4—PWM4 TIM8的...读取编码器的旋转产生的脉冲数开发目标4:用2.3寸TFT液晶显示屏显示电机或码盘的速度(单位时间间隔的脉冲增量)和码盘脉冲总数
  • 基于pid控制编码器在直流电机控制转速和转角,。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • 编码器PID控制

    千次阅读 2018-12-27 16:03:48
    https://blog.csdn.net/baimei4833953/article/details/78771634
    展开全文
  • 控制直流电机准确直走,利用PID增量算法,只用p i参数
  • pid_STM32编码器_PID控制_stm32TIM4_PID寻迹小车_STM32码盘_源码.zip
  • 本人目前是一个大一菜鸟,零基础学的编码器方面,希望我的经验对你有些帮助。 分享一下霍尔编码器电机的使用与测速,我用的是25GA-310直流减速电机。先来看一下最基本的 接线方法——- ——S1与S2连接单片机上的S...
  • pid_STM32编码器_PID控制_stm32TIM4_PID寻迹小车_STM32码盘_源码.rar.rar
  • AB编码器增量PID控制,数字pid位置型控制算法和增量型,CC++源码.zip
  • 可以用来学习PID,编码器。 压缩包里有详细的文档,介绍编码器的、PID的、平衡小车等。是一份很不错的资料 软件篇: 系统采用外设有:TIM1 TIM2 TIM3 TIM4 ADC 滴答定时器 TIM1用于pwm的产生,两路pwm作用于1...
  • 多功能助手,可支持串口,虚拟示波,CCD调节,GPS定位调节等,均能可视化处理。实用于嵌入式开发的调节,获取数据准确,能够很好的提供辅助功能。
  • 霍尔编码器原理及测速--PID—arduino

    万次阅读 多人点赞 2020-03-04 17:13:28
    本人目前是一个大一菜鸟,零基础学的编码器方面,希望我的经验对你有些帮助。 分享一下霍尔编码器电机的使用与测速,我用的是25GA-310直流减速电机带霍尔传感器。先来看一下最基本的 接线方法------- ------S1与S2...

    标题

    本人目前是一个大一菜鸟,最近在学编码器方面的知识,希望我的经验对你有些帮助。
    分享一下霍尔编码器电机的使用与测速,我用的是25GA-310直流减速电机。先来看一下最基本的
    接线方法-------
    在这里插入图片描述

    测速原理

    ##测速原理
    这里需要用到一些基本函数,大家可以去相关网站去找一下,重要的是定时器函数和中断函数
    我用的这个电机脉冲数双相300个,单相150个。(电机的型号不同可能会不一样,如果店家那没有的话可以抠出来下面一部分程序测)
    具体思路:首先使用定时器定时一个时间,我这里用的是50ms。编码器转一圈会发送脉冲,一个脉冲可以产生一个中断,在中断函数里令一个变量自加,每产生一个脉冲该变量就加1。所以该变量就是脉冲数。
    通过50ms内产生得脉冲数就可以算出速度了(这里是角速度,如果要具体算速度的话乘以轮子半径即可)。用脉冲数/150( 这里用单相或者双相都一样,我用的单相得)即可得到在这50ms内电机转动得圈数。再乘以20就是一秒内转的圈数,再乘以60就是一分钟转的圈数 。 下面是代码
    打开串口绘图器即可观察数据(打印函数一定要用 Serial.println()才可以显示哦)

    #include <TimerOne.h>
    float v;
    volatile long counter_val0=0;
    volatile long counter_val1=0;      //该变量用于存储编码器的值,所以用类型修饰符volatile;
    int j=0;                           //定时器标志;
    
    void setup()
    {
      delay(2000);
      pinMode(2, INPUT);
      pinMode(3, INPUT);                    //设置为输入模式,并且2,3号引脚是中断口0,1;
    
      Serial.begin(115200);                //初始化波特率为115200
      attachInterrupt(0, counter0, RISING);//设置编码器A相位上升沿中断
      attachInterrupt(1, counter1, RISING);//设置编码器B相位上升沿中断
      Timer1.initialize(50000);            // 设置定时器中断时间,单位微秒 ,这里是50毫秒
      Timer1.attachInterrupt( timerIsr ); // 打开定时器中断
      interrupts();                      //打开外部中断
    }
    void loop()
    {
      long lTemp = 0; //定义临时存储数据变量
      if(j==1)        //判断是否发生定时器中断,这里是50ms发生一次
       {
           j=0;       //清除标记
       }     
    }
    //外部中断处理函数
    void counter0()
    {
         counter_val0++;    //每一个中断加一
    }
    void counter1()
    {
         counter_val1++;    //每一个中断加一
    }
    //定时器中断处理函数
    void timerIsr()
    {
       j=1;                           //定时时间达到标志     
       v=60*20*counter_val0/150.0;    //这里的单位是转每分钟:r/min
       Serial.println(v);    
       counter_val0=0;
       counter_val1=0;               //清空该时间段内的脉冲数
       return v;                
    }
    

    PID

    如果有对PID算法感兴趣的我们可以讨论下,根据编码器测速写了一个控制电机速度的算法,但是参数我还没调出来。下面是源代码。如果有错误希望大佬们给我提醒一下

    #include <TimerOne.h>
    #define set_point 100
     float v;
    long counter_val0=0;
    long counter_val1=0;
    int j=0;
    
    void setup()
    {
      delay(2000);
      pinMode(2, INPUT);
      pinMode(3, INPUT);
      pinMode(8,OUTPUT);
      pinMode(9,OUTPUT);       //启用电机A的三个管脚,全部设置为输出状态
      digitalWrite(9, LOW);       //松开电机A的制动
      digitalWrite(8, HIGH);      //设置方向为正向旋转
      Serial.begin(115200);//初始化波特率为115200
      attachInterrupt(0, counter0, RISING);//设置编码器A相位上升沿中断
      attachInterrupt(1, counter1, RISING);//设置编码器B相位上升沿中断
      Timer1.initialize(50000); // 设置定时器中断时间,单位微秒
      Timer1.attachInterrupt( timerIsr ); // 打开定时器中断
      interrupts();  //打开外部中断
    }
    void loop()
    {
      long lTemp = 0; //定义临时存储数据变量
      if(j==1)   //判断是否发生定时器中断,即定时时间是否到达
       {
           j=0; }
          int v1=(int)v;
           analogWrite(9,PIDControl_L(50,v1));
           analogWrite(8,0);
           
         
    }
    //外部中断处理函数
    void counter0()
    {
         counter_val0++;    //每一个中断加一
    }
    void counter1()
    {
         counter_val1++;    //每一个中断加一
    }
    //定时器中断处理函数
    void timerIsr()
    {
       j=1;     //定时时间达到标志     
       v=1200*counter_val0/150.0;
    
             Serial.println(v);  
       
       counter_val0=0;
       counter_val1=0;
       return v;
    }
    
    
    float PIDControl_L(int SpeedSet,int speed)        //pid
    {
        float Kp=50,Ki=9,kd=0.1;
        float cap;  
       int e=0,e1=0,e2=0;       
       static float PwmControl;
        static  float  pwm;
        e2=e1; 
        e1 = e; 
        e=SpeedSet-speed;
        PwmControl+=Kp *(e-e1)+ Ki*e+kd*(e-2e1+e2); 
        pwm=map(PwmControl,0, 60, 0, 255);
             
      
        cap = pwm;             
     
        return pwm;
    }
    

    `

    展开全文
  • STM32F401 编码器电机实现位置PID控制

    千次阅读 2020-05-15 08:42:47
    PID算法是控制中使用的最多并且最简单的一种控制算法,算法的核心就是不断计算当前值和...入口参数:编码器测量位置信息,目标位置 返回 值:电机PWM 根据位置式离散PID公式 pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1

    PID算法是控制中使用的最多并且最简单的一种控制算法,算法的核心就是不断计算当前值和目标值的误差,并根据误差来改变输入,最终达到目标值
    废话不多说,一看代码就明白了:

    /**************************************************************************
    函数功能:位置式PID控制器
    入口参数:编码器测量位置信息,目标位置
    返回  值:电机PWM
    根据位置式离散PID公式 
    pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
    e(k)代表本次偏差 
    e(k-1)代表上一次的偏差  
    ∑e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2,k;
    pwm代表输出
    **************************************************************************/
    int Position_PID (int Target,int Encoder)
    { 	
    	 double Position_KP=0.06,Position_KI=0.0,Position_KD=0.01;
    	 static float Bias,Pwm,Integral_bias,Last_Bias;
    	 Bias=Encoder-Target;                                  //计算偏差
    	 Integral_bias+=Bias;	                                 //求出偏差的积分
    	 Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias);       //位置式PID控制器
    	 Last_Bias=Bias;                                       //保存上一次偏差 
    	 return Pwm;                                           //增量输出
    }
    

    上面是核心代码,当然KP、KI、KD这三个参数是很难调的,需要根据误差适当计算后再慢慢调试。
    关于 P、I、D 三个参数的主要作用,可以大致又不完全地概况为:P 用于提高响应速度、I 用于减小静差、D 用于抑制震荡。
    当然,这个误差的获得也很重要,因为采样间隔的不同将带来不同的控制延迟,当然也不是采样间隔越短越好,太短的话,编码器的数值不准确,一般情况下10ms一次的采样间隔比较合适,100ms就太长了,会导致控制最终的误差难以消除。

    实验器材
    测试平台:STM32F401CCU6
    定时器:TIM2(用于采样、定时观测编码器读数)、TIM3(电机的PWM输出口)、TIM4(编码器)
    控 制:位置 PID 算法
    OLED:中景园1.3寸7针OLED
    电机驱动:TB6612电机驱动模块

    完整工程链接

    展开全文
  • STM32cubeMX--增量式PID调节电机速度(霍尔编码器

    千次阅读 多人点赞 2021-05-08 10:32:22
    目录前言一、直流减速电机与霍尔编码器1.1、编码器介绍与选择1.2、编码器参数1.3、编码器测速原理1.3.1、方向判断1.3.2、速度获取二、STM32cubeMX库配置编码器模式2.1、连线分析2.2、cubeMX设置2.2.1、cubeMX初始化...
  • 我自己写了一个PID算法的小py文件,可以在主函数中直接进行调用,采用PID算法可以让机器人的行驶速度达到设定的速度,同时,可以将pid应用在两轮之间,实现两轮速度差的消除,使机器人能够真正实现闭环走直线。...
  • AB相编码器程序,这是AB相编码器程序,AB相编码器程序AB相编码器程序
  • FX2NPLC+2AD+4ADTC+2DA+电阻尺+编码器+PID温控 程序 三菱 PLC程序。有注释
  • 基于STM32直流电机PID调速(双相编码器

    千次阅读 多人点赞 2020-07-31 19:31:18
    1.什么是PID? 2.为什么要用PID来对电机进行控制? 3.PWM输出配置 4.怎么配置TIM定时器为编码模式 5.该怎么吧TIM的CNT中的值读出来呢 移植例程踩过的坑
  • http://fromwiz.com/share/s/3frIwo0GLA-52Qb3us0qQBKD3Mekd73ipQCN2ToL19056WA- 这里面有详细解释
  • PID速度闭环的框架已经搭建完成,下载者可直接在keil5里打开调节P I D三个参数就好,里面有与电脑上位机通信的功能,可在电脑上可视化调节参数,通过观察图像处理参数,更为简便。
  • :包含所有 PCB 的设计,包括车轮编码器、红外传感器和最后一块板,其中包含电机驱动器、蓝牙板的接头和 Arduino mini pro 的接头。 :包含负责与机器人通信并打印电路的 Android 应用程序。 :包含 Arduino 草图
  • STM32定时器编码器模式编程享
  • STM32电机测速(正交或者霍尔编码器

    万次阅读 多人点赞 2020-08-19 22:41:41
    2.2 STM32电机测速(正交或者霍尔编码器) 我们这里提供左右电机测速代码,在公众号:小白学移动机器人,发送:电机测速,即可获得源码工程下载链接。 2.2.1 实现工具 STM32单片机、带编码器的直流减速电机、Keil5、...
  • STM32编码器模式的测试例程,代码中采用TIM2定时器的编码器模式,在主程序中利用延时函数监测单位时间内的脉冲数,并根据脉冲数计算速度。程序中不包含电机输出控制和PID调速。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,350
精华内容 12,940
关键字:

编码器pid