一个项目需要对电机闭环控制,采用的霍尔编码电机。

本来用的STM32F103ZET6,然后不知道咋回事芯片发热烧坏了,然后正好有一批STM32F207ZET6,对比了下IO口发现一样,就直接干上去了,干上去后发现3.3和GND处于短路状态,开始怀疑是3.3V电压出问题了,就把3.3V供电部分全部拆除了,发现还是短路,就又把芯片引脚仔细对了一遍,发现供电引脚有几个对不上。如下图


由于VSS和VDD芯片能不是相连的,所以少一路供电应该问题不大,就直接把这几个引脚掰断干上去了,烧下测试代码,成功运行,至此换芯片结束。
代码部分直接换库文件,移植过程还算简单。
但当调到编码器时,一直没有读数。一度怀疑是不是掰断那几个引脚引起的问题,无奈之下用STM32CubeMX生成的代码测试一下,发现可以正常读数,遂排除了硬件问题。然后对比发现了问题
调整前的代码
GPIO_PinAFConfig(GPIOA,GPIO_Pin_9,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_Pin_10,GPIO_AF_4);
调整后的代码
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_4);
void Encoder3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TIM3_CH1_PIN | TIM3_CH2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(TIM3_CH1_GPIO, &GPIO_InitStructure);
//引脚映射
GPIO_PinAFConfig(TIM3_CH1_GPIO, GPIO_PinSource6, GPIO_AF_TIM3);
GPIO_PinAFConfig(TIM3_CH1_GPIO, GPIO_PinSource7, GPIO_AF_TIM3);
//定时器设置
TIM_DeInit(TIM3);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0; //时钟分频
TIM_TimeBaseStructure.TIM_Period = 65535;//计数器最大值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;// 时钟分频:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化计时器
//编码器模式设置
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising , TIM_ICPolarity_Rising );
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 15;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM3, ENABLE);
}
评论 (0)