<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于CW32的無刷直流空心杯電機無感方波控制驅動方案

CW32生態社區 ? 來源:CW32生態社區 ? 作者:CW32生態社區 ? 2024-04-24 15:38 ? 次閱讀

1. 方案概述

本方案采用CW32F030C8T6作為主控芯片,采用無感方波控制算法控制無刷直流空心杯電機。CW32F030C8T6是一款高性能、低功耗的32位微控制器,具有豐富的片上外設資源,可以適合用于電機控制。無感方波控制算法是一種簡單有效的電機控制算法,不需要使用霍爾傳感器,可以降低硬件成本。

本次采用的電機驅動板仍然為CW32_BLDC_EVA V5開發板,具體開發板的信息可以翻看上一節《基于CW32的無刷空心杯電機有感控制驅動方案》,采用的空心杯電機與上一節有所不同,這次使用的空心杯電機的額定電壓為 24 V。

由于本次采用無感方案,所以只需要將 U、V、W三相電源接上即可,并且三相的順序并無強制要求,下面我們重心將放在對于無感方波控制的原理部分。

2. 無感方波控制原理

無感方波控制(Sensorless Square Wave Control)是一種用于無刷直流電機(BLDC)驅動的控制方法。與傳統的有感控制方法相比,無感方波控制不需要使用位置或速度傳感器來反饋電機狀態,而是通過檢測電機自身的懸空相反電動勢變化(Back Electromotive Force,簡稱BEMF)來實現控制。

在無感方波控制中,通過檢測電機的懸空相電壓的過零點,可以推斷出電機轉子的位置,根據轉子位置進行步狀態的切換即可控制電機轉動。

2.1 梯形波電壓

無感方波的驅動電路采用三相全橋逆變電路,在理想的情況下,三相全橋逆變電路的電壓波形如下圖2-1所示,每相導通角度為120°,相與相之間相隔120°。


圖2-1 三相全橋逆變電壓波形

無刷直流電機驅動所需的電流波形也是上圖里的方波,因為電機存在漏感 L ,定子電流會有一定的上升和下降時間,所以使得理想的方波變成了梯形波。


圖2-2 BLDC運行三相電壓波形

從圖2-2中可以看出,無刷直流電機實際運行時的三相電壓波形并不是圖2-1里的方波,而是梯形波。由于采用了脈寬調制計數(PWM),所以波形看上去由一道道脈沖組成。

2.2 確定換相信號

無感方波驅動與有感最大的區別就在于獲取換相信號的方式不同,有感方波通過檢測三相霍爾信號的電平,再根據三相電平確定電機此時應該運行在的步狀態;無感方波是檢測梯形波“斜線”上的反電動勢電壓來確定換相時刻?;魻栃盘枌南嗍谴_定的,所以電機的供電相也要根據霍爾相的順序來連接,而無感方波驅動只需要檢測“斜線”上的“過零點”確定換相時刻后自動換相到下一步狀態,而每一個步狀態對應事先已經安排好的開關管通斷,所以電機的供電相可以隨意連接。


圖2-3 反電動勢采樣電路

PA0、PA1、PA5分別對應CW32F030 ADC的0、1、5通道,我們使用ADC采集三相的電壓,但在“過零點”比較中我們實際使用的是未導通相,即懸空相的電壓。

2.3 電機驅動思路

驅動電機旋轉的原理與上一章有感驅動的原理相同,本質上是對電機定子的通電情況進行控制,也稱為換相。這里我們結合上一章霍爾傳感器的信號波形與電機運行時的三相電壓波形來看,如下圖。

暫時無法在飛書文檔外展示此內容

我們將電機運行狀態分為三種: 停止、啟動、運行 ,其中停止狀態不需要過多關注。首先是電機的啟動,啟動狀態首先要對轉子進行定位,因為電機在停止時轉子可以在任何位置。確定轉子的位置可以給某一步狀態對應的 MOS 管通電,等待一小段轉子復位的時間后,轉子就在此步狀態中,然后進入啟動階段。

無感電機的啟動也稱為“強拖”,以復位時的步狀態為基準,手動換步,之后若檢測到 “過零點”,則切入第三種正常運行的狀態,如果沒有檢測到,則提高占空比再手動換步,嘗試一定次數后如果沒有成功則電機啟動失敗。

正常運行狀態時,在每次輸出 PWM 脈沖時由比較器觸發 ADC 采樣,根據當前步狀態確定要使用的反電動勢在哪一相。取得反電動勢后需要判斷是否已經來到 “過零點”,這里還需要判斷當前步狀態是電壓上升還是下降狀態:上升狀態需要判斷反電動勢大于 “過零點” 值,下降狀態需要判斷反電動勢小于 “過零點”值。還需要注意的是,ADC的采樣時刻的選擇會影響到 “過零點”值的大?。喝绻窃?PWM 高電平時采集,則過零點值為電源電壓的一半;低電平時的比較值需要自己根據實際大小去調試。通常在 PWM 占空比大于 50% 時采樣高電平,低于 50%時采樣低電平。
image.png

圖2-5 采樣點比較值選擇

在檢測到 “過零點” 之后,需要延遲一定的時間再進行換相,以保證電機的轉矩。延遲時間由定時器記錄的上次換相到本次換相的時間間隔,取其部分大小作為延遲時間。

注意,電機在換相時由于新的電流通路的建立,電壓在換相處會產生尖峰毛刺,此時進行 ADC 電壓采集到的數據是不準確的,所以在換相后還需要進行退磁狀態的判斷,如果處于退磁狀態,則本次不采樣。

3. 軟件設計

3.1 MCU資源分配

本次使用到的CW32內部資源如下:

  • ATIM :CH1、CH2、CH3 三個通道比較產生 PWM 波用于驅動電機,CH4為芯片內部通道,無外部引腳,只有一路比較捕獲寄存器 (ATIM_CH4CCR),且只能用于比較,不能用來捕獲。我們使用 CH4 的比較功能觸發 DMA 傳輸。
  • DMA :使用4路 DMA 通道:CH1、CH2、CH3、 CH4:
  1. CH1 將 ADC 單次單通道的采樣結果傳入 RAM
  2. CH2 將 ADC 的 CR1 寄存器的配置值從 RAM 傳入寄存器
  3. CH3 將 ADC 的 START 寄存器的配置值從 RAM 傳入寄存器
  4. CH1、CH2、CH3由 ADC 硬件觸發,CH4 由 ATIM 硬件觸發,啟動 ADC
  • ADC :ADC 采樣的時鐘設置需要與 PWM 載波頻率結合,計算采樣時間;采用單通道單次采樣,首次采樣由 ATIM 硬件觸發,ADC 轉換完畢后觸發 DMA 傳輸,通過 DMA 傳輸自動改變采樣通道。這樣設置可以實現 ATIM 觸發一次就采樣五個數據(U、V、W 相電壓、母線電壓、外部電位器調速電壓)
  • BTIM1 :BTIM1 設置 1ms 進入一次中斷,在中斷里改變標志位實現主程序的控制
  • BTIM2 :BTIM2 作為換相時間間隔的記錄定時器,決定延遲多長時間后換相
  • BTIM3 :BTIM3 設置中斷,在中斷里完成退磁和換相

3.2 部分重要程序介紹

操作 ATIM CH4 的 CCR 寄存器,可以選擇 ADC 在一個 PWM 周期內不同位置的采樣:

CW_ATIM- >CH4CCR=(數字);

首先是核心函數:調制換相

/*step,為當前換相序號,PWM_ON_flag=1時啟動PWM輸出
**Step_Last,記錄上一次步狀態用于 PWM 占空比的刷新
**Step_Time,記錄上一次換相時間
**Flag_Start_OK,判斷電機是否啟動成功
**Flag_Demagnetize_State,判斷退磁狀態,1:需要退磁;2:退磁完成;3:檢測到過零點,可以換相
**HALLcount,記錄換相次數用于轉速計算
*/
void Commutation(uint32_t step,uint32_t PWM_ON_flag)
{
  if(PWM_ON_flag==0) //不啟動則關閉輸出
  {
    CW_ATIM- >CH1CCRA=0;CW_ATIM- >CH2CCRA=0;CW_ATIM- >CH3CCRA=0;        
    PWM_AL_OFF; PWM_BL_OFF;PWM_CL_OFF;
    CW_ATIM- >CH4CCR=PWM_TS-800;                                        
    return;
  }                         
  //關閉下管           
       if(step==0||step==5){PWM_AL_OFF;PWM_CL_OFF;}
  else if(step==1||step==2){PWM_AL_OFF;PWM_BL_OFF;}
  else if(step==3||step==4){PWM_BL_OFF;PWM_CL_OFF;}
  //打開上管                
  if(step==0||step==1){CW_ATIM- >CH2CCRA=0;CW_ATIM- >CH3CCRA=0;CW_ATIM- >CH1CCRA=OutPwm;}
  if(step==2||step==3){CW_ATIM- >CH1CCRA=0;CW_ATIM- >CH3CCRA=0;CW_ATIM- >CH2CCRA=OutPwm;}
  if(step==4||step==5){CW_ATIM- >CH1CCRA=0;CW_ATIM- >CH2CCRA=0;CW_ATIM- >CH3CCRA=OutPwm;}
  //打開下管                            
  if(step==0||step==5){PWM_BL_ON;}//AB
  else if(step==1||step==2){PWM_CL_ON;}//AC
  else if(step==3||step==4){PWM_AL_ON;}//BA
                
  Step_Last=step;
  //判斷占空比修改采樣時刻      
  if(OutPwm >=1200&&Flag_ON_or_OFF==0){Flag_ON_or_OFF=1;CW_ATIM- >CH4CCR=300;}        
  else  if(OutPwm< 1200&&Flag_ON_or_OFF==1){Flag_ON_or_OFF=0;CW_ATIM- >CH4CCR=PWM_TS-600;        }
  //記錄上一次的換相時間                  
  Step_Time=BTIM_GetCounter(CW_BTIM2);
  BTIM_SetCounter(CW_BTIM2,0);
  //電機未啟動則快速換相                
  if(Flag_Start_OK==0)
  BTIM_SetAutoreload(CW_BTIM3,Step_Time/8);        
  else 
  BTIM_SetAutoreload(CW_BTIM3,Step_Time/6);//退磁延遲時間
   
  BTIM_SetCounter(CW_BTIM3,0);
  BTIM_Cmd(CW_BTIM3, ENABLE);
  //啟動退磁 
  Flag_Demagnetize_State=1;//退磁狀態 
        
  HALLcount++;                  
}

接著是第二個核心:換相。

/*Direction,電機運行方向,0:步狀態012345,1:步狀態054321
**Cur_Step,電機目前的步狀態,步狀態正常運行順序為 012345、543210。0:AB、1:AC ……
*/
void BTIM3_IRQHandler(void)
{
  if(BTIM_GetITStatus(CW_BTIM3, BTIM_IT_OV))
  {  
    BTIM_ClearITPendingBit(CW_BTIM3, BTIM_IT_OV);
                
    if(Flag_Demagnetize_State == 1)  //說明退磁結束后第一次進入BTIM3中斷
    {
      Flag_Demagnetize_State = 2;    //退磁結束標志
      BTIM_Cmd(CW_BTIM3, DISABLE);
    }
    else if(Flag_Demagnetize_State == 3 && Flag_Start_OK == 1) //退磁完成和啟動成功后,決定下一次換相
    {
      BTIM_Cmd(CW_BTIM3, DISABLE);
      
      if(Direction == 0)          //與RisingFalling的順序要對應
      {
        Cur_Step++;
        if(Cur_Step == 6)Cur_Step = 0;
      }
      else
      {
        if(Cur_Step == 0)Cur_Step = 5;
        else Cur_Step--;
      }
      Commutation(Cur_Step,Motor_Start_F);
    }
  }
}

過零點比較函數如下,此函數在 ADC 完成五次采樣后調用。

/*SampleData[5] U反電動勢 V反電動勢 母線電壓 W反電動勢 電位器調速電壓值
**TAB_BEMFChannel[6]={3,1,0,3,1,0};
**TAB_RisingFalling[2][6]={//判斷此刻電壓為上升沿還是下降沿,Rising=1;Falling=2
  {FALLING,RISING,FALLING,RISING,FALLING,RISING},
  {RISING,FALLING,RISING,FALLING,RISING,FALLING} }
**Flag_ON_or_OFF,高低電平采樣標志位 
**RisingFalling,上升沿下降沿比較標志位  
**Count_0V,過零點檢測計數  STCount = 15
**Flag_Confirm,啟動確認標志位  
*/
void ADC_Process(void)
{
  static uint8_t count = 0;  //過零檢測計數
  uint32_t Voltage_Bus = 0;  //母線電壓
  uint8_t Flag_0V = 0;       //成功檢測到過零點標志
        
  if(Flag_Demagnetize_State != 2)return; //說明退磁未結束
        
  BEMFConvertedValue =SampleData[TAB_BEMFChannel[Cur_Step]];  //取得反電動勢
  RisingFalling=TAB_RisingFalling[Direction][Cur_Step];       //判斷上升沿還是下降沿
        
  if(Flag_ON_or_OFF == 0)Voltage_Bus = 50;   //在PWM低電平時采樣則與地比較電壓              
  else Voltage_Bus = SampleData[2];          //在PWM高電平時采樣則與電源正極比較電壓
        
  if(RisingFalling == FALLING)
  {
    if(BEMFConvertedValue < Voltage_Bus)
    {
      count++;
      if(count >= 2)                        //連續兩次都檢測到過零,則認為確實過零了
      {
        count = 0;
        Flag_Demagnetize_State = 3;        //退磁完成,可以換相
                                
        Count_0V++;
        Flag_Confirm = 1;
        Flag_0V = 1;                      //成功檢測到過零點
      }
    }
    else count = 0;
  }
  else if(RisingFalling == RISING)
  {
    if(BEMFConvertedValue > Voltage_Bus)
    {
      count++;
      if(count >= 2)
      {
        count = 0;
        Flag_Demagnetize_State = 3;
                                
        Count_0V++;
        Flag_Confirm = 1;
        Flag_0V = 1;
      }
    }
    else count = 0;
  }
        
  if(Count_0V >= STCount && Flag_Start_OK == 0)   
  {  
    Flag_Start_OK = 1;    //連續檢測到固定數量的過零時,認為啟動成功
  }        
        
  if(Flag_Start_OK == 1 && Flag_0V == 1)
  {
    Flag_0V = 0;
                
    BTIM_SetAutoreload(CW_BTIM3,Step_Time/8); //換相延遲時間                        
    BTIM_SetCounter(CW_BTIM3,0);
    BTIM_Cmd(CW_BTIM3, ENABLE);
  }  
}

最后是電機的啟動部分:

/*TimeCountTemp,計時,1ms增加1
**Com_time,     啟動次數
**RAMP_TABLE[64],存儲時間的數組
*/
do
  {                                                
    if(Direction == 0)               //與RisingFalling的順序要對應
    {
      Cur_Step++;
      if(Cur_Step >= 6)Cur_Step = 0; //以復位時的步狀態為基準,手動換步
    }
    else
    {
      if(Cur_Step == 0)Cur_Step = 5;
      else Cur_Step--;
    }

    Flag_Confirm = 0;
    if(Flag_Start_OK == 0)        
    {
      Commutation(Cur_Step,Motor_Start_F); 
    }  
    TimeCountTemp = 0;
    while(TimeCountTemp < RAMP_TABLE[Com_time]) //等待過零點檢測
    {
      if(Flag_Confirm == 1 || Flag_Start_OK == 1)break;  //啟動成功則不再執行do.....while里的內容
    }

    Com_time++;
    OutPwm+=10;  //沒有啟動則依次提高占空比
  }while(Flag_Start_OK==0 && Com_time< 60 && ErrorCode==0);  
  //跳出循環則 啟動成功/超出啟動次數/啟動報錯

4. 調試心得

  • 在調試電機的過程中要做好限流保護,電機換相失敗會導致其停在某一相,對應的MOS 管持續導通。
  • 退磁延遲時間和延遲換相時間的設置會影響電機的性能,過早地換相會降低電機轉矩,過晚地換相會使電機電流過大,效率較低發熱嚴重。
  • 電壓比較值的設置同樣會造成上一條的影響,在低電平時采樣比較的值如果設置過小,會造成上升沿處換相過早、下降沿處換相過晚的后果。
  • 電機的啟動需要緩慢進行,不可以將 PWM 的占空比增加過快,否則電機容易換相失敗。
  • BTIM3中斷服務程序里的方向檢測設置要與數組 TAB_RisingFalling 里的 Rising 和 Falling 順序對應,否則會啟動失敗。
  • 由于空心杯電機的內部為三角形接線,在 PWM 低電平時仍保有較多的能量,所以在 MOS 管關斷期間的反電動勢較高,并且隨著轉速的增加此電壓的大小呈上升態勢。對于 “過零點” 電壓數據的設置也需要適應這種變化,下圖展示了空心杯電機運行在 35000 rpm 時的一相電壓波形。


圖4-1 空心杯電機運行電壓波形

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電機
    +關注

    關注

    139

    文章

    8317

    瀏覽量

    142242
  • 無刷直流電機

    關注

    60

    文章

    657

    瀏覽量

    45598
  • 控制驅動
    +關注

    關注

    0

    文章

    10

    瀏覽量

    8444
  • 方波控制
    +關注

    關注

    0

    文章

    7

    瀏覽量

    4945
  • CW32
    +關注

    關注

    1

    文章

    125

    瀏覽量

    249
收藏 人收藏

    評論

    相關推薦

    用STM32控制步進電機直流電機的區別是什么?

    因為現在的項目做的是機電類控制控制的位置精度方面的要求比較高 目前公司采用的是步進電機驅動方式 因為在ST官網看的比較久 覺得ST在
    發表于 05-06 06:43

    基于CW32的無刷直流空心電機有感控制驅動方案

    一、概述 空心電機(Hollow-Cup Motor)是一種特殊類型的微型無刷直流電機,具有空心的旋轉部分。它通常由外部固定的外殼和內部旋轉的空心
    的頭像 發表于 04-24 15:28 ?890次閱讀
    基于<b class='flag-5'>CW32</b>的無刷<b class='flag-5'>直流</b><b class='flag-5'>空心</b>杯<b class='flag-5'>電機</b>有感<b class='flag-5'>控制</b><b class='flag-5'>驅動</b><b class='flag-5'>方案</b>

    基于CW32F030C8T7永磁同步電機FOC控制方案全新亮相!

    近日,武漢芯源半導體基于CW32F030C8T7永磁同步電機FOC控制方案全新亮相! 隨著
    發表于 02-27 11:18

    四軸飛行器的電機有哪些?

    目前有微型四軸,也有像小米、大疆的四軸飛行器。 今天的先不談,只談有空心電機。 1、目
    發表于 11-06 06:54

    基于CW32的無刷水泵方案

    基于CW32的無刷水泵方案
    的頭像 發表于 11-03 17:28 ?458次閱讀
    基于<b class='flag-5'>CW32</b>的無刷水泵<b class='flag-5'>方案</b>

    基于CW32的物聯網應用

    CW32】基于CW32的物聯網應用
    的頭像 發表于 11-02 15:55 ?354次閱讀
    基于<b class='flag-5'>CW32</b>的物聯網應用

    2023電賽A題國獎CW32 開源分享

    電賽A題開源分享,主控為CW32
    的頭像 發表于 11-02 10:16 ?848次閱讀
    2023電賽A題國獎<b class='flag-5'>CW32</b> 開源分享

    直流電機驅動芯片驅動空心可行嗎?

    直流電機驅動芯片驅動空心可行么?
    發表于 10-26 06:24

    直流電機之電調設計攻略

    直流電機之電調設計全攻略電子檔,使用STM8開發,
    發表于 10-07 06:55

    STM32直流電機開發板資料

    STM32 直流電機開發板資料
    發表于 09-26 07:39

    直流電機如何設計電調的詳細資料說明

    本文檔的主要內容詳細介紹的是直流電機如何設計電調的詳細資料說明。首先要搞清楚一件基本的事情:我們只是來搞電調的,而不是去設計
    發表于 09-26 07:23

    驅動控制電機最少幾個定時器 ?

    驅動控制電機最少幾個定時器
    發表于 09-25 06:26

    直流電機之電調設計全攻略

    關于直流電機驅動的基本原理,很多教材和文檔都已經講得很清楚了,特別是壇上網友提供的:《
    發表于 09-21 08:23

    幫忙推薦驅動方案BLDC方波

    幫忙推薦驅動方案 BLDC方波
    發表于 06-16 06:35

    直流電機

    電機接到大電機上也能運轉(直流電機),不進入
    發表于 05-11 14:33
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>