打印
[技术问答]

Nano100 系列timer0 TC0捕获问题

[复制链接]
3235|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fq1110|  楼主 | 2013-12-30 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
坛里有人用nano100 timer0做过输入捕获吗?

GCR->PA_H_MFP = GCR->PA_H_MFP & ~(PA12_MFP_MASK) | PA12_MFP_TMR0_CAP;       
    TIMER_Init(TIMER0, 11, 1000000, TIMER_CTL_MODESEL_PERIODIC);

        TIMER_EnableCaptureMode(TIMER0,TIMER_CTL_CAPCNTMOD_TRIGGER_CNT,TIMER_CTL_TCAPEDGE_RR);

        TIMER_EnableInt(TIMER0, TIMER_IER_TCAPIE);                  //TIMER_IER_TMRIE|
        TIMER_Start(TIMER0);          

void TMR0_IRQHandler(void)
{
//       
//        TIMER0->ISR = 3;

        if(TIMER_GetIntFlag(TIMER0)==TIMER_ISR_TCAPIS)                //输入捕获中断
        {
                TIMER0->ISR=TIMER_ISR_TCAPIS;
                if(g_CaptureIdx>=MAX_CAPTURE_TIMES)
              {
                       g_CaptureIdx=0;
               }
                if(g_CaptureCount<MAX_CAPTURE_TIMES)
                {
                            g_CaptureCount++;
                }               
                Frequency=12000000/TIMER_GetCaptureData(TIMER0);
               
            if(Frequency>MAX_FREQUENCY)
            {
                    Frequency=MAX_FREQUENCY;       
            }
                   g_CaptureBuffer[g_CaptureIdx]=Frequency;   
            g_CaptureIdx++;          
        }
        if(TIMER_GetIntFlag(TIMER0)==TIMER_ISR_TMRIS)                //定时器中断
        {
                TIMER0->ISR=TIMER_ISR_TMRIS;
        }
}
我用PA12做输入捕获,timer0的TC0捕捉输入,以下是我的代码,烦请大家帮忙看看。或者大家有Nano100系列的参考代码,请分享一下,万分感谢。
看了PWM的捕获DEMO,发现好像不是我需要的,所以就改成上面那段代码了。
沙发
niuyaliang| | 2013-12-30 16:21 | 只看该作者
我想问楼主,你说了半天,到底是什么问题呀。。。

使用特权

评论回复
板凳
fq1110|  楼主 | 2013-12-30 17:09 | 只看该作者
SORRY,没能使大家明白我的意思。我的意思就是我用Nano100的PA12脚做为输入捕获脚,对应的是Timer0的TC0输入捕获通道,我用信号发生器输入1000HZ的方波,我想把这1000hz输入捕获到,以上的代码不知道有什么问题。

使用特权

评论回复
地板
a_ziliu| | 2013-12-30 17:16 | 只看该作者
建議使用pwm 的capture mode.
NANO100BSeriesBSP_CMSIS_V1.00.007\Samples\Driver\PWM
bsp中有詳

使用特权

评论回复
5
a_ziliu| | 2013-12-30 17:17 | 只看该作者
建議使用pwm 的capture mode.
NANO100BSeriesBSP_CMSIS_V1.00.007\Samples\Driver\PWM
bsp中有詳細代碼

使用特权

评论回复
6
fq1110|  楼主 | 2013-12-30 17:19 | 只看该作者
本帖最后由 fq1110 于 2013-12-30 17:22 编辑

谢谢a_ziliu,那个我看了,他能捕获上升沿和下降沿的周期,但是我是想捕获整个周期,包括一个上升沿和一个下降沿的。难道我用两个相加起来,来计算频率。能否一次性就能得到一个周期的频率?

使用特权

评论回复
7
fq1110|  楼主 | 2013-12-30 18:24 | 只看该作者
void PWM0_IRQHandler(void)
{
        uint32_t reg = PWM0->CAPINTSTS;
        if(reg & PWM_CAPINTSTS_CAPIF0)
        {         // channel 0 interrupt
                if(reg & PWM_CAPINTSTS_CFLI0)
                {
                        sampletime++;
                        u32Count[0] = PWM_GetFallingCounter(0);
                }
                else if(reg & PWM_CAPINTSTS_CRLI0)
                {
                        sampletime++;
                        u32Count[1] = PWM_GetRisingCounter(0);
                }
                if(sampletime==2)
                {
                        Frequency=6000000/((0xFFFF - u32Count[0])+(0xFFFF - u32Count[1]));
                        sampletime=0;
                PWM0->CAPINTSTS = reg;
        }
/*        if(PWM_GetCaptureIntFlag(0))
        {
                PWM_ClearCaptureInt(0);
        } */
}

        S_DRVPWM_TIME_DATA_T sPt;
        u8 CapTimer = 0;
        u8 u8Timer=1;

        GCR->PA_H_MFP = (GCR->PA_H_MFP & ~(PA12_MFP_MASK)) | PA12_MFP_PWM0_CH0;
        PWM_Init(0);
        PWM_Enable(0);
        PWM_CaptureEnable(0);
        PWM_EnableInt(0);
        PWM_EnableCaptureInt(0,0);

        sPt.u8Mode = PWM_CTL_CHMOD_AUTO_RELOAD;
    sPt.u8PreScale = 1;                // actually 1 + 1
    sPt.u8Div = PWM_CLKSEL_CLKSEL_DIV1;
    sPt.u32Cn = 0xFFFF;                // Max CN in non-cascade mode
        sPt.u16Cm = 0;           // don't care in capture function

    /* Set PWM Timer 3 for Capture */
    PWM_SetClk(CapTimer, &sPt);
    /* Enable Interrupt Sources of PWM Capture3 */
    PWM_EnableCaptureInt(CapTimer, PWM_CAPINTEN_CRLIE | PWM_CAPINTEN_CFLIE);
    PWM_SetCaptureAttribute(CapTimer, 0, 0, PWM_CAPCTL_CAPRELOAD_MASK);
    /* Enable Input function for PWM 3 */
    PWM_ConfigCaptureIntput(CapTimer, 1);
        /* Enable the PWM Capture3 */
    PWM_CaptureEnable(CapTimer);

示波器输入1k hz波形,用以上方法采出来只有996hz,大家如何处理这种误差的?
还有高频信号捕出来就完全不对了,这又该如何处理呢?
求大侠指教

使用特权

评论回复
8
a_ziliu| | 2013-12-31 13:19 | 只看该作者
我有試過1khz應該還好,不會誤差這麼大,我想你先用示波器抓看看,波型是不是真的是1khz.

至於高頻的範圍,pwm去準確sample 要4個clock 的時間。
pwm跑24Mhz的話,最大概只能取6Mhz的範圍資料。

使用特权

评论回复
9
fq1110|  楼主 | 2014-1-1 15:16 | 只看该作者
本帖最后由 fq1110 于 2014-1-7 09:32 编辑

谢谢a_ziliu的回复,我1000hz就是用示波器发出的,用示波器测量是标准的1khz。
nano100芯片,不知道是我没用好,还是什么问题,用pwm输出250hz与1000hz方波,用示波器测量尽然是251.4hz与1004hz,精确度好像不高,这个芯片不知道大家用的多不多,这芯片有没有这方面的问题。
我用的外部12M晶振,HCLK 32M,这个误差我都不知道如何修正。

使用特权

评论回复
10
niuyaliang| | 2014-1-5 11:36 | 只看该作者
fq1110 发表于 2014-1-1 15:16
谢谢a_ziliu的回复,我1000hz就是用示波器发出的,用示波器测量也不是标准的1khz。
nano100芯片,不知道是 ...

不知道楼主这个问题解决了没有,同问

使用特权

评论回复
11
fq1110|  楼主 | 2014-1-7 09:32 | 只看该作者
没有解决了。兄弟,你解决了没?

使用特权

评论回复
12
zxf0168| | 2014-2-13 14:57 | 只看该作者
不知道楼主这个问题解决了没有,同问

使用特权

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

本版积分规则

68

主题

530

帖子

1

粉丝