大部分的STM32皆具備有兩個四通道的timer,以往使用者可能會採取利用GPIO收取hall sensor變化的中斷,然後讀取3根hall sensor腳位的狀態後,再根據真值表來設定驅動馬達的timer輸出。
這邊示範如何利用一組四通道timer負責接收hall sensor訊號,並觸發驅動馬達的timer改變輸出來提升換相的效率。
STM32關於馬達驅動部分,有提供一個預寫入設定,等待觸發訊號時再實際寫入register的功能,我們可以利用這一個特性,預先寫入下一個相位的設定,等待hall sensor timer觸發後就立刻換相,除了有助於增加換相的效率外,並且作業時間上也不用太即時,只要到下一次hall sensor觸發前寫入設定即可。
大大购相关商品 NUCLEO-G031K8 >> 查询存货及售价
使用CubeMX,設置TIM2為Hall Sensor Mode,這可以大幅簡化設定。
因為每次Hall Sensor觸發後,皆會將觸發時的Timer CNT值放入CCR1暫存器,並且重設CNT,這邊可以利用CCR1暫存器的值乘上設定的timer週期來推算馬達轉速。
此外Commutation Delay不可以設置為0,否則不會發出訊號通知。
此外在NVIC設定中,也需要打開TIM2的中斷。
到這邊Hall Sensor用的timer基本上已經設置完成,接下來設置驅動馬達的timer,這邊使用TIM1 Advanced control timer來做為驅動馬達用的timer。
下面是模式設置,使用CH1 / CH2 / CH3的互補輸出,並且設置Slave Mode為Trigger Mode,Trigger來源可以查閱手冊說明,因使用TIM2作為觸發來源,手冊記載TIM2的TRGO-OUT內部連接到TIM1的ITR1,故設置Trigger Source為ITR1。
這邊示範如何利用一組四通道timer負責接收hall sensor訊號,並觸發驅動馬達的timer改變輸出來提升換相的效率。
STM32關於馬達驅動部分,有提供一個預寫入設定,等待觸發訊號時再實際寫入register的功能,我們可以利用這一個特性,預先寫入下一個相位的設定,等待hall sensor timer觸發後就立刻換相,除了有助於增加換相的效率外,並且作業時間上也不用太即時,只要到下一次hall sensor觸發前寫入設定即可。
大大购相关商品 NUCLEO-G031K8 >> 查询存货及售价
使用CubeMX,設置TIM2為Hall Sensor Mode,這可以大幅簡化設定。
因為每次Hall Sensor觸發後,皆會將觸發時的Timer CNT值放入CCR1暫存器,並且重設CNT,這邊可以利用CCR1暫存器的值乘上設定的timer週期來推算馬達轉速。
此外Commutation Delay不可以設置為0,否則不會發出訊號通知。
此外在NVIC設定中,也需要打開TIM2的中斷。
到這邊Hall Sensor用的timer基本上已經設置完成,接下來設置驅動馬達的timer,這邊使用TIM1 Advanced control timer來做為驅動馬達用的timer。
下面是模式設置,使用CH1 / CH2 / CH3的互補輸出,並且設置Slave Mode為Trigger Mode,Trigger來源可以查閱手冊說明,因使用TIM2作為觸發來源,手冊記載TIM2的TRGO-OUT內部連接到TIM1的ITR1,故設置Trigger Source為ITR1。
以下是timer設置,因我們預計輸出到馬達的PWM頻率是20KHz,STM32G031目前主頻定在64MHz,故我們設置Prescaler為3,Period為799,這樣可以得到一個20KHz的頻率。
此外因為使用的mosfet不同,我們希望PWM輸出在active / inactive的狀態也可以由timer的register控制,故我們將Off state的狀態控制(OSSR / OSSI)也一併啟用。
另外NVIC設定中,TIM1用的中斷也一併打開。
到這邊為止,就已經完成了所有的基本設置,產生程式碼後。
只需要在設定完timer後,加入下面的程式碼。
HAL_TIMEx_ConfigCommutEvent(&htim1, TIM_TS_ITR1, TIM_COMMUTATION_TRGI);
這行設定timer的input trigger、打開預載功能,且設定可以由input trigger的訊號來觸發預載設定實際寫入。
HAL_TIMEx_HallSensor_Start_IT(&htim2);
這行啟動hall sensor timer工作。
評論