使用通用定时器TIM4输入捕获获取hall的状态。
/* 霍尔传感器定时器 */
#define HALL_TIM TIM4
#define HALL_TIM_CLK_ENABLE() do{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);}while(0)
#define HALL_AFIO_ENABLE() do{RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);\
GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);\
}while(0)
/* 累计 TIM_Period个后产生一个更新或者中断
当定时器从0计数到65534,即为65535次,为一个定时周期 */
#define HALL_PERIOD_COUNT (0xFFFF)
/* 高级控制定时器时钟源TIMxCLK = HCLK = 72MHz
设定定时器频率为 = TIMxCLK/HALL_PERIOD_COUNT/HALL_PRESCALER_COUNT=9.98Hz
周期 T = 100 ms */
#define HALL_PRESCALER_COUNT (110)
/* TIM4 通道 1 引脚 */
#define HALL_U_PIN GPIO_Pin_12
#define HALL_U_GPIO_PORT GPIOD
#define HALL_U_GPIO_CLK_ENABLE() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE)
/* TIM4 通道 2 引脚 */
#define HALL_V_PIN GPIO_Pin_13
#define HALL_V_GPIO_PORT GPIOD
#define HALL_V_GPIO_CLK_ENABLE() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE)
/* TIM4 通道 3 引脚 */
#define HALL_W_PIN GPIO_Pin_14
#define HALL_W_GPIO_PORT GPIOD
#define HALL_W_GPIO_CLK_ENABLE() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE)
#define HALL_TIM_IRQn TIM4_IRQn
#define TIM_COM_TS_ITRx TIM_TS_ITR0 // 内部触发配置(TIM4->ITR0->TIM1)
初始化霍尔定时器输入捕获参数
//CH1
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//映射到TI1上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM_ICInitStructure.TIM_ICFilter = 10; // 输入滤波
TIM_ICInit(HALL_TIM, &TIM_ICInitStructure);
这个对其中一个通道作为说明:原本通道应该设为双边沿触发(霍尔其中一个引脚出现下降沿或者上升沿即触发中断),但是STM32的通用定时器TIMx,x=[2,3,4,5]不能进行双边沿触发(经过实测:双边沿触发实际为下降沿触发)!!
对应设置的寄存器为CCER,原因是官方对CCER寄存器的位3:2保留,不能赋值0XA。
解决方法可参考STM32定时器 输入捕获实现双边沿检测
STM32F103 设置双边沿触发输入捕获中断(TIM3 CH1)
设置霍尔传感器定时器为从定时器,触发主定时器TIMx,x=[1,8]产生PWM
TIM_SelectInputTrigger(HALL_TIM, TIM_COM_TS_ITRx); //主从触发
TIM_SelectSlaveMode(HALL_TIM, TIM_SlaveMode_External1); //设置HALL_TIM为从定时器
内部触发配置(TIM4->ITR0->TIM1)