|
我用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[2];
}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[0] = TCNT1L;
time.regsiter[1] = 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;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|