查看: 308|回复: 12
收起左侧

[DSP编程] 2812定时中断测速问题

[复制链接]

6

主题

34

帖子

102

积分

中级技术员

 楼主| 发表于 2017-5-14 23:40 | 显示全部楼层 |返回版面||阅读模式
今天调试了一下电机,发现程序通过M法测速得到的结果很离谱,不知哪里出现问题了?

6

主题

34

帖子

102

积分

中级技术员

 楼主| 发表于 2017-5-14 23:41 | 显示全部楼层 |返回版面
/************* 定时器 3 con=0x1014 高频脉冲计数,计数一次=0.02us ************************/
                  EvbRegs.T3CON.bit.TMODE=2;//连续增计数模式,可产生上溢中断
                  EvbRegs.T3CON.bit.TPS=1;//预定标寄存器为0,T3CLK=37.5MHZ
                  EvbRegs.T3CON.bit.TENABLE=0;//禁止定时器T3 //主程序中打开
                  EvbRegs.T3CON.bit.TCLKS10=0;//使用内部时钟T3CLK=37.5MHZ
                  EvbRegs.T3CON.bit.TCLD10=1;//定时器比较寄存器重载条件:当计数器值为0
                  EvbRegs.T3CON.bit.TECMPR=0;//禁止定时器比较操作

                  EvbRegs.GPTCONB.all=0;
                  EvbRegs.T3PR=0xffff;
                  EvbRegs.T3CNT=0;

                  EvbRegs.EVBIFRA.bit.T3PINT=1;//清零T3周期中断标志
                  EvbRegs.EVBIMRA.bit.T3PINT=1;//中断屏蔽寄存器使能T3周期中断

6

主题

34

帖子

102

积分

中级技术员

 楼主| 发表于 2017-5-14 23:43 | 显示全部楼层 |返回版面
LES 发表于 2017-5-14 23:41
/************* 定时器 3 con=0x1014 高频脉冲计数,计数一次=0.02us ************************/
                  EvbR ...

下面这个程序是T3定时器的周期中断,请问这样设置能自加9次吗
interrupt void T3PINT_isr(void)     // EV-B
{
        T3PrCont++;//一个周期大概T=0.02us*65535=1.3ms
                if(T3PrCont==1)
                  {
                                data1=EvaRegs.T2CNT;

                    }
                 if(T3PrCont>=9)
                  {
                                data2=EvaRegs.T2CNT;
                                //if(EvbRegs.GPTCONB.bit.T4STAT==1)//增计数  正向
                                        //{
                                         if(data1<data2)
                                          {

                                                  Speed_L=4.49*(data2-data1+0xffff);

                                          }
                                          else if(data1>=data2)
                                          {
                                                  Speed_L=4.49*(data2-data1);

                                          }


                                //else if(EvbRegs.GPTCONB.bit.T4STAT==0)//减计数  反向
                                EvaRegs.T2CNT=0x7fff;
                                T3PrCont=0;
                                //T4PrCont=0;
                                GetSpeedFlag=1;
                  }
                 EvbRegs.EVBIFRA.bit.T3PINT = 1;//中断标志置零
                   PieCtrl.PIEACK.bit.ACK4 = 1;
                   EINT;
                   return;
}
     

18

主题

204

帖子

637

积分

高级技术员

发表于 2017-5-15 14:57 | 显示全部楼层 |返回版面
LES 发表于 2017-5-14 23:43
下面这个程序是T3定时器的周期中断,请问这样设置能自加9次吗
interrupt void T3PINT_isr(void)     // E ...

首先你代码里:
                                     if(data1<data2)
                                          {

                                                  Speed_L=4.49*(data2-data1+0xffff);

                                          }
                                          else if(data1>=data2)
                                          {
                                                  Speed_L=4.49*(data2-data1);

                                          }
写反了吧~
还有这个代码必须保证你的你的速度必须保证一个溢出周期内就得发生9次中断,如果需要一次溢出周期计算不能获得9次中断结果就不对了。

6

主题

34

帖子

102

积分

中级技术员

 楼主| 发表于 2017-5-15 15:44 | 显示全部楼层 |返回版面
dzguang 发表于 2017-5-15 14:57
首先你代码里:
                                     if(data1=data2)
                               ...

能给点修改的思路吗?
     

18

主题

204

帖子

637

积分

高级技术员

发表于 2017-5-16 08:12 | 显示全部楼层 |返回版面
LES 发表于 2017-5-15 15:44
能给点修改的思路吗?

你能先修改成这个测试之后再说的么?现在都不知道修改之后的效果。
                                     if(data1<data2)
                                          {

                                                 Speed_L=4.49*(data2-data1);

                                          }
                                          else if(data1>=data2)
                                          {
                                                  
                                                 Speed_L=4.49*(data2-data1+0xffff);
                                          }
修改之后只要你的测试时间准,高速应该没有问题。你试一试低速,50、30、20、10,如果没有问题就基本不用去考虑一个中断周期时间的问题了。

6

主题

34

帖子

102

积分

中级技术员

 楼主| 发表于 2017-5-16 10:10 | 显示全部楼层 |返回版面
dzguang 发表于 2017-5-16 08:12
你能先修改成这个测试之后再说的么?现在都不知道修改之后的效果。
                                    ...

经过修改之后还是这个问题,发现最后速度都是乘以了ffff,所以结果很大
     

18

主题

204

帖子

637

积分

高级技术员

发表于 2017-5-16 10:20 | 显示全部楼层 |返回版面
LES 发表于 2017-5-16 10:10
经过修改之后还是这个问题,发现最后速度都是乘以了ffff,所以结果很大

你看看你的data1和data2是不是一直一样啊?你对data1和data2赋值使用的是T2,你T2开启了?
     

18

主题

204

帖子

637

积分

高级技术员

发表于 2017-5-16 10:21 | 显示全部楼层 |返回版面
dzguang 发表于 2017-5-16 10:20
你看看你的data1和data2是不是一直一样啊?你对data1和data2赋值使用的是T2,你T2开启了? ...

从你代码到能想到的,我也只有这么多了。

6

主题

34

帖子

102

积分

中级技术员

 楼主| 发表于 2017-5-16 10:51 | 显示全部楼层 |返回版面
dzguang 发表于 2017-5-16 10:20
你看看你的data1和data2是不是一直一样啊?你对data1和data2赋值使用的是T2,你T2开启了? ...

data1,data2的值不同,但计算时相减后都加上了65535
     

18

主题

204

帖子

637

积分

高级技术员

发表于 2017-5-16 16:15 | 显示全部楼层 |返回版面
真的不想再想了。你没看明白我的意思啊~你T2是怎么配置的呢?你的data值都来自与T2的cnt。你T2是自由跑的么(从0跑到ffff,然后溢出再重跑)?你的T3只是中断,中断9次,去计算一次,你T2和T3的配置很重要,T3中断发生10次你T2发生最只能多一次。你再看看的。实在不行,你能多发些代码上来么?靠猜的无能为力了。

6

主题

34

帖子

102

积分

中级技术员

 楼主| 发表于 2017-5-16 17:24 | 显示全部楼层 |返回版面
dzguang 发表于 2017-5-16 16:15
真的不想再想了。你没看明白我的意思啊~你T2是怎么配置的呢?你的data值都来自与T2的cnt。你T2是自由跑的么 ...

//----------------------T3
                  EvbRegs.T3CON.bit.TMODE=2;//连续增计数模式,可产生上溢中断
                  EvbRegs.T3CON.bit.TPS=1;//预定标寄存器为0,T3CLK=37.5MHZ
                  EvbRegs.T3CON.bit.TENABLE=0;//禁止定时器T3 //主程序中打开
                  EvbRegs.T3CON.bit.TCLKS10=0;//使用内部时钟T3CLK=37.5MHZ
                  EvbRegs.T3CON.bit.TCLD10=1;//定时器比较寄存器重载条件:当计数器值为0
                  EvbRegs.T3CON.bit.TECMPR=0;//禁止定时器比较操作

                  EvbRegs.GPTCONB.all=0;
                  EvbRegs.T3PR=0xffff;//定时器 3 con=0x1014 高频脉冲计数,计数一次=0.02us
                  EvbRegs.T3CNT=0;

                  EvbRegs.EVBIFRA.bit.T3PINT=1;//清零T3周期中断标志
                  EvbRegs.EVBIMRA.bit.T3PINT=1;//中断屏蔽寄存器使能T3周期中断*/

//-----------------T2
         // QEP通用定时器2,初始化
          EvaRegs.T2PR=0xffff;
          EvaRegs.T2CNT=0x7fff;//0x0BB8;
          EvaRegs.CAPCON.bit.CAPQEPN=3;//使能QEP电路CAP4_QEP3,CAP5_QEP4
          EvaRegs.CAPCON.bit.CAP12TSEL=0;//用定时器4提供时基
          EvaRegs.CAPCON.bit.CAP1EDGE=3;//
          EvaRegs.CAPCON.bit.CAP2EDGE=3;
          EvaRegs.T2CON.bit.TCLKS10=3;//选择时钟源为QEP
          EvaRegs.T2CON.bit.TMODE=3;//使定时器4工作在定向增减计数模式
          EvaRegs.T2CON.bit.T2SWT1=0;//自己的使能位

T1--------------------------------------------------------------------------------------------
EvaRegs.T1CON.bit.TMODE=1;        //连续增/减模式
            EvaRegs.T1CON.bit.TPS=1;          //T1CLK=HSPCLK/2=37.5M
            EvaRegs.T1CON.bit.TENABLE=0;      //暂时禁止T1计数
            EvaRegs.T1CON.bit.TCLKS10=0;      //使用内部时钟,T1CLK
            EvaRegs.T1CON.bit.TECMPR=1;       //使能定时器比较操作

            EvaRegs.T1PR=0x493E;              //1KHz的PWM,周期为1ms
            EvaRegs.T1CNT=0;

            EvaRegs.COMCONA.bit.CENABLE=1;    //使能比较单元的比较操作
            EvaRegs.COMCONA.bit.FCOMPOE=1;    //全比较输出,PWM1-6引脚均由相应的比较逻辑驱动
         EvaRegs.COMCONA.bit.CLD=2;

            //死区时间为:4.27us
            EvaRegs.DBTCONA.bit.DBT=10;       //死区定时器周期,m=10
            EvaRegs.DBTCONA.bit.EDBT1=1;      //死区定时器1使能位
            EvaRegs.DBTCONA.bit.DBTPS=4,      //死区定时器预定标因子 Tdb=37.5M/16=2.34M

            EvaRegs.ACTR.all=0x0664;          //设定引脚PWM1-PWM6的动作属性

            EvaRegs.CMPR1=0x3000;             //PWM1占空比初始化为10%

6

主题

34

帖子

102

积分

中级技术员

 楼主| 发表于 2017-5-16 17:29 | 显示全部楼层 |返回版面
dzguang 发表于 2017-5-16 16:15
真的不想再想了。你没看明白我的意思啊~你T2是怎么配置的呢?你的data值都来自与T2的cnt。你T2是自由跑的么 ...

void main(void)                 主函数
{
            InitSysCtrl();
            DINT;
            IER = 0x0000;
            IFR = 0x0000;
            InitPieCtrl();
            InitPieVectTable();
            InitGpio();
            InitEv();

      EALLOW;
          PieVectTable.T3PINT =  & T3PINT_isr;    // EV-B
          EDIS;

        //////////开中断
          IER |= M_INT4;//为何如此设置,哪个中断使能哪?
          PieCtrl.PIEIER4.bit.INTx4 = 1;

      EINT;                                                   // Enable INTM
          ERTM;

          data1=0x7fff;


          EvaRegs.T1CON.bit.TENABLE=1;//使能定时器1~4
          EvaRegs.T2CON.bit.TENABLE=1;
          EvbRegs.T3CON.bit.TENABLE=1;
         // EvbRegs.T4CON.bit.TENABLE=1;
          ////设置中断服务程序入口地址



          while(1)
                          {            if(        GetSpeedFlag==1)
                  {
                                  DINT;//关中断
                                    GetSpeedFlag=0;

                                    //PID();
                                   //PWM_out();
                                    EINT;//开中断
                                    ERTM;
                                                              }
                          }

}
*滑动验证:
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

关闭

热门推荐上一条 /1 下一条

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