搜索
bottom↓
回复: 5

用avr的mega32来控制电机,闭环控制

[复制链接]

出0入0汤圆

发表于 2012-4-2 16:11:24 | 显示全部楼层 |阅读模式
我用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, 杜汶泽)

出0入0汤圆

发表于 2012-4-2 16:12:39 | 显示全部楼层
你这个检测速度的原理是什么?

出0入0汤圆

 楼主| 发表于 2012-4-5 18:44:17 | 显示全部楼层
UNIFAN 发表于 2012-4-2 16:12
你这个检测速度的原理是什么?

通过直流电机霍尔传感器传回来的高低电平

出0入0汤圆

发表于 2012-4-6 10:33:31 | 显示全部楼层
微观的看电机的速度实际上是很不稳定的,会在平均速度上下一定范围类振动,可以考虑多次测量取平均值的方法来获得比较准确的数值

出0入0汤圆

发表于 2012-4-6 10:44:23 | 显示全部楼层
最好用中断!

出0入0汤圆

 楼主| 发表于 2012-4-6 12:28:34 | 显示全部楼层
1181zjf 发表于 2012-4-6 10:44
最好用中断!

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

本版积分规则

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

GMT+8, 2024-7-23 19:21

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

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