找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12032|回复: 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, 下载次数: 213)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:30271 发表于 2018-8-12 23:14 | 只看该作者
兄弟 有源码吗?     求源码!!
回复

使用道具 举报

板凳
ID:15104 发表于 2018-8-22 16:21 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:15104 发表于 2018-8-22 16:21 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:82036 发表于 2018-11-4 17:18 | 只看该作者
感谢楼主
回复

使用道具 举报

6#
ID:474603 发表于 2019-7-23 14:59 | 只看该作者
对无传感控制有好的参考价值!
回复

使用道具 举报

7#
ID:96079 发表于 2019-8-15 21:19 | 只看该作者
谢谢提供,话说这个是哪个上面的程序
回复

使用道具 举报

8#
ID:616041 发表于 2019-9-25 09:48 | 只看该作者
大侠,能提供源码吗?
回复

使用道具 举报

9#
ID:691135 发表于 2020-2-10 22:53 | 只看该作者
正在学习,参考一下,谢谢无私分享。
回复

使用道具 举报

10#
ID:691135 发表于 2020-2-10 23:05 | 只看该作者
刚刚下载了,看了下,只有定义,没有程序。如10楼问:话说哪个程序在哪里?
回复

使用道具 举报

11#
ID:400030 发表于 2020-8-14 16:14 | 只看该作者
这是个啥,放了一堆定义,大家一起完善一下吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表