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

[复制链接]
1020|7
 楼主| 电子是什么 发表于 2021-1-19 11:13 | 显示全部楼层 |阅读模式
第一次使用这个芯片,不太熟悉,使用的芯片是029LAN   用内部时钟,PWM2输入捕获,采用中断内判断是否获得捕获。
 楼主| 电子是什么 发表于 2021-1-19 11:17 | 显示全部楼层
  1.     SYS_UnlockReg();        //解锁受保护的寄存器
  2.         
  3.     Sys_Init();             //初始化系统,外设时钟和多功能I / O
  4.            
  5.     Uart0_Init(UART0_BOUND);//为printf初始化UART0
  6.    
  7.     Led_Init();             //LED工作指示灯初始化
  8.    
  9.     Pwm_Init();             //PWM0、PWM2初始化
  10.     Timer_Init();           //定时器0初始化 1ms
  11.     SYS_LockReg();          //锁定受保护的寄存器[code]//--------------------------------------------------
  12. //初始化系统时钟
  13. //--------------------------------------------------
  14. void Sys_Init(void)
  15. {
  16.     //--------------------------------------------------
  17.     //启用内部RC 22.1184MHz时钟
  18.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

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

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


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

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

  42.     //启动PWM0时钟
  43.     CLK_EnableModuleClock(PWM01_MODULE);
  44.     //IP时钟源
  45.     CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HCLK, 0);
  46.    
  47.     //PWM2初始化,初始化成PWM输入捕获
  48.     //启动PWM0时钟
  49.     CLK_EnableModuleClock(PWM23_MODULE);
  50.     //IP时钟源
  51.     CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23_S_HCLK, 0);
  52.      
  53.     //重置PWMA通道0~通道3
  54.     SYS_ResetModule(PWM03_RST);
  55.      
  56.     /* 设置PWMB通道2捕获配置 */
  57.     PWM_ConfigCaptureChannel(PWMA, PWM_CH2, 5000, 0);

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

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

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

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

  66.     /* 等到PWMB通道2计时器开始计数 */
  67.     while(PWMA->PDR2 == 0);
  68.     PWM_ClearCaptureIntFlag(PWMA, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH);
  69.    
  70. }[code]
  71. void PWMA_IRQHandler(void)
  72. {
  73. //    uint32_t u32PwmIntFlag;
  74.     uint32_t u32CapIntFlag1;

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

  77.     /* PWMB通道2捕获中断*/
  78.     if(u32CapIntFlag1 & PWM_CCR2_CAPIF2_Msk)
  79.     {
  80.         v_Cont ++;
  81.         g_Capif2Flag = SET;
  82.         PWM_ClearCaptureIntFlag(PWMA, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH );
  83. //        PWMA->CCR2 &= (PWM_CCR_MASK | PWM_CCR2_CAPIF2_Msk);
  84.     }  
  85. }
  86. [code]        /* 捕获输入波形数据 */
  87.             if(g_Capif2Flag == SET)
  88.             {
  89.                 u32i = 0;
  90.                 g_Capif2Flag = CLEAR;
  91.                
  92.                
  93.                 u32Count[u32i++] = PWM_GET_CAPTURE_FALLING_DATA(PWMA, PWM_CH2);
  94.                 u32Count[u32i++] = PWM_GET_CAPTURE_RISING_DATA(PWMA, PWM_CH2);
  95.                
  96. //                printf("\n捕获结果:\n 高电平时间=%d,低电平时间=%d\n 高周期=%d,低周期=%d,总周期=%d.\n",
  97. //                   u16RisingTime, u16FallingTime, u16HighPeroid, u16LowPeroid, u16TotalPeroid);
  98. //            
  99. //            
  100.                 printf("\n捕获结果:\n u32Count[0] =%d, u32Count[1] =%d,\n u32Count[2] =%d, u32Count[3] =%d.\n",
  101.                        u32Count[0],u32Count[1],u32Count[2],u32Count[3]);
  102.                 printf("\n Count = %d.\n",v_Cont);
  103.                 v_Cont = 0;
  104.             }
[/code][/code][/code][/code]
 楼主| 电子是什么 发表于 2021-1-19 11:18 | 显示全部楼层
我输入端有一个10hz的信号不断的输入,百分之50的占空比,结果获取的数据不对。
 楼主| 电子是什么 发表于 2021-1-19 11:19 | 显示全部楼层

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


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

  8. Count = 1.

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

  12. Count = 1.

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

  16. Count = 1.

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

  20. 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

主题

10

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部