这里是使用STM32F103系列,其他型号可能略有区别
设置步骤:
1.首先HALL的IO口初始化
2.硬件HALL接口初始化
3.检测到hall信号变化会触发TIM5中断,中断处理进行电机换向
重点分析:
xx.TIM_Channel = TIM_Channel_1;是通道选择,这里只有通道1,也只能选择通道1,因为1/2/3通道最后都只能异或到通道1上,没有其他选择
xx.TIM_ICSelection = TIM_ICSelection_TRC;选择触发捕获,1/2/3通道被连在一起
TIM_SelectInputTrigger(TIM5, TIM_TS_TI1F_ED); //输入触发源选择,选择通道1
xx.TIM_ICFilter = 0x04;//重点说一下滤波器,数据手册上解释的不够清楚,这里TIM5的时钟频率是84MHz,1个周期时间=1/84 ns;如果TIM_ICFilter=0,说明采样一个周期的信号就作为有效判断信号,例如前一刻IN=0,下一刻IN=1,这时开始捕获电平,那捕获多长时间作为有效判断呢,这个参数就是决定这个的,如果设定上升沿有效,TIM_ICFilter=0说明只需要采集1个周期(1/84 ns)的电平信号就来判断是否是上升沿,如果TIM_ICFilter=8那就是采集8*1/81 ns这么长时间再判断是否有上升沿,如果中间有一次电平不一样,则重新采样计数,知道连续8次的电平一样才作为判断依据;
滤波器其实是为了抗干扰,因为会有电磁干扰进入引脚,就相当于按键的多次计数软件滤波
另外说明:使用定时器5计数溢出中断,这个是为了计算hall跳变换相时间间隔,用来计算速度
代码分享:
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);
//初始化定时器 84MHz
TIM_TimeBaseInitStre.TIM_Prescaler=84-1;//1MHz
TIM_TimeBaseInitStre.TIM_Period=0xFFFF-1;//计数65535=65.535ms
TIM_TimeBaseInitStre.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStre.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStre.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStre);
//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_ClearITPendingBit(TIM5,TIM_IT_Trigger);//清除触发中断标志
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//使能溢出中断
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);//清除中断
TIM_ARRPreloadConfig(TIM5,ENABLE);//自动装载
TIM_Cmd(TIM5, ENABLE);//使能
}
/**********************************************************************/
//名称: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);
}
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
{
Count++;//溢出次数
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)