STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现

 <总目录>

 

一、STM32CUBE 编码器配置

1.1、第一步:编码器通道配置

根据电路图,我们选用的引脚是PA0和PA1,这是Time2的通道1和2,而实际上我们只需要选择配置成编码器模式即可自动选择这两个引脚。

STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现_第1张图片

这是一个的编码器配置,应为是两个电机,要配置两个编码器,来读取速度。另一个是PB6和PB7,配置如下:

STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现_第2张图片

1.2、第二步:编码器属性配置

属性配置的时候就很关键了,这里我们选择TI1和TI2模式,这个代表什么意思呢?这是四倍频的设置,四倍频可以大大提高测量精度,灵敏性;然后我们设置计数的最大值是65535即0xFFFF。

STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现_第3张图片

二、编码器四倍频原理

2.1、编码器概述

编码器是一种将角位移或者角速度转换成一连串的电数字信号脉冲的旋转式传感器,我们可以通过编码器测量到角位移或者角速度信息。编码器从类型上可以划分增量式编码器和绝对式编码器。而从编码器检测原理上划分,可以分为光学式、磁式、感应式等等。一般常用的是光学式和电磁式编码器。

2.2、编码器原理

STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现_第4张图片

如下图所示。

STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现_第5张图片

2.3、四倍频原理

四倍频的技术使用,可以将编码器的精度提高4倍,如下图所示,编码器的输出波形图。

STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现_第6张图片

STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现_第7张图片

三、代码编写

3.1、编码器初始化

重要的一点是设置计数值初始化为0,这个就涉及到正反转的配置了。

void Encoder_start(void)
{
    __HAL_TIM_SET_COUNTER(&htim2,0);
    __HAL_TIM_SET_COUNTER(&htim4,0);
	HAL_TIM_Encoder_Start_IT(&htim2,TIM_CHANNEL_ALL);
	HAL_TIM_Encoder_Start_IT(&htim4,TIM_CHANNEL_ALL);
	HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);
	HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);
}

3.2、读取编码器数据

每次在软件上格式都没问题,复制到这里就不对齐了!

int Read_Encoder(uint8_t TIMX)
{
    int Encoder_TIM = 0;  
    switch(TIMX)
	{
	    case 2:  
			  Encoder_TIM= -(short)__HAL_TIM_GET_COUNTER(&htim2);
		      __HAL_TIM_SET_COUNTER(&htim2,0);
		      break;
		/*case 3:  
			Encoder_TIM= __HAL_TIM_GET_COUNTER(&htim2);  TIM3 -> CNT=0;break;	
		*/
		 case 4:  
			  Encoder_TIM= -(short)__HAL_TIM_GET_COUNTER(&htim4);     
		      __HAL_TIM_SET_COUNTER(&htim4,0);
		      break;	
		 default:  
			  Encoder_TIM=0;
	}
	return Encoder_TIM;
}

3.2、编码器正反转获取

加short强制转换,不知道大家有没有理解,返回值是16位数据,而short也表示的是16位的整形类型。

我们电机是不是有正反转之分,是如何计数的呢,每次累加1来计数的,这是正转的情况;那反转呢?同理,是每次减1来计数的,那么我们设置初始化为0,反转一次,就是0xfffe,换成整形类型就是-1,然后是-2,-3这样大家就理解了吧。

short前面加负号,是根据我个人认为的正反转方向定的,这个可以去掉。

Encoder_TIM= -(short)__HAL_TIM_GET_COUNTER(&htim2);
 __HAL_TIM_SET_COUNTER(&htim2,0);
 
Encoder_TIM= -(short)__HAL_TIM_GET_COUNTER(&htim4);     
__HAL_TIM_SET_COUNTER(&htim4,0);

short的表示范围(-32768-32767),也就是说当读出来的值为(32767,  32768, 32769,...,65535,65536,65537...)的时候会因为溢出而转换为(32767,-32768,-32767,...,   -1,      ,0,       , 1)就这样不断地循环下去。所以我们的电机反转的时候读出的数就是反方向的速度值。而不必用65535去减去读出的值再加上负号才可以的到方便观察的值。只需要一个强制类型转换就可以了。

四、KEIL软件调试

STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现_第8张图片

五、STM32CUEB配置和代码程序下载

https://download.csdn.net/download/Emoeror_Zhang/12280774

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

1、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。

<总目录>

你可能感兴趣的:(stm32sube,stm32,编码器,auto-encoder,encoder)