STM32自学笔记16-步进电机驱动项目-磁编码器的校准

news/2024/11/28 22:39:17/

上节我把MT6816的驱动给大致整明白了,接下去需要看看如何校准

  1. 为什么编码器需要校准?
    如上节所说,MT6816是一款绝对值编码器,它为每个测量位置分配了唯一的二进制代码或字,即使断电,也可以跟踪编码器的确切位置

但是由于硬件或其他因素的影响,编码器输出的位置可能存在一定的误差。因此,需要进行校准来确保编码器输出的位置与实际步进电机的位置一致。具体而言,校准的目的是通过对编码器输出数据的处理和比较,确定真正的步进电机位置并建立编码器输出值与实际位置之间的对应关系

  1. 磁编码器的校准方法

校准通常包括检查平均值的连续性和方向,以及对编码器编码器输出数据与步进电机实际相位角非线性关系的拟合。
具体的方法可以是:

  • 检查平均值之间的差值,检查是否过小或过大,如果过小,则表示编码器输出的数据存在重复或重叠;如果过大,表示某些数据点存在异常或丢失。
  • 方向检查:可以通过计算相邻两个采样数据的差值检查,差值为正值代表正转,负值则为反转,如果为0,则方向错误
  • 步进电机旋转角度和编码器输出数据之间的关系通常是非线性的。在校准过程中,可以通过采集一系列已知角度位置的数据点,并拟合出角度与编码器数据之间的关系。这个拟合可以使用曲线拟合算法或其他数学方法来实现。通过拟合,可以建立编码器输出数据与实际相位角之间的非线性转换公式,从而实现更准确的角度测量。

一个个地来看代码实现,先是检查平均值之间的差值。步进电机的旋转是360°一圈,磁编码器的取值也是从小到大一圈的值,所以两个点取值有可能出现的情况是:第一个点是最大值,转了一个小角度后这个值会出现跳变到最小值附近,但两个点的平均值绝对不是真实的平均值,需要进行调整。具体的获取平均值的参考代码如下:

int32_t CycleAverage(int32_t a, int32_t b, int32_t cyc)  //cyc即是一个周期值,在磁编码器的应用中为2^14
{int32_t sub_data;int32_t ave_data;sub_data = a - b;ave_data = (a + b) / 2;if(abs(sub_data) > (cyc / 2))   //如果两个点差的绝对值大于周期的一半,则认为发生了跳变,进行相应的调整{if(ave_data >= (cyc / 2 ))	ave_data -= (cyc / 2);else	ave_data += (cyc / 2);}return ave_data;
}

如果要求两个点的差,同样也要考虑是否会发生跳变,求循环差。循环差的概念在这里举个例子,以时间为例,从晚上20点到凌晨2点,一共过去了几个小时?一定不是20-2=18小时,而是6个小时,可以用下面的代码来取循环差:

int32_t CycleSub(int32_t a, int32_t b, int32_t cyc)
{int32_t sub_data;sub_data = a - b;if(sub_data > (cyc >> 1))		sub_data -= cyc;if(sub_data < (-cyc >> 1))	sub_data += cyc;return sub_data;
}

再来考虑步进电机走的步数问题,一般步进电机一圈的步数是200,即每一步走1.8°,所以也要保证算出来的步数在循环周期(即200)之内,可以简单的用取余运算来实现这个功能:

uint32_t CycleRem(uint32_t a,uint32_t b)
{return (a+b)%b;
}

有了这些方法后,先进行旋转的方向性确认,

for(count=0; count<201; count++)   //每一步的采集数据的平均值,存在coder_data_f[count]数组里,从coder_data_f[0]到[200],是一个旋转周期
{encode_cali.coder_data_f[count] = (uint16_t)CycleAverage((int32_t)encode_cali.coder_data_f[count], (int32_t)encode_cali.coder_data_r[count], 2^14);
}
sub_data = CycleSub((int32_t)encode_cali.coder_data_f[0], (int32_t)encode_cali.coder_data_f[199], 2^14);  //用最大的角度值和最小的角度值相减,求循环差if(sub_data == 0)	{	encode_cali.error_code = CALI_Error_Average_Dir; return;	}  //如果差为0,校正错误if(sub_data > 0)	{	encode_cali.dir = true;	}   //代表正转if(sub_data < 0)	{	encode_cali.dir = false;	}  //代表反转

再次对电机每一步的编码器数据进行检查:

for(count=1; count<200; count++)
{sub_data = CycleSub((int32_t)encode_cali.coder_data_f[count], (int32_t)encode_cali.coder_data_f[count-1], 2^14);  //每一步和上一步的数据差,如果是正转,则差值大于0,如果是反转,则差值应小于0if(abs(sub_data) > (CALI_Gather_Encode_Res * 3 / 2))	{	encode_cali.error_code = CALI_Error_Average_Continuity;	encode_cali.error_data = count;return;	}	//两次数据差过大,则报错if(abs(sub_data) < (CALI_Gather_Encode_Res * 1 / 2))	{	encode_cali.error_code = CALI_Error_Average_Continuity;encode_cali.error_data = count;return;	}	//两次数据差过小,也报错if(sub_data == 0){	encode_cali.error_code = CALI_Error_Average_Dir;				encode_cali.error_data = count;	return;	}  //数据差为0也不对if((sub_data > 0) && (!encode_cali.dir))   //如果数据差大于0又不是正转,报错							{	encode_cali.error_code = CALI_Error_Average_Dir;				encode_cali.error_data = count;	return;	}if((sub_data < 0) && (encode_cali.dir))	   //如果数据差小于0又是正转,报错{	encode_cali.error_code = CALI_Error_Average_Dir;encode_cali.error_data = count;	return;	}
}

接下去进行步进电机相位角和磁编码器数据的拟合,会在下一节学习,还有最为关键的:正常工作时的编码器驱动回调函数的编写。

未完待续


http://www.ppmy.cn/news/957421.html

相关文章

PersistentVolume:怎么解决数据持久化

Kubernetes 的 Volume 对数据存储已经给出了一个很好的抽象&#xff0c;它只是定义了有这么一个“存储卷”&#xff0c;而这个“存储卷”是什么类型、有多大容量、怎么存储&#xff0c;我们都可以自由发挥。Pod 不需要关心那些专业、复杂的细节&#xff0c;只要设置好 volumeMo…

博彦博彦博彦

博|彦mi 10086xiaoxiongX 10086xiaoxiong. 10086xiao. 10086xiaoxiong.X 堡垒机新密 !10086xiaoxiongX https://e-cology.beyondsoft.com/wui/index.html?v1653299353060#/?_keyizpsux 邮箱 xiaoxiong01 10086xiao.

博彦科技以太机器人平台亮相世界人工智能大会 赋能企业智慧升级

上海2018年9月18日电 /美通社/ -- 2018年9月17日&#xff0c;2018世界人工智能大会首日&#xff0c;在微软全球执行副总裁、微软人工智能及微软研究事业部负责人沈向洋博士的开场主旨演讲中&#xff0c;博彦科技以太机器人平台&#xff0c;作为微软人工智能合作伙伴创新解决方案…

面试记录_博彦科技

2021/9/3 成都 博彦科技 测试实习生 电话一面&#xff08;不得不说这家公司效率很高&#xff0c;规模也大&#xff0c;下午网上笔试完合格后晚上就安排电话一面&#xff0c;本来想着投Java&#xff0c;结果测试的笔试过了&#xff0c;就去试试&#xff09; 简单介绍自己 算法…

博彦科技offer到手,但甲方变更,程序员只能忍吞苦果吗

面试很快结束了&#xff0c;面试后HR 小姐姐就告诉你面试通过了。由于薪资问题第二天才定下来&#xff0c;offer 在 2020年 5月28晚上就下来了。如下图 很快开始了一系列的入职流程&#xff0c;1 薪资证明 2&#xff0c;离职证明 3&#xff0c;最夸张的是一张表格 ..等。继续上…

博彦科技面试题-最新(上海)

As last blog mentioned&#xff08; 中软面试题-最新&#xff09; ,Some outsourcing company,like chinasoft, beyondsoft, vinceinfo, Hisoft,wicresoft, etc. all the process of interview is the same, if you pass the interview of these company, according to the co…

博彦科技上演蛇吞象并购 股价逆势大涨

“如未来顺利完成该交易&#xff0c;我公司认为将极大地加强公司IT服务外包的交付能力&#xff0c;完善公司的行业布局和客户布局。”博彦科技公司方面如是说。 5月31日消息&#xff0c;继前一交易日大涨5.22%后&#xff0c;博彦科技昨日&#xff08;5月31日&#xff09;逆势冲…

Power bi 4.2 博彦日历

关注微信公共号&#xff1a;小程在线 关注CSDN博客&#xff1a;程志伟的博客 数据集链接见微信公共号底端 1.在Power BI中导入可视化效果&#xff0c; 点击… 选择导入自定义视觉对象&#xff0c;点击导入。 2. 选择我们需要导入的视觉对象。 3. 在可视化就会出现新的图形。 …