LES 发表于 2017-5-14 23:40

2812定时中断测速问题

今天调试了一下电机,发现程序通过M法测速得到的结果很离谱,不知哪里出现问题了?

LES 发表于 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周期中断

LES 发表于 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;
}

dzguang 发表于 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次中断结果就不对了。

LES 发表于 2017-5-15 15:44

dzguang 发表于 2017-5-15 14:57
首先你代码里:
                                     if(data1=data2)
                               ...

能给点修改的思路吗?

dzguang 发表于 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,如果没有问题就基本不用去考虑一个中断周期时间的问题了。

LES 发表于 2017-5-16 10:10

dzguang 发表于 2017-5-16 08:12
你能先修改成这个测试之后再说的么?现在都不知道修改之后的效果。
                                    ...

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

dzguang 发表于 2017-5-16 10:20

LES 发表于 2017-5-16 10:10
经过修改之后还是这个问题,发现最后速度都是乘以了ffff,所以结果很大

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

dzguang 发表于 2017-5-16 10:21

dzguang 发表于 2017-5-16 10:20
你看看你的data1和data2是不是一直一样啊?你对data1和data2赋值使用的是T2,你T2开启了? ...

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

LES 发表于 2017-5-16 10:51

dzguang 发表于 2017-5-16 10:20
你看看你的data1和data2是不是一直一样啊?你对data1和data2赋值使用的是T2,你T2开启了? ...

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

dzguang 发表于 2017-5-16 16:15

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

LES 发表于 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%

LES 发表于 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]
查看完整版本: 2812定时中断测速问题