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

这篇具有很好参考价值的文章主要介绍了STM32自学笔记16-步进电机驱动项目-磁编码器的校准。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上节我把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,如果是反转,则差值应小于0
		if(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;	
		}
}

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

未完待续文章来源地址https://www.toymoban.com/news/detail-563094.html

到了这里,关于STM32自学笔记16-步进电机驱动项目-磁编码器的校准的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32篇】DRV8425驱动步进电机

    【STM32篇】4988驱动步进电机_hr4988-CSDN博客         在上篇文章中使用了HR4988实现了步进电机的驱动,在实际运用过程,HR4988或者A4988驱动步进电机会存在电机噪音太大的现象。本次将向各位友友介绍一个驱动简单且非常静音的一款步进电机驱动IC。         DRV8424/25 是适

    2024年04月11日
    浏览(46)
  • STM32CubeMX ULN2003步进电机驱动

    一、28BYJ-48 步进电机  28BYJ-48是一款5线单极步进电机,运行电压为5V。 根据数据表,当28BYJ-48电机在全步模式下运行时,每步对应于11.25°的旋转。这意味着每转有32步 (360°/11.25° = 32)。 如上图所示,步距角=5.625°/64 意思就是每64个脉冲步进电机就会转5.625度,因此我们很容易得

    2024年01月18日
    浏览(48)
  • STM32F4驱动42步进电机(采用驱动器)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 stm32f407zgt6芯片,tb6600驱动器 植树机代码,可以驱动四路42步进电机,以下是只驱动1路。 : 红线接B+(TB6600), 蓝线接B-, 绿线接A-, 黑线接A+ 该图片是转载的。根据本文代码:Signal的-统一接开发板的GND(解

    2024年02月03日
    浏览(51)
  • 【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)

    参考文章与课程:   【视频课程】步进电机基础原理和应用——程子华主讲   【视频课程】电机系列教学视频(基于STM32硬件)——野火   【霄耀在努力】STM32驱动步进电机(原理、程序、解决电机只震动不转动问题)   步进控制系统由以下三个部分组成: 控制器

    2023年04月09日
    浏览(38)
  • STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    该篇文章中用到的步进电机闭环驱动器为Emm42_V4.0步进电机闭环驱动器。该闭环驱动器自带FOC矢量闭环控制算法,能实现力矩、速度、位置三环控制。 如下图所示,该42步进闭环电机驱动器的A+、A-、B+、B-连接步进电机,通过右侧的使能、脉冲、方向端对步进电机进行驱动控制

    2024年02月01日
    浏览(45)
  • 【STM32】实战3.1—用STM32与TB6600驱动器驱动42步进电机(一)

    目录 0 参考资料出处 1 实验预期效果 2 硬件学习 2.1 TB6600驱动器  2.1.1 通过拨码开关设定细分与电流 2.1.2 共阴共阳接线法 2.2 开关电源(AC转DC变压器) 电源线 2.3 42步进电机 2.3.1 基本知识 2.3.2 转速细分控制 2.3.3 满步、半步、微步驱动原理 3 软件配置与硬件接线 3.1 STM32CubeM

    2024年02月02日
    浏览(45)
  • STM32+A4988拓展板+HAL实现简单42步进电机驱动

    1.A4988及其拓展板简介 2.接线 3.STM32_CUBEMX配置 4.代码详解 ——————————————————————————————————————————— 1.A4988及其拓展板简介 A4988 A4988拓展板     A4988是一款常用的步进电机驱动器,A4988驱动器采用了步进电机的微步技术,能

    2024年01月22日
    浏览(71)
  • stm32使用TB6600驱动器控制42BYGH型步进电机

    stm32使用TB6600驱动器控制42BYGH型步进电机 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 24V电源就是通过电路控制开关进行高速的导通于截至,将直流电转化为高频率的交流电提供给变压

    2024年02月11日
    浏览(38)
  • stm32F103单片机pwm控制伺服驱动器进而控制步进电机

    1.需要一台步进电机,私服驱动器,stm32单片机;先按照说明文档,连接好硬件相关线路,对应好sign+,sign-,puls+,puls-线路,其中sign只是个io口拉高拉低操作,puls是pwm波形输出口,虽然有两根线,但只是需要控制一个IO口输出波形即可; 采用主从模式,TIM1为主定时器,tim3未从定

    2024年02月04日
    浏览(41)
  • 设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

    https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==mid=2247484170idx=1sn=3fa68d0fbf30cf614e8779abf38c3e2bchksm=cf430652f8348f44e4b95bb7b22ce7f9f5a86e13f421741aefd08cedb169708309c79566ab1ftoken=1923877603lang=zh_CN#rd https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==mid=2247484170idx=1sn=3fa68d0fbf30cf614e8779abf38c3e2bchksm=cf430652f8348f44e4b95bb7b22ce7f9f5a8

    2023年04月17日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包