用32做的电调卡顿的问题
在论坛里面潜水看了一些电调的资料,刚好接触了一点点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;
}
}
voidBLMC_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;
} 顶一个,求大神帮忙解决下问题 这个是程序源码,方便指正 嗯,这个看不到原始数据比较痛苦的。
你的 ADC 采样的时候有注意同步在 pwm 的什么周期位置采样吗?
不然你就把 pwm 的激励信号给采样进去了。我看你程序没有看到
pwm 同步的机制。
那就是说我没有同步PWM的话,采集ADC的时候有PWM的耦合信号进去,采集到的和实际值是不对等的,不能作为判断依据,必须在PWM调制周期的某个段固定采集才是准确的哦。谢谢了!我试试 helislayer 发表于 2016-6-4 20:39
嗯,这个看不到原始数据比较痛苦的。
你的 ADC 采样的时候有注意同步在 pwm 的什么周期位置采样吗?
不然你 ...
那就是说我没有同步PWM的话,采集ADC的时候有PWM的耦合信号进去,采集到的和实际值是不对等的,不能作为判断依据,必须在PWM调制周期的某个段固定采集才是准确的哦。谢谢了!我试试 makeflyeasy 发表于 2016-6-4 22:15
那就是说我没有同步PWM的话,采集ADC的时候有PWM的耦合信号进去,采集到的和实际值是不对等的,不能作为判 ...
如果你不是同步的话,你就要考虑到 pwm 带来的干扰。
所以有所谓的滤波什么,就是用多个采样来平均掉那个
pwm 带来的干扰。因为 pwm 是高频信号,滤波一下就
平缓了,那个零点电动势是低频信号,不被滤波影响的。
滤波是以时间延迟为代价的,所以能够同步的话最好。
楼主,可否解释一下,为什么,要在pwm周期的特定位置进行采样,第三项不是在高低电平的时候和中点电压比较的结果是一样的吗? Crazy_snail 发表于 2016-8-5 13:49
楼主,可否解释一下,为什么,要在pwm周期的特定位置进行采样,第三项不是在高低电平的时候和中点电压比较 ...
最后那一句没看懂你啥意思 helislayer 发表于 2016-6-4 22:43
如果你不是同步的话,你就要考虑到 pwm 带来的干扰。
所以有所谓的滤波什么,就是用多个采样来平均掉那个 ...
这个是做的PCB
页:
[1]