您好,我想请问一下关于CH573定时器输入捕获的问题

请问一下CH573PA9引脚用作TMR0功能可以做输入捕获用来进行红外解码吗?解码NEC需要判断高低电平的持续时间,是需要用另一个定时器的计数功能才可以实现吗?如果要判断低电平是否持续560us,那这个计数器计的数值为多少时才是560us呢?


CH57x CH58x 系列的芯片的26bit定时器的时钟直接来自 系统时钟,

当系统跑到32M 情况下, 每32代表1us, 在60M情况下每60代表1us;

上帖低电平持续560us, 当CH573 跑在60M的情况下, 560us captrue得到的值将会是60*360 = 33600这样

另外一个注意的地方是, capture工作模式下,timer的输出值的第26bit 指示的是采样时候的电平;


如下是在主频60Mhz下,timer开启双边沿captrue下,中断里面得到 us的处理(这里测试用到了打印,注意给合适的测试信号,避免打印速度影响结果)

__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR3_IRQHandler( void )        // TMR3 定时中断
{
    uint32_t cap_data;
    if ( TMR3_GetITFlag( TMR0_3_IT_DATA_ACT ) ) {
        TMR3_ClearITFlag( TMR0_3_IT_DATA_ACT );      // 清除中断标志
        cap_data = TMR3_CAPGetData();
        
        if(cap_data&(1<<25)){ //高电平
            cap_data = cap_data&((1<<25)-1);
            PRINT("H gap=%d us\r\n",cap_data/60);
        }else{
            PRINT("L gap=%d us\r\n",cap_data/60);
        }
    }
}



初始化这样写对吗,用定时器0输入捕获

    GPIOA_ResetBits( GPIO_Pin_9 );             // 配置PA9
    GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeIN_PU );

    TMR0_CapInit( Edge_To_Edge );
    TMR0_CAPTimeoutCfg( 0xFFFFFFFF );    // 设置捕捉超时时间
    PFIC_EnableIRQ( TMR0_IRQn );



还需要使能   TMR0_ITCfg( ENABLE, TMR0_3_IT_DATA_ACT );


void Init(void)
{
    GPIOA_ResetBits( GPIO_Pin_9 );             // 配置PA9
    GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeIN_PU );

    TMR0_CapInit( Edge_To_Edge );
    TMR0_CAPTimeoutCfg( 0xFFFFFFFF );    // 设置捕捉超时时间
    TMR0_ITCfg( ENABLE, TMR0_3_IT_DATA_ACT );
    PFIC_EnableIRQ( TMR0_IRQn );

}

__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR0_IRQHandler( void )
{
    uint32_t cap_data;
    if ( TMR0_GetITFlag( TMR0_3_IT_DATA_ACT ) )
    {
        TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT );      // 清除中断标志
        cap_data = TMR0_CAPGetData();

        if(cap_data&(1<<25)){ //高电平
            cap_data = cap_data&((1<<25)-1);
            PRINT("H gap=%d us\r\n",cap_data/60);
        }else{
            PRINT("L gap=%d us\r\n",cap_data/60);
        }
    }
}

这是定时器输入捕获的代码,连接的是一个红外接收器,当我按下遥控器时串口打印的信息如下

QQ截图20211215103754.png

逻辑分析仪捕捉的图像如下

QQ截图20211215092651.png

任意边沿触发首先打印的应该是 L gap=9398 us吗,而且打印的高低电平与图像也对不上。请问这是什么问题。



打印的波特率是多少?如果是115200的话,中断里面打印的时间都比采样脉宽要宽,会影响采样。


这是9600波特率的打印,但是第一个被采样的电平不应该是低电平吗

QQ截图20211215111148.png


你是上电同时有边沿输入,还是芯片先上电在输入的电平信号,你可以先测单个脉宽试试,打印的话,9600太慢了,1个字节就差不多1ms,影响采样。


方便给我发一下CH573触摸按键的吗



方便给我发一下CH573触摸按键的吗



方便给我发一下CH573触摸按键的吗



留个邮箱发给你


您好,我这里做了测试不在中断中打印,

    while(1)
    {
        for(i=0;i<10;i++)
        {
            TMR1_Disable();
            TMR1_PWMActDataWidth( 0 );              // 占空比
            TMR1_Enable();
            DelayMs(9);
            TMR1_Disable();
            TMR1_PWMActDataWidth( 10000 );              // 占空比
            TMR1_Enable();
            if(cap_data&(1<<25)) //高电平
            {
                cap_data = cap_data&((1<<25)-1);
                PRINT("H gap=%d us\r\n",cap_data/60);
            }
            else
                PRINT("L gap=%d us\r\n",cap_data/60);
            DelayMs(1000);
        }
        TMR1_PWMInit( Low_Level, PWM_Times_1 );
        for(i=0;i<10;i++)
        {
            TMR1_Disable();
            TMR1_PWMActDataWidth( 0 );              // 占空比
            TMR1_Enable();
            DelayMs(9);
            TMR1_Disable();
            TMR1_PWMActDataWidth( 10000 );              // 占空比
            TMR1_Enable();
            if(cap_data&(1<<25)) //高电平
            {
                cap_data = cap_data&((1<<25)-1);
                PRINT("H gap=%d us\r\n",cap_data/60);
            }
            else
                PRINT("L gap=%d us\r\n",cap_data/60);
            DelayMs(1000);
        }
        TMR1_PWMInit( High_Level, PWM_Times_1 );
    }
    __attribute__((interrupt("WCH-Interrupt-fast")))
    __attribute__((section(".highcode")))
    void TMR0_IRQHandler( void )
    {

        if ( TMR0_GetITFlag( TMR0_3_IT_DATA_ACT ) )
        {
            TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT );      // 清除中断标志
            cap_data = TMR0_CAPGetData();

            if(cap_data&(1<<25)){ //高电平

            }else{

            }
        }
    }

串口打印的信息如图

QQ截图20211215151638.png

每次前四组数不太正确,这个要怎么保证第一次的数据就是正确的呢


个人信息保护,已隐藏




已发,请查收


您好,能否麻烦帮我看一下那个问题


只有登录才能回复,可以选择微信账号登录