新手入门
- 积分
- 9
- 金钱
- 9
- 注册时间
- 2025-3-23
- 在线时间
- 2 小时
|
4金钱
本帖最后由 是你黑哥啊 于 2025-4-12 23:27 编辑
使用stm32f4最小系统板,配置了两个定时器来读两个编码器的值遇到问题。编码器是轮趣科技的MG513XP28电机上自带的霍尔编码器,驱动板是轮趣科技的D153C。我再配置TIM8,PC6、PC7引脚读电机1的编码值是可以读取的,但是我试了TIM1、TIM3、TIM9都读不出电机2的编码值,初始化的代码都是从TIM8上复制过来改的。然后我试了将电机二的线接在电机一的引脚上,发现可以读取电机二的,这就证明不是线的问题,也不是驱动板的问题、也不是电机编码器的问题,就是引脚配置问题,但是我已经换了几个复用的引脚就是不行。下面附上原码,希望有佬可以解答!//读电机2(注释可以不用管)
void TIM1_Int_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct = {0};
TIM_ICInitTypeDef TIM_ICInitStruct = {0};
// 1. 使能时钟(TIM8属于APB2总线)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
// 2. GPIO配置(PC6=TIM8_CH1, PC7=TIM8_CH2)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用功能模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻[5,12](@ref)
GPIO_Init(GPIOE, &GPIO_InitStruct);
// 3. 引脚复用映射
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_TIM1); // PC6复用为TIM8_CH1
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_TIM1); // PC7复用为TIM8_CH2
// 4. 定时器基础配置
TIM_TimeBaseStruct.TIM_Prescaler = 0;
TIM_TimeBaseStruct.TIM_Period = 0xFFFF;
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStruct);
// 5. 编码器接口配置
TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
// 6. 输入捕获滤波
TIM_ICInitStruct.TIM_ICFilter = 6; // 参数与TIM9保持一致[12](@ref)
TIM_ICInit(TIM1, &TIM_ICInitStruct);
// 7. 启动定时器
TIM_Cmd(TIM1, ENABLE);
}
//读电机1
void TIM8_Int_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct = {0};
TIM_ICInitTypeDef TIM_ICInitStruct = {0};
// 1. 使能时钟(TIM8属于APB2总线)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
// 2. GPIO配置(PC6=TIM8_CH1, PC7=TIM8_CH2)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用功能模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻[5,12](@ref)
GPIO_Init(GPIOC, &GPIO_InitStruct);
// 3. 引脚复用映射
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8); // PC6复用为TIM8_CH1
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM8); // PC7复用为TIM8_CH2
// 4. 定时器基础配置
TIM_TimeBaseStruct.TIM_Prescaler = 0;
TIM_TimeBaseStruct.TIM_Period = 0xFFFF;
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStruct);
// 5. 编码器接口配置
TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
// 6. 输入捕获滤波
TIM_ICInitStruct.TIM_ICFilter = 6; // 参数与TIM9保持一致[12](@ref)
TIM_ICInit(TIM8, &TIM_ICInitStruct);
// 7. 启动定时器
TIM_Cmd(TIM8, ENABLE);
}
//读编码值
int Read_Encoder(u8 TIMX)
{
int Encoder_TIM;
switch(TIMX)
{
case 1: Encoder_TIM= (short)TIM1 -> CNT; TIM1 -> CNT=0;break;
case 8: Encoder_TIM= (short)TIM8 -> CNT; TIM8 -> CNT=0;break;
default: Encoder_TIM=0;
}
// if(Encoder_TIM<0) Encoder_TIM=-Encoder_TIM;
return Encoder_TIM;
}
|
|