搜索
bottom↓
回复: 11

求教直流无刷电机的测速问题

[复制链接]

出0入0汤圆

发表于 2012-4-7 12:08:41 | 显示全部楼层 |阅读模式
本帖最后由 wuminhdu 于 2012-4-7 13:39 编辑

用的是有位置传感器的无刷直流电机,代码如下面,pic_sa是连着电机的一个位置传感器的,就是用PIC_SA引脚来确定电机的位置,电机转一圈,PIC_SA有4次高低电平切换,然后记录下4次电平切换的时间,也就是电机转一圈的时间,用示波器测PIC_SA引脚的电平变化很标准,没有毛刺,占空比50%,也就是没有问题,但是单片机经运算后的实际电机转速跳动很大(比如正常速度500左右,他可能会跳到1000多),是什么原因,使用T1捕捉功能也是如上问题,测速不准就谈不上电机控制了,很纠结,是我定时器配置有问题吗,或是是其他什么问题,求高手不吝赐教。
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
    system.timer1cnt++;
}
void Timer_Init(void)//时钟初始化
{

    OCR0 = 0x7C;  //1ms
    TCNT0 = 0x00;
    TCCR0 = (1<<WGM01)|(1<<CS01)|(1<<CS00); // CTC 8M/64

    TCCR1B = 0x01;//1:1预分频
    TCNT1H = 0;
    TCNT1L = 0;
    ASSR = 0x00;
    TIMSK = 0x02;//溢出中断使能
    TIFR = 0x00;
}
void sys_readspeed(void)//求电机转速函数
{
     u8 err = 0,j,k = 0;
    u16 sum = 0;

    do{
         sum = speedonce();//求一次转速
        if(sum == 0)
        {
            err++;
            k++;
            if(err >= 3){//如果电机3次测得速度为0,重启电机
               sys_write_AD5320(0);
               MC30335_CS = 1;
               sys_write_AD5320(2000);
               DogFeed();
               sys_delay(30000);
               MC30335_CS = 0;
               DogFeed();
               sys_delay(30000);
               err = 0;
               sys_beepcnt(90);
            }
        }
        else
        {
            err = 0;
            k = 0;
        }
        if(k >= 50)
            break;
    }while(sum == 0);
    system.speed_current = sum;//当前电机转速赋值
}
u16 speedonce(void)//
{

    u8 i;
   static  u32 result = 0;
    u8 flag = FALSE;
    union {
        u16 data;
        u8 regsiter[2];
    }time;

    TCNT1H = 0;
    TCNT1L = 0;

    if(testrun())
    {
        system.timer1cnt = 0;//T1溢出次数
        TIFR = 0x04;//置0T1溢出中断标记
        TIMSK = 0x06;//T1溢出使能,T0是CTC模式
        flag = TRUE;
        for(i=0;i<4;i++){//转一圈有4次电平切换
            if(!testrun())
               flag = FALSE;
        }
        if(flag){
            time.regsiter[0] = TCNT1L;
            time.regsiter[1] = TCNT1H;
            TIMSK = 0x02;
            if(system.timer1cnt >= 50)
                result = 0;
            else{
                result = time.data+system.timer1cnt*65535;//T1定时器的时间
                result = 480000000/result;//计算电机速度60/(1/(8M*result));
            }
        }
        else{
            result = 0;
        }
    }
    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;
                        }
                    }
                }
                if(result)
                    break;
            }
         }
         if(result)
            break;
    }
    DogFeed();
    return result;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-4-7 12:09:14 | 显示全部楼层
在线等回复哦

出0入0汤圆

 楼主| 发表于 2012-4-7 13:26:35 | 显示全部楼层
求人指点啊

出0入0汤圆

发表于 2012-4-7 13:28:26 | 显示全部楼层
wuminhdu 发表于 2012-4-7 12:09
在线等回复哦

 程序没细看

 4次高低电平。如果能上升、下降沿中断。即转一圈有4个中断。
 假设,最低转速是10转,即 4 * 10 = 40 。
  
 1秒 = 1000MS  , 1000MS /  40  = 25MS , 每2.5MS更新一次速度计数值, 10转时可以读到4个计数值,

出0入0汤圆

 楼主| 发表于 2012-4-7 13:35:09 | 显示全部楼层
rifjft 发表于 2012-4-7 13:28
 程序没细看

 4次高低电平。如果能上升、下降沿中断。即转一圈有4个中断。

我是测试4次高低电平一共用的时间呢

出0入0汤圆

 楼主| 发表于 2012-4-7 13:38:39 | 显示全部楼层
rifjft 发表于 2012-4-7 13:28
 程序没细看

 4次高低电平。如果能上升、下降沿中断。即转一圈有4个中断。

那个testrun()开始调用时没有开启定时器,当testrun()第一次调用后,此时引脚刚好在上升沿到高电平,然后开始4次调用testrun(),这时候定时器开启,完了就是一圈的时间,吧定时器读出来

出0入0汤圆

发表于 2012-4-7 14:07:14 | 显示全部楼层
wuminhdu 发表于 2012-4-7 13:35
我是测试4次高低电平一共用的时间呢

 
  我觉得固定周期去读取计数值,再来计算转速 这样会方便的。具体那种方式更适合,有待高手来确定

出0入0汤圆

 楼主| 发表于 2012-4-7 14:41:48 | 显示全部楼层
rifjft 发表于 2012-4-7 14:07
 
  我觉得固定周期去读取计数值,再来计算转速 这样会方便的。具体那种方式更适合,有待高手来确定 ...

这个方法用过了,会有毛病的,

出0入0汤圆

发表于 2012-4-7 17:21:11 | 显示全部楼层
根据转速的不同选择T法或者M法

出0入0汤圆

 楼主| 发表于 2012-4-14 14:51:54 | 显示全部楼层
该问题已经解决

出0入0汤圆

发表于 2012-4-30 21:54:29 | 显示全部楼层
wuminhdu 发表于 2012-4-14 14:51
该问题已经解决

请问你是如何解决这个问题的

出0入0汤圆

发表于 2014-3-2 19:01:53 | 显示全部楼层

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

本版积分规则

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

GMT+8, 2024-8-26 13:14

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

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