可靠的MCU伙伴
Design for Reliability
全国服务咨询热线
0757-8185 9361

SWM20x系列电机框架搭建:TIMR_HALL篇


霍尔接口

TIMER0模块提供了HALL接口功能,能够自动记录脉冲变化间隔,并产生中断。使用方式如下:

HALL功能为指定引脚,且不同封装可能有所差异,具体引脚详见管教排布:

配置PORTCON模块中INEN寄存器使能引脚输入功能

通过PORT_SEL寄存器将引脚切换为HALL功能

配置HALLSR寄存器,设置对应HALL输入信号的原状态

配置TIMER0装载值寄存器(LDVALx

使能HALL模式控制寄存器中输入HALL信号触发使能位(HALLEN

清除输入HALL信号触发中断的状态(HALLIF

使能HALL中断(HALLIE

TIMER0使能(EN

当外部HALL_X引脚产生指定电平变化时,将(计数器加载值-计数器当前值)的结果保存到寄存器HALLDR中,计数器复位到加载值重新计数,并产生TIMER中断。同时HALLIF寄存器IFx将产生对应标示位,标识对应引脚产生电平变化。

Hall0hall1hall2HALL功能的三个输入引脚,任意一个HALL引脚上出现跳变沿时,将(计数器加载值-计数器当前值)的结果保存到寄存器HALLDR中,并且计数器复位到加载值重新计数。HALL0~2信号输入同时支持连接至CMP0~2,可通过ACMPCR2寄存器HALLx位配置,可选择为CMPxOUT引脚或者HALLIO引脚。

中断配置与清除

每路TIMER均具备独立中断,通过中断使能寄存器IE进行各TIMER中断使能。通过中断状态寄存器IF进行中断查询及清除。

TIMER中断

可通过配置中断使能寄存器IEx相应位使能中断。当检测到中断触发条件时,中断标志寄存器IFx相应位中置1。如需清除此标志,需在相应标志位中写1清零(R/W1C),否则中断在开启状态下会一直进入。

HALL中断

可通过配置HALL模式控制寄存器对应位设置输入HALLx信号触发中断的条件:上升沿、下降沿、上升沿和下降沿。可通过配置HALL中断使能寄存器HALLIE相应位使能中断。当检测到中断触发条件时,HALL中断标志寄存器HALLIF相应位中置1。如需清除此标志,需在相应标志位中写1清零(R/W1C),否则中断在开启状态下会一直进入。

程序中配置如下:

void Motor_hall(void)

{   

    PORT_Init(PORTB, PIN4, PORTB_PIN4_HALL_IN0, 1);        //连接PB4

    PORT_Init(PORTB, PIN5, PORTB_PIN5_HALL_IN1, 1);        //连接PB5

    PORT_Init(PORTB, PIN6, PORTB_PIN6_HALL_IN2, 1);        //连接PB6

    PORTB->PULLU |= ((1 << PIN4) | (1 << PIN5) | (1 << PIN6));    //上拉使能

   

    TIMR_Init(TIMR0, TIMR_MODE_TIMER, CyclesPerUs*4, 65536, 0);        //最大测量脉宽4us*65536 = 262ms

    TIMRG->HALLEN = 1;      //HALL模式控制

    TIMRG->HALLIF = 7;       //HALL中断状态

    TIMRG->HALLIE = 1;      //HALL中断使能

    NVIC_EnableIRQ(HALL_IRQn);    //设置中断优先级

    TIMR_Start(TIMR0);

}

//霍尔检测中断

void HALL_Handler(void)

{

    TIMRG->HALLIF = 7;            //清除中断

   

    printf("%dus\r\n", TIMRG->HALLSR);   //输出霍尔值

}

使用TIMRG->HALLSR可获取当前霍尔值。