STM32C8T6 编码电机测速代码示例 - 定时器中断读取速度
#include "stm32f10x.h" #include "stm32f10x_tim.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h"
#define MOTOR_ENCODER_TIM TIM4 #define MOTOR_ENCODER_TIM_IRQn TIM4_IRQn #define MOTOR_ENCODER_TIM_RCC RCC_APB1Periph_TIM4 #define MOTOR_ENCODER_GPIO_RCC RCC_APB2Periph_GPIOB #define MOTOR_ENCODER_GPIO GPIOB #define MOTOR_ENCODER_PIN1 GPIO_Pin_6 #define MOTOR_ENCODER_PIN2 GPIO_Pin_7
volatile int32_t motor_velocity = 0;
void Motor_Encoder_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(MOTOR_ENCODER_TIM_RCC, ENABLE);
RCC_APB2PeriphClockCmd(MOTOR_ENCODER_GPIO_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = MOTOR_ENCODER_PIN1 | MOTOR_ENCODER_PIN2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(MOTOR_ENCODER_GPIO, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(MOTOR_ENCODER_TIM, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(MOTOR_ENCODER_TIM, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6;
TIM_ICInit(MOTOR_ENCODER_TIM, &TIM_ICInitStructure);
TIM_Cmd(MOTOR_ENCODER_TIM, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = MOTOR_ENCODER_TIM_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_SetCounter(MOTOR_ENCODER_TIM, 0);
TIM_ITConfig(MOTOR_ENCODER_TIM, TIM_IT_Update, ENABLE);
}
void TIM4_IRQHandler(void) { if (TIM_GetITStatus(MOTOR_ENCODER_TIM, TIM_IT_Update) != RESET) { int16_t encoder_count = TIM_GetCounter(MOTOR_ENCODER_TIM); motor_velocity = encoder_count; TIM_SetCounter(MOTOR_ENCODER_TIM, 0); TIM_ClearITPendingBit(MOTOR_ENCODER_TIM, TIM_IT_Update); } }
int main(void) { Motor_Encoder_Config();
// 初始化定时器,设置定时中断
// ...
while (1)
{
// 在这里处理其他任务
}
}
/* 代码说明:
-
- Motor_Encoder_Config 函数配置编码电机定时器和 GPIO 引脚。
-
- TIM4_IRQHandler 中断处理函数,通过 TIM_GetCounter 获取编码器的脉冲数,并将其赋值给 motor_velocity 变量。
-
- 在主循环中可以读取 motor_velocity 变量来获取当前电机速度。
-
注意:
-
- 以上代码示例仅供参考,实际应用中可能需要进行一些额外的配置和调整,例如定时器的时钟分频和定时中断的频率等。
-
- 还需要根据具体的电机和编码器进行适当的配置。 */
原文地址: https://www.cveoy.top/t/topic/lTY 著作权归作者所有。请勿转载和采集!