[NUC120] NUC120 Timer短时间计算不準确 求解!!

[复制链接]
 楼主| direrwind 发表于 2015-5-5 16:00 | 显示全部楼层 |阅读模式
以下是我測試Timer的程式碼,使用的是12MHz晶振
第一次填入  TIMER0->TCMPR=12000000; 量測到1s的時間很準確

第二次填入  TIMER0->TCMPR=1200000 ; 量測到0.1s的時間也很準確

套入NUC datasheet 計算公式
Time out period = (Period of timer clock input) * (8-bit PRESCALE + 1) * (24-bit TCMP)
             1s = 1/12000000 * 1 * 12000000  驗證正確
           0.1s = 1/12000000 * 1 * 1200000   驗證正確
故我想要製造38KHz要填入 TCMPR = 315.789 (小數點已被忽略) ,發現測量到27.17KHz,雖然我知道會有誤差,但誤差也太大了吧!!

後來再填入其他低的值,經過計算所得出來的時間都不正確...
这让我非常的惊讶,因为Timer的时间照理说都要很準,想请问到底是我程式问题,还是NUC120的Bug!!麻烦求解,感谢!!
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
void timer();
void timer_aa();
main()
{
timer();
while(1)
  {
    DrvGPIO_SetBit(E_GPA,1);
        timer_aa();
        DrvGPIO_ClrBit(E_GPA,1);
        timer_aa();
  }
}

void timer()
{

   UNLOCKREG();
   SYSCLK->PWRCON.XTL12M_EN = 1;
   SYSCLK->CLKSEL0.HCLK_S = 0;
   LOCKREG();

   DrvGPIO_Open(E_GPA, 1, E_IO_OUTPUT);
   DrvGPIO_Open(E_GPA, 0, E_IO_OUTPUT);
   DrvGPIO_ClrBit(E_GPA,1);
   SYSCLK->CLKSEL1.TMR0_S = 0;         
   SYSCLK->APBCLK.TMR0_EN =1;
   TIMER0->TCSR.MODE=0;       
   TIMER0->TCSR.PRESCALE=0;
   TIMER0->TCMPR=12000000;        
   TIMER0->TCSR.IE = 1;       
   TIMER0->TISR.TIF = 1;
}

void timer_aa()
{
   TIMER0->TCSR.CEN = 1;
   while(   TIMER0->TISR.TIF != 1) ;
   TIMER0->TISR.TIF = 1;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lvyunhua 发表于 2015-5-5 17:32 | 显示全部楼层
你用查询方式会有延时,可以用中断啊。
 楼主| direrwind 发表于 2015-5-5 18:06 | 显示全部楼层
lvyunhua 发表于 2015-5-5 17:32
你用查询方式会有延时,可以用中断啊。

while(   TIMER0->TISR.TIF != 1) ;
   TIMER0->TISR.TIF = 1;
我这两行是用中断旗标来判別Timer时间是否已数完,然后再清除旗标状态
请问跟你说的中断方式是一样吗?抱歉小弟学艺不精,麻烦指点...QQ
lvyunhua 发表于 2015-5-5 20:42 | 显示全部楼层
你不停的查询中断旗标状态,这个状态查询也需要时间执行的,因此当频率高的时候就体现出来了,可以用定时器溢出中断。
 楼主| direrwind 发表于 2015-5-6 17:55 | 显示全部楼层
lvyunhua 发表于 2015-5-5 20:42
你不停的查询中断旗标状态,这个状态查询也需要时间执行的,因此当频率高的时候就体现出来了,可以用定时器 ...

试了你的方法后,误差变很少时间准了很多,但是多加行运算,误差又拉大了0.0
看来只能试其他方法了,不过还是感谢你!!
lvyunhua 发表于 2015-5-6 18:44 | 显示全部楼层
试了你的方法后,误差变很少时间准了很多,但是多加行运算,误差又拉大了0.0

你有什么运算啊?放在哪里做啊。
 楼主| direrwind 发表于 2015-5-7 01:30 | 显示全部楼层
测试条件:製造38KHz,计算后填入 TIMER0->TCMPR=315;
第一次,我发现用Timer模式0:The timer is operating in the one-shot mode,误差很大!!

main()
{
    timer();
TIMER0->TCSR.CEN =1;
while(1);
}
void TMR0_IRQHandler()
{
  TIMER0->TISR.TIF =1;
  GPIOA->DOUT=~GPIOA->DOUT;
TIMER0->TCSR.CEN =1;
}

第二次测试则用Timer模式1:The timer is operating in the periodic mode,时间比较准

main()
{
    timer();
TIMER0->TCSR.CEN =1;
while(1);
}
void TMR0_IRQHandler()
{
  TIMER0->TISR.TIF =1;
  GPIOA->DOUT=~GPIOA->DOUT;
}

虽然模式1可以製造比较准确的时间,但我必须要用模式0,因为我要随着时间製造不一样的脉波,类似于编码,不知道这有解吗??

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| direrwind 发表于 2015-5-7 01:57 | 显示全部楼层
lvyunhua 发表于 2015-5-6 18:44
你有什么运算啊?放在哪里做啊。

我是使用timer模式1测试,製造不一样的方波,发现经过运算后就不准了...
第一个要製造38Khz,测到47KHz...


int x[]={315,157,78} ;
int i=0;
void timer();
main()
{
    timer();
                TIMER0->TCSR.CEN =1;
while(1)
  {
  if(i>=3)
  {
           i=0;
  }
  }
}
void TMR0_IRQHandler()
{
    TIMER0->TISR.TIF =1;
           GPIOA->DOUT=~GPIOA->DOUT;
        TIMER0->TCMPR=x[i++];
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lvyunhua 发表于 2015-5-7 09:35 | 显示全部楼层
TIMER0->TCMPR=x[i++];

这个可以放到外面去执行吗。
 楼主| direrwind 发表于 2015-5-7 16:36 | 显示全部楼层
本帖最后由 direrwind 于 2015-5-7 22:43 编辑
lvyunhua 发表于 2015-5-7 09:35
这个可以放到外面去执行吗。

放到主程式38Khz跑到25.64Khz ...还是跑掉了,应该是用到不停查询的方式,但我想不到用更好的方式了..

int j=0;
int x[]={315,630,1260} ;
int i=0;
void timer();
main()
{
timer();
TIMER0->TCSR.CEN =1;
while(1)
   {
TIMER0->TCMPR=x{i} ;//这边矩阵显示不出来 故先用{}代替
i++;
  while(j==1) ;
  j=1;
  if(i==3)
    {
           i=0;
    }
   }
}
void TMR0_IRQHandler()
{
    GPIOA->DOUT=~GPIOA->DOUT;
    TIMER0->TISR.TIF =1;
    j=0;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lvyunhua 发表于 2015-5-7 21:45 | 显示全部楼层
x[]={315,630,1260}

这是三种波形产生,定时器初值吗?
 楼主| direrwind 发表于 2015-5-7 22:46 | 显示全部楼层
lvyunhua 发表于 2015-5-7 21:45
这是三种波形产生,定时器初值吗?

TIMER0->TCMPR=x{i} ;  是的 第一个要看到38KHz的时间 ,但跑掉了...
lvyunhua 发表于 2015-5-8 11:02 | 显示全部楼层
TIMER0->TCMPR=x{i} ;  是的 第一个要看到38KHz的时间 ,但跑掉了...

你要把int j=0;改成int j=1; 就可以看到第一个38kHZ的。
 楼主| direrwind 发表于 2015-5-8 15:25 | 显示全部楼层
改了还是一样看到25KHz,我想应该跟CPU执行速度有关係了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

23

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部