霍尔值的识别直接通过读取端口的电平来获取代码信息,但当涉及到霍尔估计转子角度时,需要知道每个霍尔值跳转时间来获取平均速度等信息,使用定时器捕获功能更方便,不需要设置额外的定时器来计时,这里选择STM32的TIM2定时器的捕获功能。
NVIC_InitTypeDef NVIC_InitHALLStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM2->CR1=(2<<8) (1<<7); /*^ TIM2->CR1=(2<<8)--CKD(时钟分频因子是4分之一定时钟,用于输入捕获或对应数字滤波器的分配时基) 10:tDTS = 4 x tCK_INT DTS是Discrimination Threshold of Sample(采样分辨阈值),因为它已经是最高采样频率(即最快采样速度),采样频率设置只能以它为基础进行分频。 TIM2->CR1=(1<<7)--TIMx_ARR寄存器缓冲器有效(预装载有效) ^*/ TIM2->CR2=(1<<7); /*^ TIM2->CR2=(1<<7)-- TIMx_CH1,TIMx_CH2 ,TIMx_CH3异或后输入TI1 三个定时器输入脚CC1,CC2,CC3(对应三个霍尔)通过一个不同或门连接TI1输入通道 (见C51参考手册220页。 霍尔跳变异或值也会跳变:101 001 011 010 110 100 5 1 3 2 6 4 异或值: 0 1 0 1 0 1 ^*/ TIM2->SMCR=(4<<4) (4<<0); /*^ TIM2->SMCR=(4<<4)-计数器触发选择TI边缘检测器1 TS第三位[2:0]100,TI1边缘检测器检测上下边缘,边缘跳变TI1F_ED输出高产生TRC触发信号 TIM2->SMCR=(4<<0)-从模式选择:复位模式的触发输入 (TRGI) 上升沿重新初始化计数器,并且产生一 更新寄存器信号 ^*/ //过滤时间21us TIM2->CCMR1=(15<<4) (3<<0); /*^ TIM2->CCMR1=(15<<4)--定义了 TI1 数字滤波器的采样频率和长度(N),1111:采样频率 fSAMPLING=fDTS/32,N=8 TIM2->CCMR1=(3<<0)--CC通道配置为输入,IC1映射于TRC(这里TRC是作为IC1的输入,是TI1边缘检测器生成的边缘检测器TRC内部直接映射IC1的),这种模式只工作SMCR的TS选择内部触发器时。 ^*/ /* 注:CCER中CC1P与CC1NP共同控制IC通道捕获输入信号(TI1产生的TRC)的有效沿,详见手册340页 默认为00,只捕获非反相上升沿 */ TIM2->CCER=(1<<0); /*^ TIM2->CCER=(1<<0)--CC通道输入捕获使能,开启捕捉 ^*/ NVIC_InitHALLStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitHALLStructure.NVIC_IRQChannelPriority = 0; //TIM最高级中断,捕获和读取作为一个角度 NVIC_InitHALLStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitHALLStructure); //设置中断 TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); ///打开通道1捕获中断 TIM2->ARR = TIM2_PERIOD; //600MS的溢出时间 TIM2->PSC=47;//1us时基 TIM2->EGR|=(1<<0) TIM2->CR1|=(1<<0);//开始计数