基于STM32的正交编码器驱动电机设计

发布者:EternalWhisper最新更新时间:2024-04-10 来源: elecfans关键字:STM32  正交编码器  驱动电机 手机看文章 扫描二维码
随时随地手机看文章

1。编码器原理

什么是正交?如果两个信号相位相差90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向。

这里使用了TI12模式,例如当T1上升沿,T2在低电平时;T1下降沿,T2在高电平时,向上计数,这样的好处是当有毛刺产生的时候,会自动+1 -1过滤掉毛刺。

2。编码器的中断

由于编码器是基于定时器的,所以编码器的中断实际上就是定时器的中断。也就是说定时器是每隔一定时间加一个数(或减一个数 ),当数到达预设值时就产生中断,而编码器是每一个有效脉冲就加一个数(或减一个数 ),当数到达预设值时就产生中断。若预设值为1000则编码器与定时器中断不同的是,当编码器反转时值到达999产生一次中断,而当编码器正转到达0时同 样产生一次中断。在硬件上这两个中断是没法区分的,这也就造成了有种情况的误判。

3。STM32编码器没有考虑的情况

想象一下,如果编码器的预设值为1000,当某次我们使得编码器正转产生中断后,立即反转则又该怎么办呢?根据上面的说法,这时候会产生两次一样的中断。 如果在算法上没有处理的话,极有可能认为是行走了两次正向。但实际上并没有。所以这个时候必须结合方向来判断行走的情况(判断方向使用的是DIR寄存器 位)或者在产生中断后读一次count寄存器位(看看是999还是0,以此来判断当前的方向)。只有上一次为正且这一次同样为正,距离才是相加的。

4。STM32f1系列定时器16位的问题

我用STM32的定时器3工作于编码器方式,可以正常得到编码器位置,但由于现在只有16位计数,位数不够,我想扩展到32位,可以先用定时器内部连接,将定时器3 的溢出送到定时器2,用定时器2做高位,在正转的时候正常,但反向的时候出错。换了个思路,做个每10ms产生一次的中断,在中断中调用下面的代码,下述代码中MAX_COUNT是 比 10ms内可能出现的计数最大值还要大的值,ENCODER_TIM_PERIOD是定时器的period值,最好比MAX_COUNT大,然后定义一个32位的有符号变量,如currentCount,然后每隔10ms执行一次currentCount += Enc_GetCount();只需要去读取currentCount的值就可以得到位移信息了。

s16 Enc_GetCount(void)

{

static u16 lastCount = 0;

u16 curCount = ENCODER_TIM-》CNT;

s32 dAngle = curCount - lastCount;

if(dAngle 》= MAX_COUNT){

dAngle -= ENCODER_TIM_PERIOD;

}else if(dAngle 《 -MAX_COUNT){

dAngle += ENCODER_TIM_PERIOD;

}

lastCount = curCount;

return (s16)dAngle;

}

5。其它一些得到的信息

1.编码器有个转速上限,超过这个上限是不能正常工作的,这个是硬件的限制,原则上线数越多转速就越低,这点在选型时要注意,编码器的输出一般是开漏的,所以单片机的io一定要上拉输入状态。

2.定时器初始化好以后,任何时候CNT寄存器的值就是编码器的位置信息,正转他会加反转他会减这部分是不需要软件干预的,初始化时给的TIM_Period 值应该是码盘整圈的刻度值,在减溢出会自动修正为这个数。加超过此数值就回0.

3.如果要扩展成多圈计数需要溢出中断,程序上圈计数加减方向位就行了。

4.每个定时器的输入脚可以通过软件设定滤波

5.应用中如果没有绝对位置信号或者初始化完成后还没有收到绝对位置信号前的计数只能是相对计数。收到绝对位置信号后重新修改一次CNT的值就行了。码盘一般都有零位置信号,结合到定时器捕获输入就行。上电以后要往返运动一下找到这个位置。

6.即便有滤波计数值偶尔也会有出错误的情况,一圈多计一个或少计一个数都是很正常的特别是转速比较高的时候尤其明显,有个绝对位置信号做修正是很有必要的。绝对位置信号不需要一定在零位置点,收到这个信号就将CNT修正为一个固定的数值即可。

7.开启定时器的输入中断可以达到每个步计数都作处理的效果,但是高速运转的时候你可能处理不过来.


关键字:STM32  正交编码器  驱动电机 引用地址:基于STM32的正交编码器驱动电机设计

上一篇:教程:如何用STM32-CubeMX-实现CAN通讯
下一篇:怎样通过USB对STM32 Blue Pill编程

推荐阅读最新更新时间:2026-03-24 17:10

STM32正交编码器编程
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。 如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。 代码如下: void Decoder_Configuration(void) { GPIO_InitTypeDef GPIO_InitSt
[单片机]
<font color='red'>STM32</font><font color='red'>正交</font><font color='red'>编码器</font>编程
STM32正交编码器接口
一、主要内容 芯片型号、使用引脚及初始化程序源码 TIM2端口重映射问题 与JTAG接口冲突时的现象及解决方法 二、芯片型号、使用引脚及初始化程序源码 芯片型号:STM32F103RET6 使用定时器:TIM2、TIM3、TIM4、TIM5 使用引脚:      TIM2—PA15、PB3(remap)      TIM3—PA6、PA7      TIM4—PB6、PB7      TIM5—PA0、PA1 初始化程序源码: (其中TIM2的配置有特殊需要注意的地方,其他配置相同,调试时遇到的问题和解决方法见下文) #include stm32f10x.h #include encoder.h void TI
[单片机]
STM32正交编码器驱动,引入(突变)带进位的位置环和速度环
STM32正交编码器驱动,引入(突变)带进位的位置环和速度环 http://bbs.elecfans.com/jishu_484159_1_1.html (出处: 中国电子技术论坛) #include stm32f10x.h #include stm32f10x_encoder.h #include sys.h #include usart.h #include led.h #define COUNTER_RESET (u16)0 #define ICx_FILTER (u8) 0 // 6 - 670nsec #define TIMx_PRE_EMPTION_PRIORITY 1 #define TIMx_SUB_
[单片机]
简要描述下STM32 定时器对正交编码器进行计数控制的方法
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。 如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。 下面是我调试OK的代码: void Encoder_Configration(void) { GPIO_InitTypeDef GPIO_Ini
[单片机]
简要描述下<font color='red'>STM32</font> 定时器对<font color='red'>正交</font><font color='red'>编码器</font>进行计数控制的方法
stm32f2xx与stm32f10x在正交编码器应用定时器初始化中的区别
注意: 如果stm32f2xx系列上面的网址的代码要做适当修改。 以下说重点:stm32f2xx系列,在调试中对GPIO的初始化,切记选择GPIO_Mode_AF模式,即端口复用。 随后,要做端口映射处理,即调用:GPIO_PinAFConfig()函数。 这2个方式不选择,timer是不会有反应的 本人是stm32f207,花了4天惨痛代价。 以下贴代码: /* Private define ------------------------------------------------------------*/ #define ENCODER_TIMER TIM3 //
[单片机]
兆易创新GD32M531 MCU全新登场 硬核驱动电机控制技术创新
中国北京(2026年3月11日)—— 业界领先的半导体器件供应商兆易创新GigaDevice宣布正式推出专为电机控制场景量身打造的GD32M531系列32位微控制器,以Arm ® Cortex ® -M33为核心,集成电机控制专属硬件加速器与高集成度外设资源,凭借优异的运算性能、精准的控制能力与工业级高可靠性,实现双电机+PFC精准调控,为空调外机、空气源热泵、洗衣机/干衣机、洗碗机、多头电磁灶等多种电机控制应用场景提供高能效、高性价比的解决方案。 GD32M531系列MCU现已开放样品及开发板申请,将于4月起正式量产供货。 核心技术突破:电机控制专属硬件加速,精度与效率双飞跃 GD32M531系列的核心优势在
[嵌入式]
兆易创新GD32M531 MCU全新登场 硬核<font color='red'>驱动电机</font>控制技术创新
解析电动汽车的四种驱动电机
在环保的大环境下,电动汽车也成为了近年来研究的热点,电动汽车在城市交通中可以实现零排放或极低排放,在环保领域优势巨大,各国都在努力发展电动汽车。电动汽车主要是由电机驱动系统、电池系统和整车控制系统三部分构成,其中的电机驱动系统是直接将电能转换为机械能的部分,决定了电动汽车的性能指标。因此,对于驱动电机的选择就尤为重要。 1、电动汽车对于驱动电机的要求 目前对于电动汽车性能的评定,主要是考虑以下三个性能指标: (1)最大行驶里程(km):电动汽车在电池充满电后的最大行驶里程; (2)加速能力(s):电动汽车从静止加速到一定的时速所需要的最小时间; (3)最高时速(km/h):电动汽车所能达到的最高时速。 针对于电动汽车的驱动特点
[嵌入式]
解析电动汽车的四种<font color='red'>驱动电机</font>
驱动电机核心零部件的发展趋势和技术挑战
驱动电机高转速需求趋势 现状及趋势说明:通过电机高转速实现极致车速是总成的一个重要发展趋势;BYD 于 2024 年 批产应用最高工作转速超过 23000rpm,小米目标在 2025 年推出超过 27000rpm 的电机,按照这个趋势 2028 年电机最高工作转速将突破 30000rpm。 对应的困难:一方面,高速旋转时电机转子内部离心应力需要有较为经济的手段克服。 行业期待:更高强度的硅钢材料,新型转子结构,期待能够大批量低成本制造的类似碳纤维套筒的零部件。另一方面,电机高速工作时带来较高电流频率,较高的电流频率导致电机产生较大的铁损, 此外过高的电流频率迫使现有主流扁线电机的交流损耗问题突出。因此为了兼顾电机高速热可靠 性及工
[嵌入式]
<font color='red'>驱动电机</font>核心零部件的发展趋势和技术挑战
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved