这里是使用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); }?? ?
|