STM32 BLDC无刷直流电机 HALL霍尔硬件接口 程序

这里是使用STM32F103系列,其他型号可能略有区别

1.首先HALL的IO口初始化

2.硬件HALL接口初始化

3.检测到hall信号变化会触发TIM5中断,中断处理进行电机换向

void HALL_IO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStre;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

    GPIO_InitStre.GPIO_Pin=HALL_U_Pin|HALL_V_Pin|HALL_W_Pin;
    GPIO_InitStre.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
    GPIO_InitStre.GPIO_Speed=GPIO_Speed_10MHz;
    GPIO_Init(GPIOA,&GPIO_InitStre);    
}
/**********************************************************************/
//名称:void HALL_InterIO_Init(void)
//功能:HAll信号外部中断初始化
//参数:无
//返回:无
/**********************************************************************/
void HALL_InterIO_Init(void)
{
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    HALL_IO_Init();//Hall IO基本初始化
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
    //不用初始化定时器
    //CC1S=01     选择输入端 IC1映射到TI1上
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;// 注意只有一个通道|TIM_Channel_2|TIM_Channel_3;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;//双边沿触发
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置输入分频,不分频 
  TIM_ICInitStructure.TIM_ICFilter = 0x04;//滤波器
    TIM_ICInit(TIM5,&TIM_ICInitStructure);  

  /* 配置TIM为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
    
    TIM_SelectHallSensor(TIM5,ENABLE);                          //使能TIMx的霍尔传感器接口,同时异或映射
  TIM_SelectInputTrigger(TIM5, TIM_TS_TI1F_ED);                   //输入触发源选择    
  
    TIM_SelectSlaveMode(TIM5, TIM_SlaveMode_Reset);                 //从模式选择为复位模式
  TIM_SelectMasterSlaveMode(TIM5, TIM_MasterSlaveMode_Enable);    //主从模式选择 使能
   /* 允许更新中断 ,允许CC1IE捕获中断     */
  TIM_ITConfig(TIM5, TIM_IT_Trigger, ENABLE);//
  /* 使能定时器 */
//  TIM_Cmd(TIM5, ENABLE);
  TIM_ClearITPendingBit(TIM5,TIM_IT_Trigger);//清除触发中断标志
}

/**********************************************************************/
//名称:void EXTI15_10_IRQHandler(void)
//功能:Hall TIM5输入捕获中断服务函数
//参数:无
//返回:无
/**********************************************************************/
void TIM5_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM5,TIM_IT_Trigger)!=RESET)
    {
        HAll_ChangePhase();//电机换相
    }
    TIM_ClearITPendingBit(TIM5,TIM_IT_Trigger);
}    

上一篇:BLDC控制实验:方波、霍尔、开环、定速、正转


下一篇:【机械自动化】BLDC驱动器ESC