BLDC開發筆記4.轉速的計算


以下結合自己的理解,如有錯誤請幫忙及時指正。

轉速公式

轉速的計算我現在是通過一定時間內,霍爾信號的邊沿數量來計算的。這里每隔50ms在滴答定時器中斷服務函數里面計算一次。霍爾信號每變化一次,就產生一次霍爾觸發中斷。因為我的電機是2對極,所以在一圈內有12個霍爾狀態,即電機轉動一圈會觸發12次中斷。假設在50ms內,霍爾觸發了 n 次中斷,我們可以得到轉速 x 的公式:

50ms內,

\[x=n/12 (rpms) \]

則1ms內

\[x=n/12/50 (rpms) \]

1s內

\[x=(n/12/50)*1000 (rps) \]

1min內

\[x=(n/12/50)*1000*60=100n (rpm) \]

根據這個式子就能計算出轉速。

電機參數初始化

在頭文件中聲明電機參數結構體

typedef struct
{
	int16_t MOTOR_POLE_NUM;    //電機極對數
        int16_t Speed_OPEN_LOOP;   //開環電機轉速
	int16_t step_counter;      //霍爾傳感器脈沖數量,用於計算轉速
	uint32_t HallSpanTime;     //霍爾兩次狀態之間時間
	uint8_t HallGet;           // 是否是hall觸發中斷
	int32_t SpeedBck;          //速度反饋值
}MOTOR_DEVICE;

宏定義

#define BLDC_POLE_NUM 2  //極對數

對電機參數初始化

MOTOR_DEVICE bldc_dev;         //電機參數結構體
void Motor_Init(void)
{
        bldc_dev.MOTOR_POLE_NUM=BLDC_POLE_NUM;  //極對數
	bldc_dev.HallGet=0;
	bldc_dev.HallSpanTime=0;
	bldc_dev.SpeedBck=0;
	bldc_dev.Speed_OPEN_LOOP=0;
	bldc_dev.step_counter=0;
}

滴答定時器初始化

定時器初始化,每1ms中斷一次

void SysTick_Init(void)
{
    uint32_t prioritygroup = 0x00;
  
	/* SystemFrequency / 1000    1ms中斷一次
	 * SystemFrequency / 100000  10us中斷一次
	 * SystemFrequency / 1000000 1us中斷一次
	 */
    SysTick_Config(SystemCoreClock / 1000);
  
    prioritygroup = NVIC_GetPriorityGrouping();  
    NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(prioritygroup, 1, 0));
}

滴答定時器中斷服務函數

編寫滴答定時器中斷服務函數,每50ms計算一次轉速

void SysTick_Handler(void)
{
	static uint16_t time_count=0;
	time_count++;
	if(time_count>50) // 50ms計算一次
       {
	  uint16_t temp;
	  temp=bldc_dev.step_counter*200/bldc_dev.MOTOR_POLE_NUM;  //計算轉速
	  printf("Speed_OPEN_LOOP=%d\r\n",temp);  //打印轉速 (RPM)到串口調試助手
	  time_count=0;  //清零,重新計數
	  bldc_dev.step_counter=0;
	}
	
}

霍爾觸發中斷服務函數

在霍爾中斷服務函數中加入計步參數,測量50ms內霍爾傳感器脈沖數量,用於計算轉速

void HALL_TIM_IRQHANDLER(void)
{	
	if(TIM_GetITStatus(HALL_TIMx,TIM_IT_Trigger)!=RESET)
	{
	  HALL_TIMx_Callback();  //換相函數
	  bldc_dev.step_counter++;	//計步
	  TIM_ClearITPendingBit (HALL_TIMx,TIM_IT_Trigger);  //清除觸發中斷標志
	}	
}

測量轉速

通過串口調試助手查看轉速信息。

用的24V電機最高轉速有33000rpm,這里在開環20%占空比下,有100rpm的波動。為什么是100?其實這就是這種計算方法的局限性,我們通過一段時間內霍爾變化次數計算轉速,每次變化我們就加1,所以誤差的原因就在這里,我們每次只能加1,誤差1通過公式中系數100(2對極)進行了放大,就變成了誤差100rpm.

后續將嘗試另一種通過兩個霍爾狀態之間時間差計算轉速的方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM