电机编码器学习与pid

您所在的位置:网站首页 如何提升敲代码的速度和速度值 电机编码器学习与pid

电机编码器学习与pid

2024-07-03 22:17| 来源: 网络整理| 查看: 265

在学习基本操控电机之后,我们需要更加精准的确定电机转速等物理量来完成任务时,编码器测速就变的很重要,网上很多讲解编码器相关内容,后文会放上找的优秀文章作为借鉴。

编码器测速实现方案有两种

第一种测速方案是计算一定脉冲下所用时间来得出电机速度。

第二种测速方案是是一定时间下所产生的脉冲数量来计算速度值。适合高速(也叫M法测速)一般选择第二种。

例如在1s时间下,测得脉冲数为60个,而编码器单圈脉冲数是20个,则转速n=60/20=3 r/s。

编码器参数 1.分辨率

指编码器能够分辨的最小单位。

对于增量式编码器,其分辨率表示为编码器转轴旋转一圈所产生的脉冲数,即脉冲数/转(PPR)

2.最大响应频率 指编码器每秒输出的脉冲数(PPS),单位是Hz。计算公式为:

最大响应频率= 分辨率* 轴转速/60。

例如某电机的编码器的分辨率为100(即光电码盘一圈有100条栅格),轴转速为120转每分钟(即每秒转2圈),则响应频率为100*120/60=200Hz,即该转速下,编码器每秒输出200个脉冲(电机带动编码器转了2圈)。

下面是编码器倍频:

图上写的很清楚,一般使用的是同时用AB相上升下降捕获也就是4倍频: 对应配置编码器接口的代码:TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

重头戏是如何将这个编码器的“速度”转化为物理意义上的转速:

电机转一圈总的脉冲数(定时器能读到的脉冲数) = 编码器物理脉冲数*编码器倍频*电机减速比

  通过两张MG513淘宝上给的参数信息,这里我用的1:60减速比,霍尔编码器所以电机轴转一圈产生13个脉冲信号输出,所以减速电机的输出轴旋转一圈,实际可以产生的脉冲为13*60=780个。在通过STM32F4 编码器接口的4倍频就是3120个脉冲也即是轮子转一圈会有3120个脉冲。(4倍频就是一个脉冲可以被检测到4次,增大脉冲的检测精度)

 最后可以随机选一个定时器在写中断函数里设置好psc和arr,推荐100ms也就是计数器溢出频率为10HZ。

/* 每0.1秒进入一次中断,读取编码器采集的数量,计算速度 AB相磁编码器,每转一圈,各产生、780个脉冲频率 我们采用AB相上升沿和下降沿都采集,所以旋转一周共采集3210次 */ void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET) { Speed = (Encoder_Get()/(13*60*4)*60); //AB相,旋转一圈各产生13*60*4个PWM波,AB相上升沿和下降沿都计数,即4倍频 TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } }

捕获脉冲: 代码里使用一个定时器TIM3的编码器模式接收电机编码器的脉冲,另 一个定时器TIM4负责在一定时间的读取编码器脉冲的值。这里用读取到的CNT的值即“速度”:

Speed = (Encoder_Get()/(13*60*4)*60)*(1/0.1);

0.1就是编码器计数周期100ms,0.1s,这也就时间系数,不能漏掉。

就得到的就是具有物理意义的转速n(单位rpm,r/min),并且我这里取100ms刷新读取速度值一次。

当然了也可以10ms捕获的脉冲数,oled上刷新频率更快了。

注:输出比较和输入捕获不能是一个。

void Encoder_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //编码器引脚PA6、PA7 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1; //ARR TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //PSC TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICFilter = 0xF; TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInitStructure.TIM_ICFilter = 0xF; TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Falling); //极性更改 TIM_Cmd(TIM3, ENABLE); } int16_t Encoder_Get(void) //提取CNT计数,编码器计数,测算速度用。 { int16_t Temp; Temp = TIM_GetCounter(TIM3); TIM_SetCounter(TIM3, 0); return Temp; }

同理,下面这款电机是 CHP-36GP-555s大扭矩编码器电机,减速比1:100,扭矩5kg×cm=5Nm。

 基础脉冲数是17PPR,这里商品很好,已经帮我们算好是1700=17×减速比100。同理也采用4倍频,所以轮子转一圈会有C=6800个脉冲,这时用编码器测速CNT=C即转一圈,然后轮子直径为0.18m,周长为2πr=0.5652m,这样如果开环走输出轴转一圈就能走这么远。由此,我们可以先算出单位时间内,一个脉冲轮子走过的距离为:

l = 2 ∗ P I ∗ R / ( 4 ∗ n ∗ i ) l =2*PI*R/(4*n*i)

接着乘以编码器测量的脉冲个数m就知道轮子在这个计数周期内走过的路程s了。

PID算法篇

网上的pid教程很多,主要说一下如何调参。

pid算法我最开始了解到的源于自动控制原理里的串联校正,利用相位超前的校正,可增加频宽提高系统的快速性,并使稳定裕度加大,改善系统的振荡情况,和PID的D(微分环节作用很像,不知道是不是它的作用),而滞后校正可解决提高稳态精度与振荡的矛盾,是频带变窄。和积分环节的I作用很像,而开环增益K就是比例环节的P了,如果没有偏差,则比例环节就不起作用了。

PID算法可分为位置式PID与增量式PID两大类。

在实际的编程应用中,需要使用离散化的PID算法,以适用计算机的使用环境。

如何理解他们之间的关系是网上少有的:

例如: 1.位置式是靠积分去累积,但是这也是位置式的缺点。增量式只取最近三个误差。 2.这个目标值可以是pwm占空比也可以是编码器测速后的经过上述操作得到的转速。 3.pid可以单环控制也可以双环控制。

双环:速度、电流、位置两两组合。单环容易出现超调和振荡或者说这种情况很难调节,考虑双环可跟容易调节PID参数达到稳定。双环控制分内环和外环,外环控制的是优先考虑对象,内环用于对控制效果进行优化。

一般是速度+位置双环

位置是外环,速度是内环。

怎么理解位置环和速度环呢?

就拿工训物流搬运车来说,双环控制可以使得小车以固定速度到达指定位置。

增量式:误差作为增量输出,也就是△,当系统达到稳态时,pwm还有。

位置式:误差直接作为输出,当稳态时,pwm为0。

可以说是内环是外环的导数,外环是内环的积分。外环的输出最为内环的目标值。所以一般要进行限幅,比如pwm占空比最大是100,限制其99就不再增大。

首先采集到位置数据,计算出位置偏差输入到位置环,经过位置环PID计算输出值再与速度数据求偏差输入到速度环PID计算。

最后附上温馨提示:购买电机时,一定要保证扭矩,电压,电流和额定转速等物理参数在自己所需求的最大范围之内。

后续pid代码部分会在C语言结构体指针部分做讲解,包括调整pid三个值和VOFA+上位机调参,驱动闭环编码器电机和步进电机等。

编码器计数原理与电机测速原理——多图解析_编码器最大脉冲数是多少-CSDN博客

【电机应用控制】——直流有刷电机&驱动板/编码器介绍&PID算法&实操代码思路_方波 双环 控制-CSDN博客

单片机电机控制与PID实践 - 知乎 (zhihu.com)

速度环+位置环串级pid[附源码]_哔哩哔哩_bilibili

通俗易懂的 PID 控制算法讲解_哔哩哔哩_bilibili



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3