STM32编码器接口模式测速 分成两段上升
- 格式:doc
- 大小:85.50 KB
- 文档页数:4
STM32 16位定时器对正交编码器计数的方法(附检测输入脉冲的方法)发布时间:2009-10-04 14:29:11今天决定在END开博,之前没有工作记录的习惯,从今天起在这里记录下自己工作时的点滴经验,以供日后参考以及与网络朋友交流。
第一篇文章先简要描述下STM32 定时器对正交编码器进行计数控制的方法。
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。
通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:void Encoder_Configration(void){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;//PC6 A相PC7 B相GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);/* Enable the TIM3 Update Interrupt *//*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRI ORITY;NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);*//* Timer configuration in Encoder mode */TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescalingTIM_TimeBaseStructure.TIM_Period = 10000;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;TIM_ICInit(TIM8, &TIM_ICInitStructure);// Clear all pending interruptsTIM_ClearFlag(TIM8, TIM_FLAG_Update);TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);//Reset counterTIM2->CNT = 0;TIM_Cmd(TIM8, ENABLE);}n_Counter = TIM_GetCounter(TIM8);Diled_Disp_Num((float)n_Counter);另外一个值得注意的问题是,STM32 的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。
STM32 16位定时器对正交编码器计数的方法(附检测输入脉冲的方法)发布时间:2009-10-04 14:29:11今天决定在END开博,之前没有工作记录的习惯,从今天起在这里记录下自己工作时的点滴经验,以供日后参考以及与网络朋友交流。
第一篇文章先简要描述下STM32 定时器对正交编码器进行计数控制的方法。
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。
通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:void Encoder_Configration(void){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;//PC6 A相PC7 B相GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);/* Enable the TIM3 Update Interrupt *//*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRI ORITY;NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);*//* Timer configuration in Encoder mode */TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescalingTIM_TimeBaseStructure.TIM_Period = 10000;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;TIM_ICInit(TIM8, &TIM_ICInitStructure);// Clear all pending interruptsTIM_ClearFlag(TIM8, TIM_FLAG_Update);TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);//Reset counterTIM2->CNT = 0;TIM_Cmd(TIM8, ENABLE);}n_Counter = TIM_GetCounter(TIM8);Diled_Disp_Num((float)n_Counter);另外一个值得注意的问题是,STM32 的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。
stm32编码器工作原理
STM32编码器的工作原理以下几个方面来进行讲解:
1. 编码器介绍:编码器是一种测量旋转运动的装置,能够将旋转角度转换为电信号输出。
2. 工作原理:STM32编码器工作原理基于两个光电传感器和
一个光栅带的相互作用。
光栅带上有一定数量的黑白条纹,两个光电传感器分别测量这些条纹的变化。
3. 接口模式:STM32编码器可以通过两种接口模式进行工作,分别是增量式和绝对式。
增量式编码器输出的是脉冲信号,而绝对式编码器输出的是相对位置数据。
4. 编码方式:STM32编码器可以通过两种编码方式进行工作,分别是光电和磁电编码。
光电编码器利用光电传感器对光栅带上的黑白条纹进行测量,而磁电编码器则利用磁场对磁栅带进行测量。
5. 编码器的应用:STM32编码器广泛应用于机器人、航空航天、汽车零部件和工控设备等领域,用于测量旋转运动的角度和速度。
总结:STM32编码器通过光电或磁电传感器对光栅带或磁栅
带上的黑白条纹进行测量,将旋转运动转换为电信号输出,并通过增量或绝对方式输出相对位置数据或脉冲信号。
它具有精
度高、响应速度快、可靠性强等优点,在许多领域中都有广泛的应用。
stm32差分编码器编程实例
当使用 STM32 微控制器编程时,可以通过外部差分编码器来实现位置或速度的测量。
下面是一个简单的 STM32 差分编码器编程实例,以帮助您了解如何进行编程:
1. 首先,确保您已经正确连接了差分编码器到 STM32 微控制器的外部引脚。
通常,差分编码器会有两个输出信号通道(通常称为 A 和 B 通道),以及一个用于指示方向的 Z 通道。
2. 在 STM32 的开发环境中,创建一个新的工程,并选择适当的 STM32 型号。
3. 在工程中,将差分编码器的 A 和 B 通道连接到 STM32 的两个外部中断引脚(例如 EXTI0 和 EXTI1)。
4. 在工程中,将差分编码器的 Z 通道连接到 STM32 的另一个外部中断引脚(例如 EXTI2)。
5. 在代码中,启用外部中断功能,并配置外部中断触发方式为上升沿或下降沿触发。
6. 在外部中断的中断处理函数中,编写代码来处理差分编码器的输出信号变化。
根据差分编码器的工作原理,每当 A 或 B 通道的信号变化时,都会触发外部中断。
您可以在中断处理函数中根据A 和 B 通道的状态变化来判断编码器的旋转方向,并相应地更新位置或速度的计数器。
7. 如果需要使用 Z 通道来确定编码器的起始位置,您可以在Z 通道的中断处理函数中重置位置或速度的计数器。
8. 在主程序中,您可以使用位置或速度的计数器值来执行相应的操作,例如控制电机或执行其他任务。
需要注意的是,具体的差分编码器编程实例可能会根据使用的STM32 型号和开发环境有所不同。
因此,您可以参考 STM32 的官方文档和相关的编程手册来获取更详细的信息和示例代码。
stm32速度估计与滤波方法STM32速度估计与滤波方法在许多应用中,需要对旋转物体的速度进行估计和控制。
例如,电机控制系统和运动控制系统均需要速度估计。
在STM32微控制器中,可以使用编码器、计数器和定时器等工具来进行速度测量。
本文将介绍如何在STM32上使用这些工具进行速度估计,并讨论如何使用滤波方法来积极地消除速度测量中的噪声。
1. 编码器编码器是用于测量电机或运动部件转动角度和速度的传感器。
STM32可以使用两种类型的编码器:增量编码器和绝对编码器。
增量编码器列有两个输出:A 相和 B 相。
当电机或运动部件旋转时,这些输出发出周期波形。
可以通过极限速度和跟踪极限计数器的变化来测量转速。
绝对编码器输出一个数字编码,用于表示电机或运动部件旋转的位置和方向。
当旋转时,这个数字编码发生变化。
可以使用定时器输入捕捉模式、外部中断或通过读取GPIO端口来测量转速。
2. 计数器计数器是用于计算某个事件的数量的工具。
在STM32中,计数器可以计算定时器引脚的脉冲数量。
此外,当与编码器结合使用时,它可以计数编码器输出脉冲的数量。
计数器可以使用定时器输入捕捉模式、外部中断或通过读取GPIO 端口来测量转速。
3. 定时器在STM32中,定时器可以用于测量编码器输出脉冲的时间间隔,进而计算转速。
定时器可以使用输入捕获模式测量脉冲的时间间隔。
在输入捕获模式下,当定时器计数器与特定的定时器引脚上的脉冲的时间间隔到达设置值时,将捕获计数器值。
可以使用这些捕获计数器值来测量时间间隔,并计算速度。
4. 滤波方法在进行速度测量时,可能会受到噪声的干扰。
为了避免噪声对测量结果的影响,可以使用滤波方法来平滑噪声信号。
常用的滤波方法包括低通滤波器、中值滤波器和卡尔曼滤波器。
低通滤波器通过滤除高频噪声信号来平滑信号。
可以将一阶低通滤波器实现为RC电路。
另一个常用的低通滤波器是Butterworth滤波器。
中值滤波器通过计算信号中的中值来平滑信号。
STM32的PWM调节转速原理主要基于PWM(Pulse Width Modulation)脉冲宽度调制。
通过编程控制输出方波的频率和占空比(高低电平的比例),可以实现对电机转速的控制。
在直流电机驱动中,PWM调速的基本原理是通过控制电机通电的电压来实现转速的调节。
当提高电压时,反电势升高,进而转速升高。
因此,通过控制PWM信号的占空比,可以实现对电机通电电压的调节,从而控制电机的转速。
在STM32中,可以通过定时器产生PWM信号,并通过调节占空比来控制电机的转速。
具体实现方式如下:
1.设置定时器工作模式为PWM模式,并配置相应的PWM通道和占空比。
2.根据需要调节占空比的值,以控制电机通电的电压。
3.将PWM信号输出到电机驱动器,从而实现对电机转速的控制。
需要注意的是,具体的PWM调速实现方式可能会因电机的类型、驱动器的型号等因素而有所不同。
因此,在实际应用中,需要根据具体情况进行相应的调整和配置。
标题:STM32编码器4倍频原理目录1. STM32编码器接口简介2. 编码器的工作原理和应用3. STM32编码器4倍频原理4. STM32编码器4倍频的优势5. 结论1. STM32编码器接口简介STM32系列微控制器是由意法半导体推出的一类MCU产品,具有丰富的外设和强大的性能。
其中,编码器接口是STM32微控制器常见的外设之一,主要用于连接编码器传感器,实现位置或速度的测量和控制。
STM32编码器接口通常包含两个通道(A相和B相)和一个索引信号(Z 相),用于测量编码器的旋转角度和速度。
STM32还提供了丰富的编码器接口工作模式和配置选项,以满足不同应用场景的需求。
2. 编码器的工作原理和应用编码器是一种用于测量旋转角度和速度的传感器,常见的编码器类型包括光电编码器和磁性编码器。
编码器的工作原理是利用编码盘上的光、电、磁信号来生成对应的数字脉冲输出,从而实现旋转角度和速度的测量。
在工业控制和自动化领域,编码器被广泛应用于电机位置控制、轴位移测量和运动控制等领域。
特别是在闭环控制系统中,编码器可以提供准确的位置反馈信号,从而实现精准的位置控制和运动控制。
3. STM32编码器4倍频原理在STM32微控制器中,编码器接口提供了多种工作模式和编码器计数模式。
其中,4倍频模式是一种常用的编码器计数模式,可以有效提高编码器的分辨率和测量精度。
在4倍频模式下,编码器接口可以将编码器信号的脉冲数量扩大4倍输出给微控制器的定时器,从而实现对编码器脉冲数量的有效倍增。
通过4倍频模式,可以在不改变编码器硬件结构的情况下,有效提高编码器的分辨率和灵敏度。
4. STM32编码器4倍频的优势使用STM32编码器4倍频模式具有以下优势:a. 提高分辨率:通过4倍频模式,可以将编码器信号的脉冲数量扩大4倍输出给微控制器的定时器,从而提高了编码器的分辨率和测量精度。
b. 提高灵敏度:4倍频模式可以将编码器的脉冲信号有效放大,从而提高了编码器的灵敏度和反馈精度,在闭环控制系统中具有重要作用c. 保持硬件兼容性:使用4倍频模式可以在不改变编码器硬件结构的情况下,有效提高了编码器的性能,同时保持了硬件的兼容性和稳定性。
STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。
通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:void Encoder_Configration(void){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;//PC6 A相PC7 B相GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Prescaler =0x0; // No prescalingTIM_TimeBaseStructure.TIM_Period =10000;TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM8,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter =6;//ICx_FILTER;TIM_ICInit(TIM8,&TIM_ICInitStructure);// Clear all pending interruptsTIM_ClearFlag(TIM8, TIM_FLAG_Update);TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);//Reset counterTIM2->CNT = 0;TIM_Cmd(TIM8, ENABLE);}n_Counter = TIM_GetCounter(TIM8);Diled_Disp_Num((float)n_Counter);另外一个值得注意的问题是,STM32的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。
STM32定时器配置为编码器模式(转)⽂章⽬录⼀、编码器原理⼆、为什么要⽤编码器三、STM32编码器配置相关四、STM32实战代码五、⼀些注意参考⼀、编码器原理如果两个信号相位差为90度,则这两个信号称为正交。
由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断⽅向、根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前⾏⾛的距离、如果再加上定时器的话还可以计算出速度。
⼆、为什么要⽤编码器从上图可以看出,由于TI,T2⼀前⼀后有个90度的相位差,所以当出现这个相位差时就表⽰轮⼦旋转了⼀个⾓度。
但有⼈会问了:既然都是脉冲,为什么不⽤普通IO中断?实际上如果是轮⼦⼀直正常旋转当然没有问题。
仔细观察上图,如果出现了⽑刺呢?这就是需要我们在软件中编写算法进⾏改正。
于是,我们就会想到如果有个硬件能够处理这种情况那不是挺好吗?对应的硬件的编码器就来了~我们看到STM32的硬件编码器还是很智能的,当T1,T2脉冲是连续产⽣的时候计数器加⼀或减⼀⼀次,⽽当某个接⼝产⽣了⽑刺或抖动,则计数器计数不变,也就是说该接⼝能够容许抖动。
在STM32中,编码器使⽤的是定时器接⼝,通过数据⼿册可知,定时器1,2,3,4,5和8有编码器的功能,⽽其他没有。
同时只有CH1和CH2是进⾏编码器模式的~三、STM32编码器配置相关编码器输⼊信号TI1,TI2经过输⼊滤波,边沿检测产⽣TI1FP1,TI2FP2接到编码器模块,通过配置编码器的⼯作模式,即可以对编码器进⾏正向/反向计数。
⽐如如果⽤的是定时器2,则对应的引脚是在PA0和PA1上。
通常为了提⾼精度我们会选择在上升沿和下降沿都进⾏计数!还有⼀个⾮常重要的图这⾥也记录下其中让⼈费解的应该是在第⼆列的相对信号的电平,这⾥就来详细谈⼀下吧。
其实也不难理解哈,我们上⾯也说了通常为了提⾼精度会在A、B两相的上升沿和下降沿都进⾏计数,那么对应在⼀个周期就可以计数四次,计数次数的增加也就意味着精度的提⾼!编码器模式下,如果此时处于正转,那么这四次计数应该都是加的。
STM32 GPIO速度,模式等理解一、</>GPIO模式配置1、输入/输出模式(参考stm32手册)2、GPIO输出模式下,几种速度的区别:(1). GPIO 引脚速度:GPIO_Speed_2MHz (10MHz, 50MHz) ;又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
)可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。
(如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。
失真因素?)如果信号频率为10MHz,而你配置了2MHz的带宽,则10MHz的方波很可能就变成了正弦波。
就好比是公路的设计时速,汽车速度低于设计时速时,可以平稳地运行,如果超过设计时速就会颠簸,甚至翻车。
关键是:GPIO的引脚速度跟应用相匹配,速度配置越高,噪声越大,功耗越大。
带宽速度高的驱动器耗电大、噪声也大,带宽低的驱动器耗电小、噪声也小。
使用合适的驱动器可以降低功耗和噪声比如:高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。
关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。
比如:</>①</>USART串口,若最大波特率只需115.2k,那用2M的速度就够了,既省电也噪声小。
</>②</>I2C接口,若使用400k波特率,若想把余量留大些,可以选用10M的GPIO引脚速度。
</>③</>SPI接口,若使用18M或9M波特率,需要选用50M的GPIO的引脚速度。
(2). GPIO的翻转速度指:输入/输出寄存器的0 ,1 值反映到外部引脚(APB2上)高低电平的速度.手册上指出GPIO最大翻转速度可达18MHz。
原子哥,小弟第一次发帖子求救。
我用编码器测电机角速度 当电机速度2000RPM 时显示转速为0,电机从静止到额定转速,STM32测出转速如图
:
我的源码:
[C] 纯文本查看 复制代码
?
1
02 03 04 05 06 07 08 09
1
1
int main() { Stm32_Clock_Init(9);//系统时钟设置 delay_init(72); //延时初始化 PID_Oline_init(0,0,0); //PID 在线调参初始化 delay_ms(200); Timer2_Init(1000,719); //定时器2 定时器10ms 中断 TIM4PWM_Init(1000,0); //定时器4 PWM B8输出 Encoder_Init(); //定时器3 编码器初始化 while(1); }
12
[C] 纯文本查看 复制代码
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 2void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001)//溢出中断
{
////////////////获得电机角速度///////////////////////////////////////////////////////////////////////////////////////
old_Encoder_Angle=Encoder_Angle;
Encoder_Angle=TIM3->CNT*360/179
2; //从编码器获得角度 一圈1792脉冲
Encoder_Angle_Speed=(int)(Encoder_Angle+360-old_Enco der_Angle)%360; //角度转化为角速度
////////////////均值得平均速度/////////////////////////////////////////////////////////////////////////////////////////////
for(timer_i=0;timer_i<21;timer_i+
+)
speed_data_buf[timer_i]=speed_data_buf[timer_i+1];
speed_data_buf[21]=Encoder_Angle_Speed;
filter_res=mean_filter(speed_data_buf);
Encoder_Angle_Speed=filter_res;
////////////////求得PID 数据并发送上位机////////////////////////////////////////////////////////////////////////////////////////// PID_Get_Err(&filter_res,&Goa
l); //获取角速度以及角加速度
PID_res=PDCtrl_Res
(); //得到输出值
TIM4->CCR3=PID_re
s; //输出给电机
Do_send_PIDOL(&Goal,&Encoder_Angle_Speed,&PID_re s); //发送给上位
机
}
TIM2->SR&=~(1<<0);//清除中断标志位
2
1
2
2
[C] 纯文本查看 复制代码
?
1
2
03 04 05 06 07 08 09 10 11 12 13 14 15 1
6
1
7
1
8
void Encoder_Init(void) { RCC->APB1ENR|=1<<1; //TIM3时钟使能 RCC->APB2ENR|=1<<2; //使能PORTA 时钟 GPIOA->CRL&=0XF0FFFFFF;//PA6 GPIOA->CRL|=0X04000000;//浮空输入 GPIOA->CRL&=0X0FFFFFFF;//PA7 GPIOA->CRL|=0X40000000;//浮空输入 TIM3->PSC = 0x0;//预分频器 TIM3->ARR = 1792-1;//设定计数器自动重装值 TIM3->CR1 &=~(3<<8);// 选择时钟分频:不分频 TIM3->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式 TIM3->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1 TIM3->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2 TIM3->CCER &= ~(1<<1);//CC1P='0' IC1FP1不反相,IC1FP1=TI1 TIM3->CCER &= ~(1<<5);//CC2P='0' IC2FP2不反相,IC2FP2=TI2 TIM3->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效 TIM3->CNT = 0; //初始值 TIM3->CR1 |= 0x01; //CEN=1,使能定时器 }
9
2
2
1
2
2
10ms电机最多转0.333圈,而且把定时器中断时间缩小也会有类似问题
TIM3的编码器输入引脚是PA6和PA7,如果使用PC6和PC7,要使能引脚重映射。
STM32的定时器引脚如果接编码器,只能接到TIMx_CH1和TIMx_CH2上,可以实现向上向下计数,寄存器中有表示当前编码器方向的bit 位DIR。