stm32中编码器模式读出“负数”的问题

    最近在调试平衡小车,在网上找到的关于直流电机编码器的使用源码。查看stm32使用手册可以看到如下的配置,和图片。基本上程序也是这样去设置的相关寄存器的。

    如果TI1和TI2分别接电机的A相和B相的话,那么,当电机正转的时候,如下图计数器回想上计数,反转的时候会向下计数,注意了这个向下计数并不会出现负的值,依旧是从(0-ARR)计数。

          这种模式的好处:1.上升沿和下降沿都会计数,所以被软件4倍频了。2.当某一相有毛刺的时候,计数器会在硬件上停止计数。


stm32中编码器模式读出“负数”的问题_第1张图片

    下面看网上找到的代码。

int Read_Encoder(u8 TIMX)
{
    int Encoder_TIM;    
   switch(TIMX)
	 {
	      case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;
		 case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;	
		 case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break;	
		 default:  Encoder_TIM=0;
	 }
		return Encoder_TIM;
}

        上面这样传进去要读的定时器,返回的是相关编码器的速度值。但是为什么,会是一个负数呢。计数器只能计数(0-ARR)

注意看上面使用了强制类型装换。把寄存器的值读出来了之后,转换成了short型(2字节,32位系统下),范围为(-32768-32767),此时当我们把计数器的初始值设置为0之后,如果出现反转,它就会从0开始向下计数(0,65535,65534,...)但是经过强制类型转换之后就变成了(0,-1,-2,...)。

    为什么65535会变成-1这是我不能理解的,此时我们回到short的表示范围(-32768-32767),也就是说当读出来的值为(32767,  32768, 32769,...,65535,65536,65537...)的时候会因为溢出而转换为

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


你可能感兴趣的:(stm32)