搜索
bottom↓
回复: 9

用32做的电调卡顿的问题

[复制链接]

出0入0汤圆

发表于 2016-6-4 01:37:45 | 显示全部楼层 |阅读模式
在论坛里面潜水看了一些电调的资料,刚好接触了一点点STM32,就用STM32做了个电调,电路参考的是德国MK的设计,采用上P下N的方式,因为32里面没有比较器,直接用的ADC采集来进行过零检测和换相,还没有试过输入捕获的方式。在用ADC采集的操作过程中,发现电机一直有一些卡顿的现象,请大神帮忙看看是哪里出了问题?听别人说用32的ADC采集来用作判断过零检测的话对于ADC的采集值还需要一个低通滤波,哪位大神有这方面的资料求共享。电调的视频后面上传,下面是电调的换相的代码,求大神指正下。

void BLMC_Step(void)                        //»»Ïà
{
       
        switch (Step)
        {
                case 0:                                                //AB
                        AH=PWM_val;BH=0;CH=0;
                        AL=0;BL=1;CL=0;

                        while(1)
                        {
                                adc_c=Get_ADC_Average(NULL_C,5);
                                middle=Get_ADC_Average(MIDDLE,5);
                                mc=middle-adc_c;
                                if(mc)
                                {
                                        delay_us(140);
                                        break;       
                                }                                       
                        }
                        Change_Sta=1;
                        break;
                       
                case 1:                                                                //AC
                        AH=PWM_val;BH=0;CH=0;
                        AL=0;BL=0;CL=1;
                        while(1)
                        {
                                middle=Get_ADC_Average(MIDDLE,5);
                                adc_b=Get_ADC_Average(NULL_B,5);
                                bm=adc_b-middle;
                                if(bm)
                                {
                                        delay_us(140);
                                        break;
                                }
                        }
                        Change_Sta=1;
                        break;
               
                case 2:                                                        //BC
                        AH=0;BH=PWM_val;CH=0;
                        AL=0;BL=0;CL=1;
                        while(1)
                        {
                                middle=Get_ADC_Average(MIDDLE,5);
                                adc_a=Get_ADC_Average(NULL_A,5);
                                ma=middle-adc_a;
                                if(ma)
                                {
                                        delay_us(140);
                                        break;
                                }
                        }
                        Change_Sta=1;
                        break;
               
                case 3:                                                //BA
                        AH=0;BH=PWM_val;CH=0;
                        AL=1;BL=0;CL=0;
                        while(1)
                        {
                                adc_c=Get_ADC_Average(NULL_C,5);
                                middle=Get_ADC_Average(MIDDLE,5);
                                cm=adc_c-middle;
                                if(cm)
                                {
                                        delay_us(140);
                                        break;
                                }
                        }
                        Change_Sta=1;
                        break;
                       
                case 4:       //CA
                        AH=0;BH=0;CH=PWM_val;
                        AL=1;BL=0;CL=0;
                        while(1)
                        {
                                middle=Get_ADC_Average(MIDDLE,5);
                                adc_b=Get_ADC_Average(NULL_B,5);
                                mb=middle-adc_b;
                                if(mb)
                                {
                                        delay_us(140);
                                        break;
                                }
                        }
                        Change_Sta=1;
                        break;
                       
                case 5:     //CB
                        AH=0;BH=0;CH=PWM_val;
                        AL=0;BL=1;CL=0;
                        while(1)
                        {
                                middle=Get_ADC_Average(MIDDLE,5);
                                adc_a=Get_ADC_Average(NULL_A,5);
                                am=adc_a-middle;
                                if(am)
                                {
                                        delay_us(140);
                                        break;
                                }
                        }
                        Change_Sta=1;
                        break;
                       
                default:
                        break;
        }
                       
}

void BLMC_Star()
{
        switch (Step)
        {
                case 0:                                                                                //AB
                        AH=PWM_val;BH=0;CH=0;
                        AL=0;BL=1;CL=0;
                        break;
               
                case 1:                                                                        //AC
                        AH=PWM_val;BH=0;CH=0;
                  AL=0;BL=0;CL=1;
                        break;
               
                case 2:                                                                        //BC
                        AH=0;BH=PWM_val;CH=0;
                        AL=0;BL=0;CL=1;
                        break;
               
                case 3:                                                                        //BA
                        AH=0;BH=PWM_val;CH=0;
                        AL=1;BL=0;CL=0;
                        break;
               
                case 4:                                                                        //CA
                        AH=0;BH=0;CH=PWM_val;
                        AL=0;BL=0;CL=0;
                        break;
               
                case 5:                                                                //CB
                        AH=0;BH=0;CH=PWM_val;
                        AL=0;BL=1;CL=0;
                        break;
               
                default:
                        break;
        }
}
void  BLMC_Change()  //Ï൱ÓÚÄ£Äâ±È½ÏÆ÷µÄÖжϣ¬Ðè·ÅÔÚwhile(1)Ö⻶ÏɨÃè
{
       
                BLMC_Step();

                if(Step<5)
                {
                        Step++;
                }
                else
                {
                        Step=0;
                }                               
}

char Star()
{
        unsigned int timer=300;
        unsigned int i;
        PWM_val=200;
        Step=0;
        BLMC_Star();       
        delay_ms(50);
        while(1)
        {
                for(i=0;i<timer;i++)
                {
                        delay_us(50);
                }
                timer-=timer/15+1;
                if(timer<25) return(1);
                BLMC_Star();
                if(Step<5) Step++;
                else       Step=0;
                Change_Sta=1;
        }
}

void Stop()
{
        AH=0;BH=0;CH=0;
}

出0入0汤圆

 楼主| 发表于 2016-6-4 01:38:23 | 显示全部楼层
顶一个,求大神帮忙解决下问题

出0入0汤圆

 楼主| 发表于 2016-6-4 01:51:05 | 显示全部楼层
这个是程序源码,方便指正

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2016-6-4 20:39:52 | 显示全部楼层
嗯,这个看不到原始数据比较痛苦的。
你的 ADC 采样的时候有注意同步在 pwm 的什么周期位置采样吗?
不然你就把 pwm 的激励信号给采样进去了。我看你程序没有看到
pwm 同步的机制。

出0入0汤圆

 楼主| 发表于 2016-6-4 22:15:46 | 显示全部楼层
那就是说我没有同步PWM的话,采集ADC的时候有PWM的耦合信号进去,采集到的和实际值是不对等的,不能作为判断依据,必须在PWM调制周期的某个段固定采集才是准确的哦。谢谢了!我试试

出0入0汤圆

 楼主| 发表于 2016-6-4 22:16:26 | 显示全部楼层
helislayer 发表于 2016-6-4 20:39
嗯,这个看不到原始数据比较痛苦的。
你的 ADC 采样的时候有注意同步在 pwm 的什么周期位置采样吗?
不然你 ...

那就是说我没有同步PWM的话,采集ADC的时候有PWM的耦合信号进去,采集到的和实际值是不对等的,不能作为判断依据,必须在PWM调制周期的某个段固定采集才是准确的哦。谢谢了!我试试

出0入0汤圆

发表于 2016-6-4 22:43:24 | 显示全部楼层
makeflyeasy 发表于 2016-6-4 22:15
那就是说我没有同步PWM的话,采集ADC的时候有PWM的耦合信号进去,采集到的和实际值是不对等的,不能作为判 ...

如果你不是同步的话,你就要考虑到 pwm 带来的干扰。
所以有所谓的滤波什么,就是用多个采样来平均掉那个
pwm 带来的干扰。因为 pwm 是高频信号,滤波一下就
平缓了,那个零点电动势是低频信号,不被滤波影响的。

滤波是以时间延迟为代价的,所以能够同步的话最好。

出0入0汤圆

发表于 2016-8-5 13:49:20 | 显示全部楼层
楼主,可否解释一下,为什么,要在pwm周期的特定位置进行采样,第三项不是在高低电平的时候和中点电压比较的结果是一样的吗?

出0入0汤圆

 楼主| 发表于 2016-8-18 17:55:23 | 显示全部楼层
Crazy_snail 发表于 2016-8-5 13:49
楼主,可否解释一下,为什么,要在pwm周期的特定位置进行采样,第三项不是在高低电平的时候和中点电压比较 ...

最后那一句没看懂你啥意思

出0入0汤圆

 楼主| 发表于 2016-8-18 18:13:47 | 显示全部楼层
helislayer 发表于 2016-6-4 22:43
如果你不是同步的话,你就要考虑到 pwm 带来的干扰。
所以有所谓的滤波什么,就是用多个采样来平均掉那个 ...

这个是做的PCB

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-4-19 07:03

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

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