打印
[技术问答]

芯唐 MINI54LDE 测量高脉宽

[复制链接]
771|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzy7767|  楼主 | 2017-11-21 12:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include "Mini51Series.h"
volatile  uint32_t t,t1,code=0;

void TMR0_IRQHandler(void)
{
         if(TIMER_GetCaptureIntFlag(TIMER0)==1)
         {
               
          t = TIMER_GetCaptureData(TIMER0);          
    TIMER_ClearCaptureIntFlag(TIMER0);   
          }
        }


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Set P5 multi-function pins for XTAL1 and XTAL2 */
   // SYS->P5_MFP |= (SYS_MFP_P50_XTAL1 | SYS_MFP_P51_XTAL2);

    /* Enable external 12MHz XTAL (UART), and HIRC */
    CLK->PWRCON |= /*CLK_PWRCON_XTL12M |*/ CLK_PWRCON_IRC22M_EN_Msk;

    /* Waiting for clock ready */
    CLK_WaitClockReady(/*CLK_CLKSTATUS_XTL_STB_Msk |*/CLK_CLKSTATUS_IRC22M_STB_Msk);

    /* Enable UART and Timer 0 clock */
    CLK->APBCLK = CLK_APBCLK_UART_EN_Msk | CLK_APBCLK_TMR0_EN_Msk;

    /* Select UART clock source from external crystal*/
    CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_XTAL;

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock and CycylesPerUs automatically. */
    SystemCoreClockUpdate();


    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set P0 multi-function pins for UART RXD, TXD */
    SYS->P0_MFP = SYS_MFP_P13_TXD | SYS_MFP_P12_RXD;
    /* Set P3 multi function pin for Timer 0 capture pin */
    SYS->P3_MFP = SYS_MFP_P32_T0EX;

    /* Lock protected registers */
    SYS_LockReg();
}

int main(void)
{
  //int volatile i;

    /* Init System, IP clock and multi-function I/O
       In the end of SYS_Init() will issue SYS_LockReg()
       to lock protected register. If user want to write
       protected register, please issue SYS_UnlockReg()
       to unlock protected register if necessary */
    SYS_Init();

    /* Init UART to 115200-8n1 for print message */
    UART_Open(UART0, 115200);

    printf("\nThis sample code demonstrate timer trigger counting mode.\n");
    printf("Please connect input source with Timer 0 capture pin T0EX (P3.2), press any key to continue\n");
    getchar();

    // Give a dummy target frequency here. Will over write capture resolution with macro
    TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1);

    // Update prescale to set proper resolution.
    TIMER_SET_PRESCALE_VALUE(TIMER0, 0);

    // Set compare value as large as possible, so don't need to worry about counter overrun too frequently.
    TIMER_SET_CMP_VALUE(TIMER0, 0x7FFF);
               

    // Configure Timer 0 free counting mode, capture TDR value on rising edge
  // TIMER_EnableCapture(TIMER0, TIMER_CAPTURE_TRIGGER_COUNTING_MODE, TIMER_CAPTURE_RISING_EDGE);
    TIMER_EnableCapture(TIMER0, TIMER_CAPTURE_TRIGGER_COUNTING_MODE, TIMER_CAPTURE_RISING_THEN_FALLING_EDGE);
    // Start Timer 0
    TIMER_Start(TIMER0);

    // Enable timer interrupt
    TIMER_EnableCaptureInt(TIMER0);
    NVIC_EnableIRQ(TMR0_IRQn);

    while(1);

}
用的官方的库,测量高电平脉宽,但测量的数据不对,请大神帮忙看下,指教指教!
沙发
zhuotuzi| | 2017-11-21 14:17 | 只看该作者
你说不对,到底是如何不对的,测的对象是脉宽多少?

使用特权

评论回复
板凳
xzy7767|  楼主 | 2017-11-21 14:43 | 只看该作者
zhuotuzi 发表于 2017-11-21 14:17
你说不对,到底是如何不对的,测的对象是脉宽多少?

我外部输入IRIG-B(DC)码的信号给到单片机的TIME0(P32),IRIG-B(DC)码的高电平脉宽分别有8ms,5ms和2ms的。

使用特权

评论回复
地板
xinpian101| | 2017-11-21 20:05 | 只看该作者
先设置上升沿触发,然后清零定时器,设置成下降沿触发。。在下降沿触发中断读取定时器的值。

使用特权

评论回复
5
21mengnan| | 2017-11-21 20:58 | 只看该作者
你把输入捕捉设成 上升沿与下降沿都能中断的,然后在 上升沿打开定时器,下降沿读取定时器时间,这样就知道脉宽了

使用特权

评论回复
6
antusheng| | 2017-11-21 20:59 | 只看该作者
对捕获不是很了解。

使用特权

评论回复
7
xzy7767|  楼主 | 2017-11-22 14:57 | 只看该作者
xinpian101 发表于 2017-11-21 20:05
先设置上升沿触发,然后清零定时器,设置成下降沿触发。。在下降沿触发中断读取定时器的值。 ...

我设置的是这种模式:TIMER_EnableCapture(TIMER0, TIMER_CAPTURE_TRIGGER_COUNTING_MODE, TIMER_CAPTURE_RISING_THEN_FALLING_EDGE);
我看了数据手册里的这种模式是:定时器外部输入引脚第一次0到1转变将TDR复位成0并开始计数,第二次1到0转变停止计数。

使用特权

评论回复
8
21mengnan| | 2017-11-27 19:57 | 只看该作者
最后误差有多少啊

使用特权

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

本版积分规则

3

主题

8

帖子

0

粉丝