标题:
STM32无刷电机EMF过零检测程序源码模板(注释很详细)求大神完善
[打印本页]
作者:
kometlp
时间:
2018-5-9 15:32
标题:
STM32无刷电机EMF过零检测程序源码模板(注释很详细)求大神完善
最近在研究BLDC电机的控制,四处搜集资料,附件中是基于EMF过零检测控制BLDC的程序,目前只有用到的结构体变量定义部分,可以提供些程序框架思路。
带有详细注释的单片机源程序框架如下:
if((uwMspVirtualTimer - uwMspVirtualTimerKeep)>msp->uwCmtPRD_OpenPulse)
{
pwm1.CmtnPointer-=1;
if(pwm1.CmtnPointer>0xF0)
{
pwm1.CmtnPointer=5;
}
msp->SampleBemfEn_OpenPulse=TRUE;
msp->ExtenAdcSample=DISABLE;//DETECT BEMF
msp->AvoidCommuteTimer=0;
msp->dutyCycleCmd=OPEN_STARTUP_DUTY;//sysVar.InputAnalogRef;//注意ANA_INPUT_MIN限制
msp->uwSixStepCount++;
uwMspVirtualTimerKeep = uwMspVirtualTimer;
}
//Define the zeroCross structure
typedef struct
{
u16 timer; //过零检测用时间计数器,时基为50us
u8 state; //过零检测状态
u16 compare; //过零换向延迟30°的时间
u16 period; //两个cntr之间的时间(60°电角度)
u16 oldPeriod; //记录上一次的Period
u16 periodARY[6]; //存储过去6次的period
u8 CmtnPointer; //存储经由zerocross计算出的cntr,用于向pwm1.cntr赋值
u8 detected**; //过零点检测标志位,在检测到过零点之后被置为TRUE,然后在等待30°换向的过程中被置FALSE(有效时间很短)
u8 diodeDelayTimer; //用于表示换向去磁阶段(由续流二极管引起)不检测反电势的时间
u16 periodAcc; //用于存储之前6次的period之和,用于计算period平均值averagePeriod6
u16 averagePeriod6; //等于periodAcc/6,算出平均period的值
u8 phaseAdvance; //超前换向补偿,这个值用于补偿因滤波导致过零点的滞后,以减小延迟30°的时间,需要根据实际的硬件电路进行校正
//FIR阶数的一半为FIR引入的群延迟时间,在换向时要进行补偿
u16 neutral; //估算的中性点电压
u32 CmtnPointerChangeCounter;//记录两次换向之间的时间,如果过大,则认为速度为0
u16 Revolutions; //记录了zerocross的换向次数
u16 StopTimeProtected; //该值根据SPEEDMIN计算出的最大值,以50us(20K的中断频率下)为单位的次数
} ZEROCROSS_OTYP;
typedef ZEROCROSS_OTYP *ZEROCROSS_handle;
typedef struct
{
//Statemachine 内部使用变量
u8 GuideState; //当前状态机的状态
u16 uwStmTimebase; //statemachine 时基(50us)
u16 uwStartAttemptCount; //记录接收到启动命令之后,进入OFF_STATE的次数
u16 uwBemfThreshold; //启动过程中,反电势过零比较时使用的阈值电压,默认为100mv
u16 uwThreeComuThrehold; //三步换向时,换向点的电平值
u16 uwBemf; //启动过程中,记录不通电那一相的端电压
u32 uwAlignTime; //转子对位时间,默认为1.6s
u8 uwShortCycles; //记录刹车次数(一个OFF_STATE到另外一个OFF_STATE之间)
u16 uwSixStepCount; //开环脉冲换向计数器,记录了开环阶段的换向次数,等于START_PLUSE_TOTALNUM
u8 CheckType; //在START_PULSE_STATE使用,==1说明是电机未通电时转速过高跳转过来的,则进行过零点周期计算(类似于FIND_PERIOD),否则就发送3步换向脉冲
u16 BemfPrdSUM_SixStep;
u16 BemfPrdAVG_SixStep; //记录3步换向时,两个BEMF的间隔值(50us时基),由BemfPrdSUM_SixStep平均而来
u16 BemfPrdAVG_OpenPulse; //记录OPEN_PULSE时,两个BEMF的间隔值(50us时基),由BemfPrd_OpenPulse平均而来
u16 MaxDutyForStart; //对应于最大限流值的占空比,用于开环启动使用
u16 BemfPrd_SixStep; //3步换向时,记录两个BEMF的间隔值(50us时基)
u16 BemfPrd_OpenPulse; //OPEN_PULSE时,记录两个BEMF的间隔值(50us时基)
u16 uwCmtPRD_OpenPulse; //OPEN_PULSE时换向间隔(50us时基),600=30ms
u8 SampleBemfEn_OpenPulse; //==TRUE时可以采集过零点,每个cmtnpointer只采集一次
//Statemachine 外部使用变量
u16 dutyCycleCmd; //命令占空比,将在statemachine函数之后送入ramp模块
u16 AvoidCommuteTimer; //在OPEN_PULSE阶段,每次检测BEMF的时候,要避开二极管续流的那个点,
//换向后,当这个值大于START_PLUSE_COMMUTATE_TIME时才开始采样BEMF
u8 CmtPtrKeep_OpenPulse; //跳转到STOP_1S_STATE之前,保存当前的cmtpointer值,在返回RUN_2S_STATE时,恢复cmtpointer.
u8 CmtPtrKeep_SixStep; //在Three_step阶段,保存pwm.cmtpointer的值
u32 Timer2S_trigger; //在OPEN_PULSE阶段,运行2S,触发一次,跳入STOP_1S_STATE
u16 VirtualTimerKeep; //在Three_step阶段,用于计算BemfPeriod
u8 ExtenAdcSample; //在电机启动的部分中,ENABLE=采样非关键ADC通道,例如母线电流,外部模拟量,模块温度等,序列采样
// DISABLE=采集反电动势
}MOTORSTART_OTYP;
复制代码
框架思路下载,还只是半成品,很多程序还未写完:
structure define.zip
(2.39 KB, 下载次数: 215)
2018-5-9 15:32 上传
点击文件名下载附件
作者:
lushp88
时间:
2018-8-12 23:14
兄弟 有源码吗? 求源码!!
作者:
zxgpy
时间:
2018-8-22 16:21
谢谢分享
作者:
zxgpy
时间:
2018-8-22 16:21
谢谢分享
作者:
huafeixue8
时间:
2018-11-4 17:18
感谢楼主
作者:
chenyixian
时间:
2019-7-23 14:59
对无传感控制有好的参考价值!
作者:
a20084666
时间:
2019-8-15 21:19
谢谢提供,话说这个是哪个上面的程序
作者:
lf642411
时间:
2019-9-25 09:48
大侠,能提供源码吗?
作者:
bowaterbo
时间:
2020-2-10 22:53
正在学习,参考一下,谢谢无私分享。
作者:
bowaterbo
时间:
2020-2-10 23:05
刚刚下载了,看了下,只有定义,没有程序。如10楼问:话说哪个程序在哪里?
作者:
鑫1996
时间:
2020-8-14 16:14
这是个啥,放了一堆定义,大家一起完善一下吧
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1