stm32f103测脉冲数用于带霍尔编码器的电机测速

本文介绍如何在STM32F103中使用EXTI模块捕获电机霍尔编码器信号,配合TIM定时器实现精确转速测量,解决多电机速度计数问题,包括GPIO配置、中断处理和定时器计时方法。
    在使用带霍尔编码器的电机时,需要捕获脉冲,来达到测电机的转速的目的,捕获脉冲的方式有很多,我刚开始选用的是定时器捕获,后因需要测度多个电机的速度,STM32F103的定时器感觉不够用,所以选择EXTI以达到捕获高电平的目的,再用TIM定时器中断计时。
   以下为EXTI配置
/* Data defien ---------------------------------------------------------------------------------------*/
uint16_t motor_1_At = 0;	//电机A相的脉冲数
uint16_t motor_1_Bt = 0;   //电机B相的脉冲数
uint16_t speed_motor_1;         //电机的转速

/***
  * @name speed_measure()
  * @brief
  * @param NONE
  * @retval NONE
  */
void speed_measure_extix(void) 
{
   
   
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOD, ENABLE);     //使能PORTA,PORTE时钟 
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                  //motor_1_A-->PG9
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOG, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8
使用STM32F103RCT6通过霍尔编码器量双驱动电机速度,可按以下步骤实现: ### 开启对应外设时钟 要保证定时器和GPIO的时钟开启。对于编码器测速,需开启定时器和GPIO的时钟。若使用TIM3和GPIOA,代码如下: ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); ``` 这里开启了TIM3的时钟和GPIOA的时钟,因为编码器信号通常连接到GPIOA上,而TIM3用于处理编码器信号 [^2]。 ### 配置编码器两个信号的GPIO 将编码器的两个信号连接到对应的GPIO引脚上,并且配置为上拉输入模式。示例代码如下: ```c GPIO_InitTypeDef GPIO_InitStructure1; GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure1); ``` 此代码将GPIOA的6号和7号引脚配置为上拉输入模式,用于接收编码器的两个信号 [^2]。 ### 配置时基单元 配置定时器的时基单元,使其工作在编码器模式。这部分代码可根据实际需求进行调整。 ### 配置定时器工作在编码器模式 将定时器配置为编码器模式,以处理编码器信号。STM32F103RCT6内置了多达4个可同步运行的标准定时器(TIM2、TIM3、TIM4和TIM5),任一标准定时器都能用于处理编码器信号 [^1]。 ### 读取编码器计数值 通过读取定时器的计数值,可得到电机的旋转脉冲数。根据脉冲数和时间间隔,就能计算出电机的速度。 ### 速度计算 根据编码器返回的脉冲数和时间间隔,利用公式计算电机的速度。由于速度PID是根据编码器返回值与设定的脉冲频率相比较,通过增大输出PWM值来使电机驱动电压增大,转速加快,继而使得编码器返回值趋于设定的脉冲频率值,从而实现速度PID控制 [^3]。 ### 双电机处理 对于双驱动电机,需要分别对两个电机的编码器信号进行处理。可使用不同的定时器和GPIO引脚来连接两个电机的编码器,重复上述步骤完成两个电机速度的量。 ### 示例代码框架 ```c #include "stm32f10x.h" // 编码器初始化函数 void Encoder_Init(void) { // 开启时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置GPIO GPIO_InitTypeDef GPIO_InitStructure1; GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure1); // 配置定时器时基单元和编码器模式 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_EncoderInterfaceConfigTypeDef TIM_EncoderInterfaceConfig; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig.TIM_EncoderMode = TIM_EncoderMode_TI12; TIM_EncoderInterfaceConfig.TIM_IC1Polarity = TIM_ICPolarity_Rising; TIM_EncoderInterfaceConfig.TIM_IC2Polarity = TIM_ICPolarity_Rising; TIM_EncoderInterfaceConfig(TIM3, &TIM_EncoderInterfaceConfig); TIM_Cmd(TIM3, ENABLE); } // 读取编码器计数值 int16_t Read_Encoder(void) { return TIM_GetCounter(TIM3); } int main(void) { Encoder_Init(); while (1) { int16_t encoder_value = Read_Encoder(); // 在这里进行速度计算 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Orange--Lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值