[技术问答]

使用029的PWM2捕获遇到问题,第一次使用,求大神帮忙看看

[复制链接]
434|7
手机看帖
扫描二维码
随时随地手机跟帖
电子是什么|  楼主 | 2021-1-19 11:13 | 显示全部楼层 |阅读模式
第一次使用这个芯片,不太熟悉,使用的芯片是029LAN   用内部时钟,PWM2输入捕获,采用中断内判断是否获得捕获。

使用特权

评论回复
电子是什么|  楼主 | 2021-1-19 11:17 | 显示全部楼层
    SYS_UnlockReg();        //解锁受保护的寄存器
        
    Sys_Init();             //初始化系统,外设时钟和多功能I / O
           
    Uart0_Init(UART0_BOUND);//为printf初始化UART0
   
    Led_Init();             //LED工作指示灯初始化
   
    Pwm_Init();             //PWM0、PWM2初始化
    Timer_Init();           //定时器0初始化 1ms
    SYS_LockReg();          //锁定受保护的寄存器[code]//--------------------------------------------------
//初始化系统时钟
//--------------------------------------------------
void Sys_Init(void)
{
    //--------------------------------------------------
    //启用内部RC 22.1184MHz时钟
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    //等待内部RC时钟就绪
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

    //--------------------------------------------------
    //将HCLK时钟源切换为内部RC和HCLK源分频1
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));


    //--------------------------------------------------
    //将PLL的核心时钟设置为PLL_CLOCK
    CLK_SetCoreClock(PLL_CLOCK);

    //更新系统核心时钟
    //用户可以使用SystemCoreClockUpdate()
    //自动计算PllClock,SystemCoreClock和CycylesPerUs。
    SystemCoreClockUpdate();
}
[code]//--------------------------------------------------
//PWM0初始化
//--------------------------------------------------
void Pwm_Init(void)
{
    //PWM0初始化  将PWM0初始化成输出口,时钟频率为10kHZ
    //初始化I / O多功能     
    //设置PWMA通道0、2的多功能引脚   P40  P42
    SYS->P4_MFP &= ~ (SYS_MFP_P40_Msk | SYS_MFP_P42_Msk);
    SYS->P4_MFP |= SYS_MFP_P40_PWM0 | SYS_MFP_P42_PWM2;   

    //启动PWM0时钟
    CLK_EnableModuleClock(PWM01_MODULE);
    //IP时钟源
    CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HCLK, 0);
   
    //PWM2初始化,初始化成PWM输入捕获
    //启动PWM0时钟
    CLK_EnableModuleClock(PWM23_MODULE);
    //IP时钟源
    CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23_S_HCLK, 0);
     
    //重置PWMA通道0~通道3
    SYS_ResetModule(PWM03_RST);
     
    /* 设置PWMB通道2捕获配置 */
    PWM_ConfigCaptureChannel(PWMA, PWM_CH2, 5000, 0);

    /* 使能PWMB通道2的捕获下降沿中断*/
    PWM_EnableCaptureInt(PWMA, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH);

    /* 使能PWMA NVIC中断*/
    NVIC_EnableIRQ((IRQn_Type)(PWMA_IRQn));

    /* 使能PWMB通道2的定时器  */
    PWM_Start(PWMA, 0x4);

    /* 使能PWMB通道2的捕获功能 */
    PWM_EnableCapture(PWMA, 0x4);

    /* 等到PWMB通道2计时器开始计数 */
    while(PWMA->PDR2 == 0);
    PWM_ClearCaptureIntFlag(PWMA, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH);
   
}[code]
void PWMA_IRQHandler(void)
{
//    uint32_t u32PwmIntFlag;
    uint32_t u32CapIntFlag1;

    /* 处理PWMB捕获功能 */
    u32CapIntFlag1 = PWMA->CCR2;

    /* PWMB通道2捕获中断*/
    if(u32CapIntFlag1 & PWM_CCR2_CAPIF2_Msk)
    {
        v_Cont ++;
        g_Capif2Flag = SET;
        PWM_ClearCaptureIntFlag(PWMA, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH );
//        PWMA->CCR2 &= (PWM_CCR_MASK | PWM_CCR2_CAPIF2_Msk);
    }  
}
[code]        /* 捕获输入波形数据 */
            if(g_Capif2Flag == SET)
            {
                u32i = 0;
                g_Capif2Flag = CLEAR;
               
               
                u32Count[u32i++] = PWM_GET_CAPTURE_FALLING_DATA(PWMA, PWM_CH2);
                u32Count[u32i++] = PWM_GET_CAPTURE_RISING_DATA(PWMA, PWM_CH2);
               
//                printf("\n捕获结果:\n 高电平时间=%d,低电平时间=%d\n 高周期=%d,低周期=%d,总周期=%d.\n",
//                   u16RisingTime, u16FallingTime, u16HighPeroid, u16LowPeroid, u16TotalPeroid);
//            
//            
                printf("\n捕获结果:\n u32Count[0] =%d, u32Count[1] =%d,\n u32Count[2] =%d, u32Count[3] =%d.\n",
                       u32Count[0],u32Count[1],u32Count[2],u32Count[3]);
                printf("\n Count = %d.\n",v_Cont);
                v_Cont = 0;
            }
[/code][/code][/code][/code]

使用特权

评论回复
电子是什么|  楼主 | 2021-1-19 11:18 | 显示全部楼层
我输入端有一个10hz的信号不断的输入,百分之50的占空比,结果获取的数据不对。

使用特权

评论回复
电子是什么|  楼主 | 2021-1-19 11:19 | 显示全部楼层

CPU [url=home.php?mod=space&uid=72445]@[/url] 49766400 Hz
+-------------------------------------------------+
|    P1.7(输出)示例代码     |
+-------------------------------------------------+


捕获结果:
u32Count[0] =57825, u32Count[1] =65535,
u32Count[2] =3473, u32Count[3] =0.

Count = 1.

捕获结果:
u32Count[0] =45622, u32Count[1] =55572,
u32Count[2] =3473, u32Count[3] =0.

Count = 1.

捕获结果:
u32Count[0] =45620, u32Count[1] =55570,
u32Count[2] =3473, u32Count[3] =0.

Count = 1.

捕获结果:
u32Count[0] =45619, u32Count[1] =55570,
u32Count[2] =3473, u32Count[3] =0.

Count = 1.
9803160064f8289fa9.png
6768960064f883076b.png

使用特权

评论回复
电子是什么|  楼主 | 2021-1-19 13:50 | 显示全部楼层
解决了,最后发现   PWM_GET_CAPTURE_FALLING_DATA  这个函数获取的数据是表示整个周期的计数,但是手册上又说只要发生跳变,就会重新计数。真头疼。
PWM_GET_CAPTURE_RISING_DATA 这个是获取上升沿这段时间的计数,下降沿这段时间的计数是由 PWM_GET_CAPTURE_FALLING_DATA   获取的数  -   PWM_GET_CAPTURE_RISING_DATA获取的数。时间单位我设置成5000 ,就是5us一个计数单位。

使用特权

评论回复
二次圆根| | 2021-1-19 14:38 | 显示全部楼层
解决就好 顶一下帖子 让有同样问题的xdm学习学习

使用特权

评论回复
凯复Kane| | 2021-1-19 23:51 | 显示全部楼层
有时候手册是会跟实际的不太一样 实在是不知道怎么搞的 谢谢楼主 下次避开坑了

使用特权

评论回复
Jobs的梨子| | 2021-1-19 23:58 | 显示全部楼层
楼主问问题问得挺详细的 希望大家问问题都能这样问

使用特权

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

本版积分规则

1

主题

9

帖子

1

粉丝