搜索
bottom↓
回复: 37

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

[复制链接]

出0入0汤圆

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

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

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








本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2016-11-17 08:36:21 | 显示全部楼层
但是参考很多资料上面都是这样的波形,在pwm关闭的时候,可以观察到反电势过零点,所以非常迷惑,

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 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;
    }

出0入0汤圆

 楼主| 发表于 2016-11-17 15:34:21 | 显示全部楼层
wiser803 发表于 2016-11-17 13:14
电机的反电势与电机转速成正比,在电机恒定转速时怎么反电势会过零呢?只有当电机转速过零时,才会看到反电 ...

电机恒定转速的时候看不到反电势过零点么,那么电机闭环运行之后,怎么去正确换向呢..........

出0入0汤圆

 楼主| 发表于 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是模拟开关,用于三选一进入比较器,  其他宏定义大家看名字就可以理解

出0入0汤圆

 楼主| 发表于 2016-11-17 20:04:01 来自手机 | 显示全部楼层
无刷直流电机三相有区别吗 不是应该不区分的么

出0入0汤圆

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

无感直流电机啊,用的stm32f030

出0入0汤圆

 楼主| 发表于 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项驱动波形上去,能不能帮我分析下,到底哪里有问题

出0入0汤圆

 楼主| 发表于 2016-11-18 13:51:25 | 显示全部楼层
shiang 发表于 2016-11-18 09:13
有感无感,首先确定转子位置,然后分别按照顺序驱动无刷电机。每个位置有唯一一种驱动方式。如果波形不对, ...

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

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

本帖子中包含更多资源

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

x

出0入0汤圆

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

F030有互补模式的啊,死区也有,我试过的

出0入0汤圆

 楼主| 发表于 2016-11-29 10:32:52 | 显示全部楼层
小小苹果 发表于 2016-11-22 09:21
启动的时候反电动势很小,又是强制换向波形很乱,所以是看不到的,正常转起来之后才有正常波形。 ...

你说的可能对,但是我有个疑问,如果启动阶段检测不到反电势,那么如何才能正常转起来呢.............
不是需要采集到反电势之后才能根据反电势正确的换相才能正常转起来么

出0入0汤圆

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

已经转起来了,但是还有些问题,

出0入0汤圆

 楼主| 发表于 2017-1-13 08:29:19 | 显示全部楼层
我发不了短消息,能不能发我一个消息,我们一起研究,...........你懂的...

出0入0汤圆

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

我发不了短消息,能不能发我一个消息,我们一起研究,...........你懂的...
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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