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