STM32HAL学习笔记六-定时器之正交解码

STM32HAL学习笔记六-定时器之正交解码

​ 本次实验使用STM32F103ZET6开发板的TIM2对带霍尔编码器的减速电机进行计数,然后将输出计数值通过串口打印,因此本次实验是在实验二的基础上进行修改。参考:https://blog.csdn.net/ASWaterbenben/article/details/115588689?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164308693616781685356407%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164308693616781685356407&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-115588689.first_rank_v2_pc_rank_v29&utm_term=hal%E6%AD%A3%E4%BA%A4%E8%A7%A3%E7%A0%81&spm=1018.2226.3001.4187
,并根据自己的情况做了相应修改。

1.将组合通道设置为计数模式

请添加图片描述

2.参数配置

2.1修改计数模式

​ 因为霍尔编码器有AB相,所以选择在TI1和TI2上计数模式(表77),同时根据TI1和TI2输入脉冲的相交差确定计数方向(图133)

请添加图片描述

请添加图片描述

请添加图片描述

2.2计数极性

​ 根据表77,在TI1和TI2上计数模式,无论计数极性是下降沿还是上升沿,TI1和TI2都会进行计数只是计数的方向不同。

请添加图片描述

2.3计数设置

由于我使用的带编码器减速电机的减速比是30,线束为13,而且在在TI1和TI2上计数模式,无论计数极性是下降沿还是上升沿,TI1和TI2都会进行计数,所以这里将计数值修改成13 X 30 X 4 - 1 = 1559。如果这里将分频系数设置成4,那么计数值应为13 X 30 - 1。

请添加图片描述

3.使能中断

请添加图片描述

4.程序编写

4.1变量定义

请添加图片描述

uint8_t Direction;//计数方向
uint16_t enc1 = 0,enc1_old = 0;//当前计数值  上次计数值,用于判断是否转过一圈
int16_t enc2 = 0;//记录转过圈数
int32_t enc;//总计数值enc2*1560 + enc1
uint16_t counter;//用于分频打印的计数值

4.2初始化

请添加图片描述

	HAL_UART_Receive_IT(&huart1,RxBuf1,sizeof(RxBuf1));//开启串口接收中断
	HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);//打开计数器
	printf("Hello World\r\n");

4.3调试打印

请添加图片描述

		Direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2);  
        enc1 = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim2));	//获取定时器的值
		if((Direction == 0) &(enc1 < enc1_old))				//正向旋转数值变小,说明进位
		{
			enc2++;
		}
		if((Direction == 1) &(enc1 > enc1_old))				//反向旋转数值变小,说明借位
		{
			enc2--;
		}
		enc1_old = enc1;									//更新enc1_old,便于下次计算
		enc = enc2*1560 + enc1;								//计算当前计数总值,带+-号
		counter++;											//主函数计数
		if(counter>1000)									//主函数每次运行约1ms,此处用于每1000ms发送一次数
		{
			counter = 0;									//计数值清零
			printf("Dir %d,	Enc2 %d, Enc1 %d, ENC %d\r\n",Direction,enc2,enc1,enc);//打印相关计数数据
		}
		HAL_Delay(1);

5.调试结果

​ 结果貌似有点不符合,我也不知道是不是电机的问题,还是与标准库不同。

请添加图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧 看一下我用过的一种编码器 编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是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正交解码功能,,直接读这个值,,这样呢就会出现很麻烦的问题,,,,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值