最近在调试平衡小车,在网上找到的关于直流电机编码器的使用源码。查看stm32使用手册可以看到如下的配置,和图片。基本上程序也是这样去设置的相关寄存器的。
如果TI1和TI2分别接电机的A相和B相的话,那么,当电机正转的时候,如下图计数器回想上计数,反转的时候会向下计数,注意了这个向下计数并不会出现负的值,依旧是从(0-ARR)计数。
这种模式的好处:1.上升沿和下降沿都会计数,所以被软件4倍频了。2.当某一相有毛刺的时候,计数器会在硬件上停止计数。
下面看网上找到的代码。
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 编码器模式 负数
引用地址:
stm32中编码器模式读出“负数”的问题
推荐阅读最新更新时间:2024-03-16 16:14
stm32 系统时钟设置
如图1:时钟树,可见Stm32有5个时钟源。 8M HSI RC:内部时钟,从图上看,有两路分支,一个是直接作为系统时钟SYSCLK使用,另一个是先二分频后,再通过PLLMUL倍频作为系统时钟SYSCLK 4-16M HSE OSC:外部晶振作为时钟源,可以看做有3路分支,第一是直接作为系统时钟SYSCLK使用,第二个通过PLL倍频后作为系统时钟SYSCLK,第三个是128分频后作为RTC时钟输入 32.768kHz LSE OSC:低速外部时钟源,可直接用作RTC时钟输入 40kHz LSI RC:低速内部时钟源,有两路分支,一个用作RTC时钟,一个用作看门狗时钟 PLLCLK:可以直接看做倍频器,也不能说得上是时钟源,和以上某
[单片机]
Stm32串口发送字节数据
说明:每发送一次数据,LED等闪烁一下 /* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_usart.h #include system_stm32f10x.h #include stdio.h #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) void RCC_Configuratio
[单片机]
基于STM32单片机的电池管理系统触摸屏设计
0 引 言 电动车一直以清洁环保而备受关注,加上能源危机加剧、油价不断上涨,电动车也越来越受到用户的青睐。电动车一般采用锂电池供电,由多个单体电池串联成电池组作为动力电源。但由于各个串联单体电池特性不能保证完全一致,因此相同的电流下充电放电速度也会不同,如果不进行均衡干预,电池寿命会大大缩短,因此需要实时监控各个单体电池的状态、总电压、总电流,根据状态适时进行电池充放电均衡,并且充放电均衡时,均衡状态也要实时进行检测,所以就有了电动车电池能量管理系统(EMS)。实践证明EMS可以有效延长电动车电池使用寿命,是电动车中十分重要的管理系统。 EMS主要包括:信息采集模块、充放电均衡模块、信息集中处理模块以及显示模块。图1为自主研发
[单片机]
STM32之ADC模数转换
简介:ADC通常要与DMA一起使用 这里只是简单的用库配置ADC 不断扫描来实现ADC的应用。 首先配置GPIO与ADC的时钟: ADC_InitTypeDefADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//来自:S_T_M8._CN GPIO_InitSt
[单片机]
stm32.cube(六)——HAL.FLASH
一、片内Flash特性 1.1 FLash结构简图 我的开发板是stm32f103xx,所以片内flash主存储器大小128K,单页为1K。不同的芯片flash大小不同,页大小也不同。 主存储器 用来存储Rom程序,烧写的区域。当然也可以存一些其他东西,比如做nvram使用。 信息块 这个区域分两个部分。 存储区,用户不可写区域,用来存储ISP下载时用到的程序。当用ISP模式进行烧写时,自动调用里面的程序下载数据并烧写到flash里。 用户选项字,存储硬件配置信息。某些复用的外设可能在上电复位后就要立即知道它被用作其中哪个用途。 用户选项字默认不可写,它上电自动加锁。只有通过向FLASH_OPTKEYR依次写入约定解锁码KE
[单片机]
STM32的AFIO时钟何时开启
首先为什么要开启时钟? 答:因为要对寄存器进行读写!而在STM32中对寄存器的读写都是要打开寄存器对应的时钟才可以的【就像人一样,有了跳动的脉搏手臂才能有能量才能进行各种动作】。 然后就什么时候AFIO时钟开启(所有时钟都是这样)就清楚了:当需要对“AFIO时钟管理的寄存器”进行读写时AFIO时钟打开!当然不对“AFIO时钟管理的寄存器”读写时也可以打开AFIO时钟,此时只是白白增加能耗、写无用代码(白白浪费程序存储器空间)而已! 接下来:跟AFIO相关的寄存器有哪些呢? 答:根据《STM32中文参考手册_V10》有:①事件控制寄存器(AFIO_EVCR)、②复用重映射和调试I/O 配置寄存器(AFIO_MAPR)、③外部中断
[单片机]
STM32调用C库自带函数
在MDK5的安装路径中:D:MDK5ARMARMCCinclude,可以看到很多C库头文件,在程序中只要包含了相应的头文件,编译器就会自动把相应的代码编译链接进去。 下面介绍在STM32可能会用到的函数: include math.h include stdio.h 主要就是printf函数在串口上的应用: 以正点原子的程序模版为例: 在usart.c中定义了把printf和串口一输出相关联的函数: 如果你注释掉这段话,但程序上使用了 printf,虽然软件编译不会报错,但是硬件上 STM32 是无法启动的,这段代码最好不要去修改。 若要映射到其他串口,只要把上诉的USART1改为USARTX或UARTX(X表示
[单片机]
STM32 IAR 优化选项介绍
这篇文章给大家介绍一下 STM32 IAR优化选项 的设置 IAR优化选项包括: 无优化 、 低等级优化 、 中等优化 、 高等优化 。 公共子表达式压缩 公共子表达式压缩是较为常见的优化方式,这种方式既可以较少代码的大小,也可以缩短运行的时间,编译器可能会根据代码上下文产生更加复杂的优化结果,比如对数组或矩阵进行访问时,需要的数组索引计算,有的时候代码中可能会使用大量的宏,虽然在代码中比较简洁,但也可能在代码中产生很多重复计算,编译器使用这种优化也会有很好的结果。 在公共子表达式压缩优化中,不仅会使用寄存器,也有可能会使用在内存中的临时变量,但是因为部分代码的执行被优化,所以优化后的代码可能会比较难进行调试
[单片机]