久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13454|回復: 10
收起左側

STM32無刷電機EMF過零檢測程序源碼模板(注釋很詳細)求大神完善

  [復制鏈接]
ID:325955 發表于 2018-5-9 15:32 | 顯示全部樓層 |閱讀模式
最近在研究BLDC電機的控制,四處搜集資料,附件中是基于EMF過零檢測控制BLDC的程序,目前只有用到的結構體變量定義部分,可以提供些程序框架思路。

帶有詳細注釋的單片機源程序框架如下:
  1. if((uwMspVirtualTimer - uwMspVirtualTimerKeep)>msp->uwCmtPRD_OpenPulse)
  2. {
  3.         pwm1.CmtnPointer-=1;
  4.         if(pwm1.CmtnPointer>0xF0)
  5.         {
  6.                 pwm1.CmtnPointer=5;
  7.         }
  8.         msp->SampleBemfEn_OpenPulse=TRUE;
  9.         msp->ExtenAdcSample=DISABLE;//DETECT BEMF
  10.         msp->AvoidCommuteTimer=0;
  11.         msp->dutyCycleCmd=OPEN_STARTUP_DUTY;//sysVar.InputAnalogRef;//注意ANA_INPUT_MIN限制
  12.         msp->uwSixStepCount++;
  13.         uwMspVirtualTimerKeep = uwMspVirtualTimer;
  14. }

  15. //Define the zeroCross structure

  16. typedef struct
  17. {
  18.         u16 timer;                   //過零檢測用時間計數器,時基為50us
  19.         u8  state;                   //過零檢測狀態
  20.         u16 compare;                 //過零換向延遲30°的時間
  21.         u16 period;                  //兩個cntr之間的時間(60°電角度)
  22.         u16 oldPeriod;               //記錄上一次的Period
  23.         u16 periodARY[6];            //存儲過去6次的period
  24.         u8  CmtnPointer;             //存儲經由zerocross計算出的cntr,用于向pwm1.cntr賦值
  25.         u8  detected**;             //過零點檢測標志位,在檢測到過零點之后被置為TRUE,然后在等待30°換向的過程中被置FALSE(有效時間很短)
  26.         u8  diodeDelayTimer;         //用于表示換向去磁階段(由續流二極管引起)不檢測反電勢的時間
  27.         u16 periodAcc;               //用于存儲之前6次的period之和,用于計算period平均值averagePeriod6
  28.         u16 averagePeriod6;          //等于periodAcc/6,算出平均period的值
  29.         u8  phaseAdvance;            //超前換向補償,這個值用于補償因濾波導致過零點的滯后,以減小延遲30°的時間,需要根據實際的硬件電路進行校正
  30.                                  //FIR階數的一半為FIR引入的群延遲時間,在換向時要進行補償
  31.         u16 neutral;                 //估算的中性點電壓
  32.         u32 CmtnPointerChangeCounter;//記錄兩次換向之間的時間,如果過大,則認為速度為0
  33.         u16 Revolutions;             //記錄了zerocross的換向次數
  34.         u16 StopTimeProtected;       //該值根據SPEEDMIN計算出的最大值,以50us(20K的中斷頻率下)為單位的次數
  35. } ZEROCROSS_OTYP;   

  36. typedef ZEROCROSS_OTYP *ZEROCROSS_handle;

  37. typedef struct
  38. {
  39.         //Statemachine 內部使用變量
  40.         u8  GuideState;              //當前狀態機的狀態
  41.         u16 uwStmTimebase;           //statemachine 時基(50us)
  42.         u16 uwStartAttemptCount;     //記錄接收到啟動命令之后,進入OFF_STATE的次數
  43.         u16 uwBemfThreshold;         //啟動過程中,反電勢過零比較時使用的閾值電壓,默認為100mv
  44.         u16 uwThreeComuThrehold;     //三步換向時,換向點的電平值
  45.         u16 uwBemf;                  //啟動過程中,記錄不通電那一相的端電壓
  46.         u32 uwAlignTime;             //轉子對位時間,默認為1.6s
  47.         u8  uwShortCycles;           //記錄剎車次數(一個OFF_STATE到另外一個OFF_STATE之間)
  48.         u16 uwSixStepCount;          //開環脈沖換向計數器,記錄了開環階段的換向次數,等于START_PLUSE_TOTALNUM
  49.         u8  CheckType;               //在START_PULSE_STATE使用,==1說明是電機未通電時轉速過高跳轉過來的,則進行過零點周期計算(類似于FIND_PERIOD),否則就發送3步換向脈沖
  50.         u16 BemfPrdSUM_SixStep;
  51.         u16 BemfPrdAVG_SixStep;      //記錄3步換向時,兩個BEMF的間隔值(50us時基),由BemfPrdSUM_SixStep平均而來
  52.         u16 BemfPrdAVG_OpenPulse;    //記錄OPEN_PULSE時,兩個BEMF的間隔值(50us時基),由BemfPrd_OpenPulse平均而來
  53.         u16 MaxDutyForStart;         //對應于最大限流值的占空比,用于開環啟動使用
  54.         u16 BemfPrd_SixStep;         //3步換向時,記錄兩個BEMF的間隔值(50us時基)
  55.         u16 BemfPrd_OpenPulse;       //OPEN_PULSE時,記錄兩個BEMF的間隔值(50us時基)
  56.         u16 uwCmtPRD_OpenPulse;      //OPEN_PULSE時換向間隔(50us時基),600=30ms
  57.         u8  SampleBemfEn_OpenPulse;  //==TRUE時可以采集過零點,每個cmtnpointer只采集一次
  58.         
  59.         //Statemachine 外部使用變量
  60.         u16 dutyCycleCmd;            //命令占空比,將在statemachine函數之后送入ramp模塊
  61.         u16 AvoidCommuteTimer;       //在OPEN_PULSE階段,每次檢測BEMF的時候,要避開二極管續流的那個點,
  62.                                  //換向后,當這個值大于START_PLUSE_COMMUTATE_TIME時才開始采樣BEMF
  63.         u8  CmtPtrKeep_OpenPulse;    //跳轉到STOP_1S_STATE之前,保存當前的cmtpointer值,在返回RUN_2S_STATE時,恢復cmtpointer.                                
  64.         u8  CmtPtrKeep_SixStep;      //在Three_step階段,保存pwm.cmtpointer的值
  65.         u32 Timer2S_trigger;         //在OPEN_PULSE階段,運行2S,觸發一次,跳入STOP_1S_STATE
  66.         u16 VirtualTimerKeep;        //在Three_step階段,用于計算BemfPeriod
  67.         u8  ExtenAdcSample;          //在電機啟動的部分中,ENABLE=采樣非關鍵ADC通道,例如母線電流,外部模擬量,模塊溫度等,序列采樣
  68.                                  //                    DISABLE=采集反電動勢
  69. }MOTORSTART_OTYP;
復制代碼

框架思路下載,還只是半成品,很多程序還未寫完:
structure define.zip (2.39 KB, 下載次數: 215)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:30271 發表于 2018-8-12 23:14 | 顯示全部樓層
兄弟 有源碼嗎?     求源碼!!
回復

使用道具 舉報

ID:15104 發表于 2018-8-22 16:21 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:15104 發表于 2018-8-22 16:21 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:82036 發表于 2018-11-4 17:18 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:474603 發表于 2019-7-23 14:59 | 顯示全部樓層
對無傳感控制有好的參考價值!
回復

使用道具 舉報

ID:96079 發表于 2019-8-15 21:19 | 顯示全部樓層
謝謝提供,話說這個是哪個上面的程序
回復

使用道具 舉報

ID:616041 發表于 2019-9-25 09:48 | 顯示全部樓層
大俠,能提供源碼嗎?
回復

使用道具 舉報

ID:691135 發表于 2020-2-10 22:53 | 顯示全部樓層
正在學習,參考一下,謝謝無私分享。
回復

使用道具 舉報

ID:691135 發表于 2020-2-10 23:05 | 顯示全部樓層
剛剛下載了,看了下,只有定義,沒有程序。如10樓問:話說哪個程序在哪里?
回復

使用道具 舉報

ID:400030 發表于 2020-8-14 16:14 | 顯示全部樓層
這是個啥,放了一堆定義,大家一起完善一下吧
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品亚洲一区二区三区 | 日韩在线观看一区 | 日韩最新网站 | 一区二区三区国产 | 成年人视频在线免费观看 | 国产精品久久毛片av大全日韩 | 日韩色在线| 欧美精品网站 | av午夜电影| 羞羞视频网 | 国产在线看片 | 亚洲成人免费视频在线 | 2020亚洲天堂 | 亚洲逼院 | 精品一区二区三区不卡 | 九九热免费看 | 日韩 欧美 二区 | 奇米影视77 | 观看毛片| 精久久 | 欧美日韩高清在线一区 | 日本一区二区三区在线观看 | 欧美一级在线 | 成人欧美一区二区三区视频xxx | 成人在线一区二区 | 久久小视频 | 日韩免费电影 | 福利国产 | 欧美偷偷操 | 美女久久久 | 一区二区三区播放 | 久久一区二区三区四区五区 | 国产日韩欧美中文 | av网站免费| 91九色婷婷| 午夜在线 | 精品一区二区三区在线视频 | 久久久久一区二区 | 中文字幕一区二区三区乱码在线 | 欧美精品一区二区免费 | 国产成人99久久亚洲综合精品 |