天天看點

STM32 BLDC無刷直流電機 HALL霍爾硬體接口 程式

這裡是使用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次的電平一樣才作為判斷依據;

STM32 BLDC無刷直流電機 HALL霍爾硬體接口 程式

濾波器其實是為了抗幹擾,因為會有電磁幹擾進入引腳,就相當于按鍵的多次計數軟體濾波

另外說明:使用定時器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);

    }

}    

繼續閱讀