打印
[STM8]

无霍尔无刷电机方向控制程序

[复制链接]
5383|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
求大师指点无霍尔无刷驱动器程序,可以有流程图说明吗
沙发
2010小老虎2010|  楼主 | 2017-11-1 15:58 | 只看该作者
每当我来到一片新天地时却发现已经来晚了,满地热闹过后的萧条,物犹在人去空!沧海变桑田。如果上天再给我一次机会的话,我想说请让我早来10年。。。

使用特权

评论回复
板凳
kingkits| | 2017-11-1 16:08 | 只看该作者
小白来问问题,真的不知从何说起

使用特权

评论回复
地板
2010小老虎2010|  楼主 | 2017-11-1 17:14 | 只看该作者
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;

使用特权

评论回复
5
2010小老虎2010|  楼主 | 2017-11-1 17:16 | 只看该作者
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;

使用特权

评论回复
6
kingkits| | 2017-11-1 17:25 | 只看该作者
你该先看看无刷电机的工作原理

使用特权

评论回复
7
kingkits| | 2017-11-1 17:30 | 只看该作者
看看

使用特权

评论回复
8
kingkits| | 2017-11-1 17:34 | 只看该作者
看看这个,看完再看代码

瑞萨内部培训BLDC电机120度带霍尔方波驱动.rar

4.82 MB

使用特权

评论回复
9
2010小老虎2010|  楼主 | 2017-11-1 17:36 | 只看该作者
拜谢!

使用特权

评论回复
10
mmuuss586| | 2017-11-1 17:40 | 只看该作者

找那本:STM8的BLDC控制书籍教程看看好了

使用特权

评论回复
11
gfjshenglei| | 2017-11-1 19:06 | 只看该作者
授人予鱼,不如授人予渔。楼主,稍安勿躁,多看看电机控制理论书籍吧。

使用特权

评论回复
12
2010小老虎2010|  楼主 | 2017-11-2 08:39 | 只看该作者
gfjshenglei 发表于 2017-11-1 19:06
授人予鱼,不如授人予渔。楼主,稍安勿躁,多看看电机控制理论书籍吧。

求介绍几本经典的

使用特权

评论回复
13
2010小老虎2010|  楼主 | 2017-11-2 08:52 | 只看该作者
国内有关于无刷驱动编程的培训吗?之前到上海参加过电机控制基础培训,讲师说的太浅显,没涉及到编程这块,还有就是能买到成功的无刷驱动器程序和配套硬件也可以加快学习步伐,有视频教程买也不错

使用特权

评论回复
14
kingkits| | 2017-11-2 10:53 | 只看该作者
别想走捷径,这个很需要功力的,没经验就老老实实的从0开始,这才是本色。

使用特权

评论回复
15
kingkits| | 2017-11-2 10:54 | 只看该作者
一个优秀的电机控制模块售价要3000+,如果没有技术含量,早就满街都是仿制品了。

使用特权

评论回复
16
ld风吹过| | 2017-11-2 11:43 | 只看该作者
可以去MICROCHIP,英飞凌官网看看

GS001-BLDC电机控制入门.pdf

761.34 KB

使用特权

评论回复
17
kingkits| | 2017-11-2 14:27 | 只看该作者
再给你一个更详细的**

无刷电机攻略.pdf

4.58 MB

使用特权

评论回复
18
QuakeGod| | 2017-11-2 16:31 | 只看该作者
不要上来就说程序啊,编程什么的。
这里面需要很多的数学理论。即便不透彻理解,至少也要知道是怎么回事,然后再说编程。
就好像要设计一个房子跟磊砖头完全是两回事。

使用特权

评论回复
19
haiyi911| | 2017-11-2 17:18 | 只看该作者
kingkits 发表于 2017-11-1 17:34
看看这个,看完再看代码

你好,压缩包有损坏哦

使用特权

评论回复
20
2010小老虎2010|  楼主 | 2017-11-2 17:20 | 只看该作者
感谢各位的热心帮助!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

49

帖子

3

粉丝