這裡是使用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);
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); //主從模式選擇 使能
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);
}
}