STM32F407编码器正交解码

本文介绍了如何在STM32F407VET6微控制器上实现编码器的正交解码模式。内容涵盖可用的高级定时器TIM1和TIM8,以及通用定时器TIM2、TIM3、TIM4和TIM5的正交解码功能。特别指出,使用编码器时需注意32位定时器TIM5和TIM2的计数范围,并提到了可能需要为编码器接口添加上拉电阻的问题。
摘要由CSDN通过智能技术生成

最近写了一个STM32F407VET6编码器的正交解码模式,发现网上资料较少,就把自己的代码贴上来。对于F407来说,可以用作编码器模式的只有高级定时器TIM1和TIM8,通用定时器有TIM2 TIM3 TIM4 TIM5。且每个定时器只有通道1和通道2能作为正交解码。
还要注意一下定时器5和定时器2是32位定时器,装载数值时注意要装载0xffffffff。还有读不来数据看看是不是自己用的编码器需要加上拉电阻。

void Speed_ENC(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);  	//TIM1时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); 	//使能PORTE时钟
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  	//TIM5时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA时钟	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);  	//TIM8时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); 	//使能PORTC时钟	
	
	/************定时器1引脚初始化******************/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_11; //PTE9 PTE11
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed &
关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧 看一下我用过的一种编码器 编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说明这个编码器转一圈对应的信号线会输出500个脉冲,,,,为什么说是对应的,,,对于上面的编码器而言是这样的,,,,但是有的编码器里面有好多线,,,有的信号线是转一圈就输出对应多少线的脉冲,,,有的信号线是转一圈就输出一个脉冲,,,,这就要看编码器的资料了...... 看我上面用过的这个编码器,,使用A,B,VCC,GND这四根线,, 编码器转一圈A信号线会输出500个脉冲,,,,B信号线也会输出500个脉冲,,不过 正转的时候 反转的时候 正转的时候信号线A先输出信号,B信号线后输出 反转的时候信号线B先输出信号,A信号线后输出 假设只是单纯的测正转脉冲或者单纯的测反转脉冲,那么只需要用单片机随意选择一个信号线就行了,,然后就是脉冲计数,,,, 如果说要是一个电机既有正转又有反转,,,,我想知道这个电机绝对正转了多少圈 那么就需要用正转的圈数减去反转的圈数了,,,,,,那么问题来了,,,怎么测正转圈数和反转圈数 其实传统的做法 关于D触发器,,,,当clk引脚来一个上升沿,D引脚是什么电平,,那么Q就输出什么电平,,Q非,,与Q相反 现在如果说电机正转 可以看到每当B来上升沿的时候,A信号总为高电平,,,所以Q会输出高电平 设置A为上升沿进入其,,,中断函数 然后判断一下Q是否为高电平,如果为高电平正转变量自加一 如果电机反转 可以看到每当B来上升沿的时候,A信号总为低电平,,,所以Q会输出低电平 设置B为上升沿进入其,,,中断函数 然后判断一下Q是否为低电平,如果为低电平反转变量自加一 然后 正转变量减去反转变量就能得到电机到底正转了多少圈......这样就会得到一个相对的变量,,这个变量呢,就是单片机正交解码的值 说白了单片机的正交解码功能就是得到一个正反转,,,相对的变量,,,,这个变量呢,,你正转的时候他会加,你反转的时候他会减, 不过呢,,,,STM32的这个变量有点坑,,,是太坑了,,,他内部定义的这个变量的类型是无符号整形,,,也就是说0---65535,,,,,,,,,,,,, 如果直接利用STM32正交解码功能,,直接读这个值,,这样呢就会出现很麻烦的问题,,,,
STM32F407上实现编码器电机控制的过程如下: 1. 首先,连接编码器STM32F407的GPIO引脚。编码器通常有两个输出信号,分别是A相和B相。这两个信号是正交的,可以用来检测电机的转动方向和速度。 2. 配置定时器(Timer)来解码编码器的信号。在STM32F407中,定时器有专门的编码器模式,可以用来处理编码器的输入信号。通过配置定时器的输入捕获或外部中断功能,可以检测编码器信号的边沿变化。 3. 在编码器模式下,定时器会自动解码编码器信号,并将转动方向和速度信息存储在定时器的计数器寄存器中。通过读取定时器的计数器值,可以获取电机的转动角度和速度。 4. 根据需要,可以使用中断来处理编码器信号的变化。当编码器信号发生变化时,中断可以及时响应并执行相应的操作,例如更新电机的控制参数或执行其他任务。 需要注意的是,编码器电机控制的具体实现可能会因具体的应用场景和需求而有所不同。以上是一个基本的框架,具体的实现细节可以参考STM32F407的中文参考手册\[1\]和相关的编码器应用笔记\[2\]。 #### 引用[.reference_title] - *1* [Stm32F407控制直流减速编码电机(平衡小车之家出品)--使用增量式速度PI](https://blog.csdn.net/weixin_41534481/article/details/97485217)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [带编码器的直流减速电机——基于STM32F407](https://blog.csdn.net/weixin_44692935/article/details/97419594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值