|
在论坛里面潜水看了一些电调的资料,刚好接触了一点点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;
} |
|