用avr的mega32来控制电机,闭环控制
我用mega32来控制无刷直流电机,没有用t1定时器的输入捕捉功能,而是用了一个普通口来测电机的速度,但是速度读的不准,不知道什么问题,代码如下void sys_readspeed(void)
{
u16 sum = 0;
u8 err = 0;
do{
sum = speedonce();
if(sum == 0)
{
err++;
if(err >= 3){
sys_write_AD5320(0);
MC30335_CS = 1;
sys_write_AD5320(1500);
DogFeed();
sys_delay(30000);
MC30335_CS = 0;
DogFeed();
sys_delay(30000);
err = 0;
}
}
else
{
err = 0;
}
}while(sum == 0);
system.speed_current = sum;
}
u16 speedonce(void)
{
u8 i;
u32 result = 0;
u8 flag = TRUE;
union {
u16 data;
u8 regsiter;
}time;
if(testrun())
{
TIMSK |= 1<<TOIE1;
TCNT1H = 0;
TCNT1L = 0;
for(i=0;i<4;i++){
if(!testrun());
flag = FALSE;
}
if(flag == TRUE){
time.regsiter = TCNT1L;
time.regsiter = TCNT1H;
TIMSK &= ~(1<<TOIE1);
if(system.timer1cnt >= 200)
result = 0;
else{
result = time.data+system.timer1cnt*65535;
result = 1920000000/result;
}
}
}
return result;
}
u8 testrun(void)
{
u16 max_time = 50000;
u16 i,j,k;
u8 result = 0;
DogFeed();
for(i = 0;i< max_time;i++){
if(PIC_SA){
for(j = 0;j<max_time;j++){
if(!PIC_SA){
for(k = 0;k<max_time;k++){
if(PIC_SA){
result = 1;
break;
}
else{
if(TIFR&0x04 != 0){
TIFR &= (~(0x04));
system.timer1cnt++;
}
}
}
}
else{
if(TIFR&0x04 != 0){
TIFR&=(~(0x04));
system.timer1cnt++;
}
}
}
}
else{
if(TIFR&0x04 != 0){
TIFR&=(~(0x04));
system.timer1cnt++;
}
}
}
DogFeed();
return result;
} 你这个检测速度的原理是什么? UNIFAN 发表于 2012-4-2 16:12 static/image/common/back.gif
你这个检测速度的原理是什么?
通过直流电机霍尔传感器传回来的高低电平 微观的看电机的速度实际上是很不稳定的,会在平均速度上下一定范围类振动,可以考虑多次测量取平均值的方法来获得比较准确的数值 最好用中断! 1181zjf 发表于 2012-4-6 10:44 static/image/common/back.gif
最好用中断!
我现在改用T1的输入捕捉来测电机速度了,但是测得不准,速度乱跳,跟实际速度相差很大
页:
[1]