《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 解決方案 > STM8 MCKIT1.0 BLDC無感控制中的采集實現(xiàn)分析

STM8 MCKIT1.0 BLDC無感控制中的采集實現(xiàn)分析

2016-05-19
關(guān)鍵詞: BLDC

       ST寫的STM8電機庫中,可以用無感方式驅(qū)動BLDC。STM8芯片只有一個AD轉(zhuǎn)換器,而且是8位機。庫中要對反

電勢采集,比較處理,還要進行母線電壓,母線電流、散熱片溫度、電位器等模擬信號進行采集、運算和處理。

這優(yōu)先級處理說起來是很重要的。不過,ST把程序?qū)懙暮芎茫辽傥疫@樣認為。它把不同的任務(wù)放到準確的時間段里進行采集處理。
先把它核心AD采集處理帖出來再分析 。

#ifdef SENSORLESS 
 @near @interrupt @svlreg void ADC2_IRQHandler (void)
 {
  if (ADC_State == ADC_SYNC)
  {
   // Syncronous sampling
   
   u16 data;
   u8 delay;
   u16 bemf_threshold;

   // Reset bit
   bComHanderEnable = 0;
    
   //clear interrupt flag
   ADC2->CSR &= (u8)(~BIT7);
     
   //left align - read DRH first
   data = ADC2->DRH;
   data <<= 2;
   data |= (ADC2->DRL & 0x03);  
   
   switch( ADC_Sync_State )
   {
    case ADC_BEMF_INIT:
     ADC2->CSR = (u8)((Current_BEMF_Channel|BIT5));
     BEMF_Sample_Debounce = 0;
     Zero_Sample_Count = 0;
     ADC_Sync_State = ADC_BEMF_SAMPLE;
     SetSamplingPoint_BEMF();
    break;

    case ADC_BEMF_SAMPLE:
     //detect zero crossing
     if( Current_BEMF == BEMF_FALLING )
     {
      if( Z_Detection_Type == Z_DETECT_PWM_OFF )
      {
       bemf_threshold = BEMF_FALLING_THRESHOLD;
      }
      else
      {
       bemf_threshold = hNeutralPoint;
      }

      if (Ramp_Step > FORCED_STATUP_STEPS)
      {
       if( data <  bemf_threshold  )
       {
        Zero_Sample_Count++;
        BEMF_Sample_Debounce++;
        if( BEMF_Sample_Debounce >= BEMF_SAMPLE_COUNT )
        {
         hTim3Th -= hTim3Cnt;
         GetStepTime();
 
         SpeedMeasurement();

         bComHanderEnable = 1;

         BEMF_Sample_Debounce = 0;
        }
       }
       else
       {
        BEMF_Sample_Debounce = 0;
       }
      }
     }
     else
     {
      if( Z_Detection_Type == Z_DETECT_PWM_OFF )
      {
       bemf_threshold = BEMF_RISING_THRESHOLD;
      }
      else
      {
       bemf_threshold = hNeutralPoint;
      }
  
      if (Ramp_Step > FORCED_STATUP_STEPS)
      {
       if( data > bemf_threshold )
       {
        Zero_Sample_Count++;
        BEMF_Sample_Debounce++;
        if( BEMF_Sample_Debounce >= BEMF_SAMPLE_COUNT )
        {
         hTim3Th -= hTim3Cnt;
         GetStepTime();
  
         SpeedMeasurement();

         bComHanderEnable = 1;

         BEMF_Sample_Debounce = 0;
        }
       }
       else
       {
        BEMF_Sample_Debounce = 0;
       }
      }
     }
    break;

    case ADC_CURRENT_INIT:
     ADC2->CSR = (ADC_CURRENT_CHANNEL|BIT5);
     ADC_Sync_State = ADC_CURRENT_SAMPLE;
     SetSamplingPoint_Current();
    break;

    default:
    case ADC_AVCURRENT_INIT:
     ADC2->CSR = (ADC_AVCURRENT_CHANNEL|BIT5);
     ADC_Sync_State = ADC_AVCURRENT_CHANNEL;// ADC_USER_SYNC_SAMPLE;
     SetSamplingPoint_AVCURRENT();
    break;

  
    case ADC_CURRENT_SAMPLE:
     ADC_Buffer[ ADC_CURRENT_INDEX ] = data;
     break;

    case ADC_AVCURRENT_SAMPLE:
     ADC_Buffer[ ADC_AVCURRENT_INDEX] = data;
     break;
   }

   // Store the current channel selected
   bCSR_Tmp = ADC2->CSR;

   // Set the Async sampling channel
   switch (ADC_Async_State)
   {
    default:
    case ADC_BUS_INIT:
     ADC2->CSR = (ADC_BUS_CHANNEL|BIT5);
     ADC_Async_State = ADC_BUS_SAMPLE;
    break;
    
    case ADC_TEMP_INIT:
     ADC2->CSR = (ADC_TEMP_CHANNEL|BIT5);
     ADC_Async_State = ADC_TEMP_SAMPLE;
    break;
   
    case ADC_USER_ASYNC_INIT:
     ADC2->CSR = (ADC_USER_ASYNC_CHANNEL|BIT5);
     ADC_Async_State = ADC_USER_ASYNC_SAMPLE;
    break;
   }

    // Disable ext. trigger
    ADC2->CR2 &= (u8)(~BIT6);
    //Start ADC sample
    ADC2->CR1 |= BIT0;


   ADC_State = ADC_ASYNC;
   
   if (bComHanderEnable == 1)
   {
    ComHandler();
   }
  }
  else
  {
   // Syncronous sampling
   u16 data;
   
   data = ADC2->DRH;
   data <<= 2;
   data |= (ADC2->DRL & 0x03);

   //clear interrupt flag
   ADC2->CSR &= (u8)(~BIT7);

   // Restore the sync ADC channel
   ADC2->CSR = bCSR_Tmp;
 

    // Enable ext. trigger
    ADC2->CR2 |= BIT6;


   // Manage async sampling
   switch (ADC_Async_State)
   {
    default:
    case ADC_BUS_SAMPLE:
     ADC_Buffer[ ADC_BUS_INDEX ] = data;
     ADC_Async_State = ADC_TEMP_INIT;
    break;

    case ADC_TEMP_SAMPLE:
     ADC_Buffer[ ADC_TEMP_INDEX ] = data;
     ADC_Async_State = ADC_USER_ASYNC_INIT;
    break;

    case ADC_USER_ASYNC_SAMPLE:
     ADC_Buffer[ ADC_USER_ASYNC_INDEX ] = data;
     ADC_Async_State = ADC_BUS_INIT;
    break;
   }
   
   ADC_State = ADC_SYNC;   
  }
 }
#endif

 

上面的代碼我改了一點點,就是多采集了一路平均電流。

AD采集分兩種,一個是同步,一個是異步。同步中有三個采集通道,異步中有三個采集通道。同步中的通道為反電勢通道、瞬時電流、平均電流。異步采集中通道為母線電壓、溫度值、電位器。

異步采集是在同步完成后進行的。同步采集是通過TIM1的通道4觸發(fā)采集。

所以每個PWM周期采集2路模擬信號。異步采集的通道與PWM的ON與OFF狀態(tài)無關(guān),所以安排在異步采集中。同步采集中的反電勢需要在PWM固定 時刻采集,或ON或OFF,看BEMF的過零比較方案。瞬時電流一般在TON時刻采集。因為原來ST有PWM特殊時刻做了一路用戶通道中,所以我就把平均 電流加到這一通道上了。其實平均電流采集也可以放到異步中。無所謂了,功能實現(xiàn)是沒問題的。

另外,異步采集中的反電勢通道一直是設(shè)為浮空相的通道的。而且反電勢的采集在D與Z之間,即退磁結(jié)束與過零點之間進行的異步采集均為反電勢,而瞬時 電流的采集是在Z與C之間,即過零與換相之間進行的異步采集均為瞬時瞬時電流。所以用戶的通道(平均電流)就是在換相與退磁之間了。

ST的無感方案,啟動方案感覺只能針對工業(yè)用電機,像在4極對下4K轉(zhuǎn)速的電機,那啟動參數(shù)不用怎么改。但如果改為航模電機,無論啟動 PWM改為多少,總是不能啟動成功。可能是我還找到巧門,也可能沒設(shè)對參數(shù),對于高速電機,像這種無感啟動可能是升頻升壓法啟動才可靠。我早期寫的例程, 無論什么電機,用的是升頻升壓法,無論什么電機,都可以正常啟動,只是啟動過程(大約1S)電流從大到小,,至少正常運行至最小電流值。

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美在线精品一区| 亚洲国产天堂久久综合网| 国产区亚洲区欧美区| 欧美福利小视频| 欧美一级理论片| 欧美成人精品福利| 精品91在线| 国产日本欧美在线观看| 欧美日韩在线播| 欧美黄色网络| 欧美成人蜜桃| 蜜桃久久精品乱码一区二区| 久久精品亚洲| 欧美在线亚洲综合一区| 午夜视频精品| 亚洲欧美日韩另类| 亚洲欧美日韩国产另类专区| 亚洲午夜精品17c| 在线一区二区三区四区五区| 亚洲美女黄网| 亚洲精品在线电影| 亚洲精品裸体| 一本久道久久综合狠狠爱| 亚洲另类视频| 日韩一级欧洲| 一二美女精品欧洲| 在线中文字幕不卡| 亚洲一区二区在线看| 亚洲一区美女视频在线观看免费| 一本久道综合久久精品| 一区二区高清在线| 在线一区欧美| 亚洲欧美成人| 欧美在线视频观看| 欧美日韩在线视频首页| 久久精品亚洲精品| 欧美在线视频导航| 久久精品国产亚洲精品| 午夜宅男欧美| 一区二区三区成人精品| 欧美视频在线视频| 夜夜嗨av一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲日本中文字幕区| 在线播放日韩| 亚洲精品中文字幕有码专区| 夜夜嗨一区二区| 中文久久乱码一区二区| 亚洲欧美bt| 久久精品亚洲| 亚洲欧美不卡| 亚洲小少妇裸体bbw| 国产日韩欧美另类| 激情视频一区二区| 亚洲视频 欧洲视频| 男人的天堂成人在线| 可以免费看不卡的av网站| 欧美激情综合色综合啪啪| 欧美日韩在线视频观看| 国产日本亚洲高清| 亚洲国产欧美一区二区三区丁香婷| 亚洲精品影院| 午夜欧美不卡精品aaaaa| 亚洲国产精品一区二区尤物区| 一本色道久久综合亚洲精品小说| 亚洲欧美日韩成人| 农夫在线精品视频免费观看| 欧美色欧美亚洲高清在线视频| 国产美女精品免费电影| 亚洲第一网站免费视频| 亚洲一区二区欧美日韩| 亚洲国产精彩中文乱码av在线播放| 日韩午夜av电影| 香蕉久久a毛片| 欧美成人午夜激情在线| 国产精品视频精品视频| 亚洲国产一区二区三区青草影视| 亚洲一区二区精品在线| 欧美α欧美αv大片| 久久精品视频免费| 亚洲午夜精品久久| 久久久伊人欧美| 欧美午夜a级限制福利片| 国产在线视频欧美| 欧美性色综合| 卡一卡二国产精品| 香港成人在线视频| 亚洲精品婷婷| 久久爱91午夜羞羞| 亚洲免费在线电影| 黄色成人在线网址| 亚洲美女诱惑| 国产精品99久久久久久宅男| 亚洲激情自拍| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩国语| 在线成人亚洲| 性色av一区二区三区红粉影视| 99国产精品99久久久久久| 久久久久久久欧美精品| 欧美视频国产精品| 亚洲大胆在线| 欧美一区二区高清在线观看| 日韩午夜黄色| 蜜桃av一区| 国产精品一区二区视频| 国产精品大片wwwwww| 亚洲日本在线视频观看| 午夜亚洲性色视频| 亚洲色图自拍| 欧美成ee人免费视频| 国产精品亚洲综合色区韩国| 136国产福利精品导航| 欧美亚洲免费高清在线观看| 一区二区激情视频| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品私拍pans大尺度在线| 亚洲精品国产精品乱码不99按摩 | 西西裸体人体做爰大胆久久久| 日韩午夜在线| 久久久人成影片一区二区三区观看 | 午夜精品久久久久| 亚洲欧美日本日韩| 欧美色欧美亚洲高清在线视频| 日韩一本二本av| 9久re热视频在线精品| 免费一区二区三区| 国产欧美一区二区精品性色| 一本大道久久a久久精二百| 亚洲成色www久久网站| 久久久久成人精品免费播放动漫| 国产精品国产精品| av成人免费观看| 99国产欧美久久久精品| 蜜臀av国产精品久久久久| 在线观看视频一区| 91久久综合亚洲鲁鲁五月天| 亚洲欧美激情一区| 欧美吻胸吃奶大尺度电影| 亚洲精品一区二区三区av| 亚洲精品乱码久久久久久黑人 | 亚洲日本成人| 亚洲精品乱码久久久久久黑人| 欧美丰满高潮xxxx喷水动漫| 一色屋精品视频免费看| 久久精品国产一区二区三区免费看 | 另类天堂av| 亚洲国产精品视频一区| 亚洲国产精品视频| 男女激情久久| 亚洲精品一区二区三区福利| 亚洲乱码国产乱码精品精天堂 | 亚洲第一福利视频| 亚洲国产婷婷香蕉久久久久久99 | 亚洲人午夜精品| 欧美成人午夜视频| 夜夜嗨av色一区二区不卡| 亚洲综合精品自拍| 国产一二三精品| 亚洲成人在线免费| 黄色日韩网站| 91久久精品美女| 欧美黄色大片网站| 亚洲午夜在线观看视频在线| 性欧美精品高清| 精品成人在线视频| 亚洲国产精品女人久久久| 欧美日韩午夜剧场| 日韩小视频在线观看专区| 性欧美暴力猛交69hd| 在线观看日韩精品| 一本在线高清不卡dvd | 国产亚洲一区二区三区在线播放 | 欧美精品一级| 亚洲免费成人av| 亚洲一区二区日本| 国产一区在线看| 亚洲国产美女精品久久久久∴| 欧美肥婆在线| 亚洲九九爱视频| 日韩视频一区二区三区在线播放免费观看 | 一区二区高清在线观看| 国产精品久久二区二区| 性亚洲最疯狂xxxx高清| 美女黄毛**国产精品啪啪 | 国产精品一区二区你懂的| 亚洲欧美成人一区二区三区| 亚洲欧美中文日韩v在线观看| 国产日韩欧美一区二区三区在线观看 | 亚洲视频一区在线| 欧美日韩亚洲一区二区三区| 亚洲欧美精品一区| 亚洲欧美日本国产专区一区| 国产一区二区三区高清播放| 亚洲欧美日韩精品久久亚洲区| 蜜臀av性久久久久蜜臀aⅴ| 99re6这里只有精品| 国产精品99久久久久久白浆小说| 国产精品最新自拍| 亚洲日韩欧美视频一区|