打印
[NUC120]

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

[复制链接]
2137|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
以下是我測試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 | 只看该作者
你不停的查询中断旗标状态,这个状态查询也需要时间执行的,因此当频率高的时候就体现出来了,可以用定时器溢出中断。

使用特权

评论回复
5
direrwind|  楼主 | 2015-5-6 17:55 | 只看该作者
lvyunhua 发表于 2015-5-5 20:42
你不停的查询中断旗标状态,这个状态查询也需要时间执行的,因此当频率高的时候就体现出来了,可以用定时器 ...

试了你的方法后,误差变很少时间准了很多,但是多加行运算,误差又拉大了0.0
看来只能试其他方法了,不过还是感谢你!!

使用特权

评论回复
6
lvyunhua| | 2015-5-6 18:44 | 只看该作者
试了你的方法后,误差变很少时间准了很多,但是多加行运算,误差又拉大了0.0

你有什么运算啊?放在哪里做啊。

使用特权

评论回复
7
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,因为我要随着时间製造不一样的脉波,类似于编码,不知道这有解吗??

使用特权

评论回复
8
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++];
}

使用特权

评论回复
9
lvyunhua| | 2015-5-7 09:35 | 只看该作者
TIMER0->TCMPR=x[i++];

这个可以放到外面去执行吗。

使用特权

评论回复
10
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;
}

使用特权

评论回复
11
lvyunhua| | 2015-5-7 21:45 | 只看该作者
x[]={315,630,1260}

这是三种波形产生,定时器初值吗?

使用特权

评论回复
12
direrwind|  楼主 | 2015-5-7 22:46 | 只看该作者
lvyunhua 发表于 2015-5-7 21:45
这是三种波形产生,定时器初值吗?

TIMER0->TCMPR=x{i} ;  是的 第一个要看到38KHz的时间 ,但跑掉了...

使用特权

评论回复
13
lvyunhua| | 2015-5-8 11:02 | 只看该作者
TIMER0->TCMPR=x{i} ;  是的 第一个要看到38KHz的时间 ,但跑掉了...

你要把int j=0;改成int j=1; 就可以看到第一个38kHZ的。

使用特权

评论回复
14
direrwind|  楼主 | 2015-5-8 15:25 | 只看该作者
改了还是一样看到25KHz,我想应该跟CPU执行速度有关係了!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

23

帖子

1

粉丝