amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 1755|回复: 35

研究了很久,BLDC反电势波形始终不对,到底哪里有问题呢

[复制链接]
发表于 2016-11-17 00:32:53 | 显示全部楼层 |阅读模式
看了无数的帖子,浏览了无数的资料,用6步法驱动,本来以为应该不是啥难事,第一次做了个板子不行,以为硬件有问题,第二次又做了个板子,结果测试出来的ABC三相相电压波形还是跟之前一样,现在点击转起来了,但是始终反电势波形跟介绍的不一样,不知道问题在哪里,能帮我分析一下我的波形为什么会这么

不管怎么看始终看不出反电势过零点,到底哪里有问题呢......

第一个图和第二个图为电机用6步法转起来的时候测试的波形,第三幅图为电机用手堵住不转的时候的波形,可以看出来区别,但是反电势为什么没有过零点呢








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2016-11-17 08:27:54 | 显示全部楼层
本帖最后由 lcw_swust 于 2016-11-17 08:31 编辑

零点不代表0V,而是三个绕组星形接法的公共端,或者类似于三个相的平均值.
探头前加个RC低通会看着效果好一点.你这图看着像欠采样了.
http://www.jdzj.com/diangong/article/2010-7-30/20387-1.htm
 楼主| 发表于 2016-11-17 08:36:21 | 显示全部楼层
但是参考很多资料上面都是这样的波形,在pwm关闭的时候,可以观察到反电势过零点,所以非常迷惑,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2016-11-17 09:40:10 | 显示全部楼层
你的换相 顺序错了。
发表于 2016-11-17 09:42:32 来自手机 | 显示全部楼层
用手捏住电机转子,让它带阻力运行,标准波形就出来了
发表于 2016-11-17 12:15:20 | 显示全部楼层
相序估计是错了
发表于 2016-11-17 12:15:54 | 显示全部楼层
本帖最后由 cw628 于 2016-11-17 12:18 编辑

相序错了,仔细梳理下你的sensephase和驱动相位
发表于 2016-11-17 13:14:35 来自手机 | 显示全部楼层
电机的反电势与电机转速成正比,在电机恒定转速时怎么反电势会过零呢?只有当电机转速过零时,才会看到反电势过零现象。所以,lz前两张图观测的都是一定转速下的驱动器输出电压波形 ,怎么看得到过零波形?最令人纳闷的是,第三张图是堵转波形,电机都没转起来(s0=0)当然也看不到反电势了。另外提一句,lz 测驱动器输出电压波形,能观测到反电势么?反电势是电机绕组切割磁力线产生的电势,如何才能观测到?
 楼主| 发表于 2016-11-17 15:32:31 | 显示全部楼层
请教,我的相序是 AB AC BC BA CA CB  
很多资料上面都是这个相序啊,那么正确的应该是怎么样的顺序,贴身

请看一下我的换向部分
//AB AC BC BA CA CB->>>>>
    if (myData.motorInex==0)//AB
    {
        //AB  A占空比 B100%占空比 C全关
            
        TIM1->CCR1=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR2=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR3=0;
        PWM_AH_ON();
        PWM_AL_OFF();
        PWM_BH_OFF();
        PWM_BL_ON();
        PWM_CH_OFF();
        PWM_CL_OFF();
        SEL_C();
    }
    else if(myData.motorInex==1)//AC
    {
        //AC  A占空比 C100%占空比 B全关

        TIM1->CCR1=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR3=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR2=0;
        PWM_AH_ON();
        PWM_AL_OFF();
        PWM_CH_OFF();
        PWM_CL_ON();
        PWM_BH_OFF();
        PWM_BL_OFF();
        SEL_B();
    }
    else if(myData.motorInex==2)//BC
    {
        //BC  B占空比 C100%占空比 A全关
        TIM1->CCR2=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR3=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR1=0;
        PWM_BH_ON();
        PWM_BL_OFF();
        PWM_CH_OFF();
        PWM_CL_ON();
        PWM_AH_OFF();
        PWM_AL_OFF();
        SEL_A();
    }
    else if(myData.motorInex==3)//BA
    {   //BA  B占空比 A100%占空比 C全关

        TIM1->CCR2=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR1=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR3=0;
        PWM_BH_ON();
        PWM_BL_OFF();
        PWM_AH_OFF();
        PWM_AL_ON();
        PWM_CH_OFF();
        PWM_CL_OFF();
        SEL_C();
    }
    else if(myData.motorInex==4)//CA
    {   //CA C占空比 A100%占空比 B全关

        TIM1->CCR3=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR1=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR2=0;
        PWM_CH_ON();
        PWM_CL_OFF();
        PWM_AH_OFF();
        PWM_AL_ON();
        PWM_BH_OFF();
        PWM_BL_OFF();
        SEL_B();
    }
    else if(myData.motorInex==5)//CB
    {   //CB  C占空比 B100%占空比 A全关

        TIM1->CCR3=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR2=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR1=0;
        PWM_CH_ON();
        PWM_CL_OFF();
        PWM_BH_OFF();
        PWM_BL_ON();
        PWM_AH_OFF();
        PWM_AL_OFF();
        SEL_A();
    }
    TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
    if(++myData.motorInex>=6)
    {
        myData.motorInex=0;
    }
 楼主| 发表于 2016-11-17 15:34:21 | 显示全部楼层
wiser803 发表于 2016-11-17 13:14
电机的反电势与电机转速成正比,在电机恒定转速时怎么反电势会过零呢?只有当电机转速过零时,才会看到反电 ...

电机恒定转速的时候看不到反电势过零点么,那么电机闭环运行之后,怎么去正确换向呢..........
 楼主| 发表于 2016-11-17 15:35:32 | 显示全部楼层
//AB AC BC BA CA CB->>>>>
    if (myData.motorInex==0)//AB
    {
        //AB  A占空比 B100%占空比 C全关
            
        TIM1->CCR1=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR2=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR3=0;
        PWM_AH_ON();
        PWM_AL_OFF();
        PWM_BH_OFF();
        PWM_BL_ON();
        PWM_CH_OFF();
        PWM_CL_OFF();
        SEL_C();
    }
    else if(myData.motorInex==1)//AC
    {
        //AC  A占空比 C100%占空比 B全关

        TIM1->CCR1=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR3=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR2=0;
        PWM_AH_ON();
        PWM_AL_OFF();
        PWM_CH_OFF();
        PWM_CL_ON();
        PWM_BH_OFF();
        PWM_BL_OFF();
        SEL_B();
    }
    else if(myData.motorInex==2)//BC
    {
        //BC  B占空比 C100%占空比 A全关
        TIM1->CCR2=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR3=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR1=0;
        PWM_BH_ON();
        PWM_BL_OFF();
        PWM_CH_OFF();
        PWM_CL_ON();
        PWM_AH_OFF();
        PWM_AL_OFF();
        SEL_A();
    }
    else if(myData.motorInex==3)//BA
    {   //BA  B占空比 A100%占空比 C全关

        TIM1->CCR2=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR1=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR3=0;
        PWM_BH_ON();
        PWM_BL_OFF();
        PWM_AH_OFF();
        PWM_AL_ON();
        PWM_CH_OFF();
        PWM_CL_OFF();
        SEL_C();
    }
    else if(myData.motorInex==4)//CA
    {   //CA C占空比 A100%占空比 B全关

        TIM1->CCR3=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR1=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR2=0;
        PWM_CH_ON();
        PWM_CL_OFF();
        PWM_AH_OFF();
        PWM_AL_ON();
        PWM_BH_OFF();
        PWM_BL_OFF();
        SEL_B();
    }
    else if(myData.motorInex==5)//CB
    {   //CB  C占空比 B100%占空比 A全关

        TIM1->CCR3=(uint16_t)(((uint32_t)myData.dutyA * (TIM1->ARR )) / 1000+1);
        TIM1->CCR2=(uint16_t)(((uint32_t)1000 * (TIM1->ARR )) / 1000+1);
        TIM1->CCR1=0;
        PWM_CH_ON();
        PWM_CL_OFF();
        PWM_BH_OFF();
        PWM_BL_ON();
        PWM_AH_OFF();
        PWM_AL_OFF();
        SEL_A();
    }
    TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
    if(++myData.motorInex>=6)
    {
        myData.motorInex=0;
    }


住不放SEL_A是模拟开关,用于三选一进入比较器,  其他宏定义大家看名字就可以理解
发表于 2016-11-17 15:56:40 | 显示全部楼层
相序错了会这样的,把电机线或是霍尔线调下顺序吧!
 楼主| 发表于 2016-11-17 20:04:01 来自手机 | 显示全部楼层
无刷直流电机三相有区别吗 不是应该不区分的么
发表于 2016-11-17 22:06:20 | 显示全部楼层
有感还是无感的啊  哪个MCU啊
发表于 2016-11-17 22:48:12 | 显示全部楼层
本帖最后由 cw628 于 2016-11-17 22:50 编辑

用示波器看每个相位的输出驱动是否正确,SENSE是否采的是悬空项,上升下降沿是否正确,细心一些一定能发现问题的,看你的波形离检测到正确的过零点不远了,加油。
这么好的示波器不利用充分对不起呀
发表于 2016-11-17 22:48:36 | 显示全部楼层
wiser803 发表于 2016-11-17 13:14
电机的反电势与电机转速成正比,在电机恒定转速时怎么反电势会过零呢?只有当电机转速过零时,才会看到反电 ...

哥们儿,看3楼
 楼主| 发表于 2016-11-18 08:27:13 | 显示全部楼层
shiang 发表于 2016-11-17 22:06
有感还是无感的啊  哪个MCU啊

无感直流电机啊,用的stm32f030
 楼主| 发表于 2016-11-18 08:32:53 | 显示全部楼层

反电势过零点我也知道是跟虚拟的中点比较,令我不解的是,看资料上面的波形在pwm_on期间,峰值是一样的电平,只是pwm-off那部分会改变,也就是反响电动势

但是我自己的波形却是pwm-on期间,峰值在变化,二pwm-off这部分几乎不变,实在是想不出来哪里有问题了,相序也是按照AB AC BC BA CA CB这样的步骤变化了,能不能提示一下,我驱动的时候哪里不对了


我是用的是上桥臂采用pwm控制,下桥臂直通,比如  AB阶段   AH采用pwm控制 BL采用电平控制,CH和CL浮空,我晚上再创个6项驱动波形上去,能不能帮我分析下,到底哪里有问题
发表于 2016-11-18 09:06:30 | 显示全部楼层
f030有没有互补驱动模式,导通相的高端驱动用,改成这样后会很容易采到过零点,避免续流时的二极管压降淹没感应电动势
发表于 2016-11-18 09:13:03 | 显示全部楼层
有感无感,首先确定转子位置,然后分别按照顺序驱动无刷电机。每个位置有唯一一种驱动方式。如果波形不对,可以试试转动电机到不同的位置。还有你的示波器采集的几个通道啊?
 楼主| 发表于 2016-11-18 13:51:25 | 显示全部楼层
shiang 发表于 2016-11-18 09:13
有感无感,首先确定转子位置,然后分别按照顺序驱动无刷电机。每个位置有唯一一种驱动方式。如果波形不对, ...

谢谢你的回复,我觉得应该不是位置的问题,因为启动阶段,我用5ms间隔发送,电机能够转起来,这个时候应该能采集到波形的,我刚刚下午换了个电机,用老硬盘拆了个硬盘电机来试验,好像可以看到了,晚上在详细测量一次,办公室示波器太差

我在想是不是一开始我用的电机是星型连接的问题,买的是A2212/13T的四轴电机

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2016-11-18 13:52:16 | 显示全部楼层
cw628 发表于 2016-11-18 09:06
f030有没有互补驱动模式,导通相的高端驱动用,改成这样后会很容易采到过零点,避免续流时的二极管压降淹没 ...

F030有互补模式的啊,死区也有,我试过的
发表于 2016-11-22 09:21:50 | 显示全部楼层
启动的时候反电动势很小,又是强制换向波形很乱,所以是看不到的,正常转起来之后才有正常波形。
发表于 2016-11-23 11:27:23 | 显示全部楼层
示波器不错啊
 楼主| 发表于 2016-11-29 10:32:52 | 显示全部楼层
小小苹果 发表于 2016-11-22 09:21
启动的时候反电动势很小,又是强制换向波形很乱,所以是看不到的,正常转起来之后才有正常波形。 ...

你说的可能对,但是我有个疑问,如果启动阶段检测不到反电势,那么如何才能正常转起来呢.............
不是需要采集到反电势之后才能根据反电势正确的换相才能正常转起来么
发表于 2016-11-29 19:16:14 | 显示全部楼层
你这个就是反电动势波形,只是现在是开环,换相点不在正常的地方.所以看起来不太像.
发表于 2016-12-5 22:50:50 来自手机 | 显示全部楼层
楼主解决了吗,好像碰到一样的问题
发表于 2017-1-12 16:52:11 | 显示全部楼层
yuntian 发表于 2016-12-5 22:50
楼主解决了吗,好像碰到一样的问题

你的无感BLDC做的怎么样了?
 楼主| 发表于 2017-1-12 19:34:53 | 显示全部楼层
weichao4808335 发表于 2017-1-12 16:52
你的无感BLDC做的怎么样了?

已经转起来了,但是还有些问题,
发表于 2017-1-12 20:00:15 | 显示全部楼层
这问题 这么明显,尽然没几个人发现。
发表于 2017-1-12 21:57:37 | 显示全部楼层
weichao4808335 发表于 2017-1-12 16:52
你的无感BLDC做的怎么样了?


顺利切入闭环了,但是有一个奇怪的问题,进入闭环后,我缓慢提高占空比,当转速达到一定的时候,大概1ms的换相周期时,在B相PWM,C相置高时,A相检测反电势总是会超时,而且6步中只有这一步会出现这个现象,奇怪
 楼主| 发表于 2017-1-13 08:29:19 | 显示全部楼层
我发不了短消息,能不能发我一个消息,我们一起研究,...........你懂的...
 楼主| 发表于 2017-1-13 08:30:09 | 显示全部楼层
weichao4808335 发表于 2017-1-12 16:52
你的无感BLDC做的怎么样了?

我发不了短消息,能不能发我一个消息,我们一起研究,...........你懂的...
发表于 2017-2-20 16:13:42 | 显示全部楼层
yuntian 发表于 2017-1-12 21:57
顺利切入闭环了,但是有一个奇怪的问题,进入闭环后,我缓慢提高占空比,当转速达到一定的时候,大概1ms ...

我也是你这个情况,你的问题解决了吗?
发表于 2017-2-20 20:30:58 来自手机 | 显示全部楼层
先不通电空转看波形确定相序
发表于 2017-10-11 13:33:45 | 显示全部楼层
本帖最后由 yueliangz0123 于 2017-10-11 13:39 编辑

你怎么搞好的??可以说一下么??你看看我的波形~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 粤ICP备09047143号 )

GMT+8, 2017-10-22 19:46

阿莫电子论坛, 原"中国电子开发网"

© 2004-2016 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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