找回密码
 立即注册

QQ登录

只需一步,快速开始

NUC240的PWM capture 最小输入频率

查看数: 3602 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-5-18 09:26

正文摘要:

本帖最后由 assman 于 2022-5-20 08:56 编辑 各位大大安安,我在学习NUC240 BSP中Smpl_Basic01_PWM_Capture范例,输入的PWM频率范围在0~100Hz区间,量测周期结果不是输入的PWM频率,是否该设定PWM_ConfigCaptureC ...

回复

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

回复 assman 发表于 2022-5-23 22:39:32
admin 发表于 2022-5-23 16:24
可以每一组分开设置是作为PWM输出还是捕获输入

版大抱歉我的意思是同一组中输出模式和补获模式同时使用,这样补获模式数值似乎会怪怪的,谢谢!
回复 admin 发表于 2022-5-23 16:24:13
assman 发表于 2022-5-23 07:28
感谢版大讲说,另外想问这四对PWM可以将每一对分别设定输出模式和补获模式使用嘛,比方说PWM0是补获模式 ...

可以每一组分开设置是作为PWM输出还是捕获输入
回复 assman 发表于 2022-5-23 15:28:23

感谢版大讲说,另外想问这四对PWM可以将每一对分别设定输出模式和补获模式使用嘛,比方说PWM0是补获模式,PWM1是输出模式,这样用好像补获模式数值会怪怪的,谢谢!
回复 admin 发表于 2022-5-19 16:36:59

回复 admin 发表于 2022-5-19 16:36:18
3、循环里发生下降沿中断后,为何同时清除上下沿中断标志?
因为例程是选择的先记录下降沿,从B处的下降沿到0位置时,中间必定会先发生上升沿,所以此时应该要将上下沿标志都清除。
回复 admin 发表于 2022-5-19 16:35:53
1、设置捕获的时钟预分频值请修改下面函数的第二个参数,
/* If input minimum frequency is 250Hz, user can calculate capture settings by follows.
           Capture clock source frequency = __HXT = 12000000 in the sample code.
           (CNR+1) = Capture clock source frequency/prescaler/clock source divider/minimum input frequency
                   = 12000000/2/1/250 = 24000
           (Note: CNR is 16 bits, so if calculated value is larger than 65536, user should increase prescale value.)
           CNR = 0xFFFF
           (Note: In capture mode, user should set CNR to 0xFFFF to increase capture frequency range.)
        */
Capture unit time = 1/(Capture clock source frequency/prescaler)
           166ns = 1/(12000000/2)
PWM_ConfigCaptureChannel(PWMB, PWM_CH2, 166, 0);
2、为何CalPeriodTime函数里连清两次下降沿中断?
程序设置的是下降沿捕获时会清除计数器重新计数。
两次清除下降沿是为了定位一个测量的起点。比如刚进入此函数时有可能刚发生下降沿中断,也可能发生完下降沿+上升沿,所以这个中断忽略对应A段;
等到下一个下降沿发生时,把它当作测量的起点,所以B点的中断标志也清除掉,开始正事测试。
回复 assman 发表于 2022-5-19 09:52:38
另外还想问CalPeriodTime这函数,一开始是先清除下降沿指示,然后等下降沿信号,再清除下降沿指示,这里为何要连清二次下降沿指示,
不是已经下降完成了,接着肯定要上升沿了,也就是上升信号?

另外在循环里,一开始等下降沿信号,然后清除上升/下降沿指示,这里为何不是只清除下降沿指示即可,而是二者皆清除?

  1. void CalPeriodTime(PWM_T *PWM, uint32_t u32Ch)
  2. {
  3.     uint16_t u32Count[4];
  4.     uint32_t u32i;
  5.     uint16_t u16RisingTime, u16FallingTime, u16HighPeroid, u16LowPeroid, u16TotalPeroid;

  6.     /* Clear Capture Falling Indicator (Time A) */
  7.     PWM_ClearCaptureIntFlag(PWM, u32Ch, PWM_CAPTURE_INT_FALLING_LATCH);

  8.     /* Wait for Capture Falling Indicator  */
  9.     while(PWM_GetCaptureIntFlag(PWM, u32Ch) < 2);

  10.     /* Clear Capture Falling Indicator (Time B)*/
  11.     PWM_ClearCaptureIntFlag(PWM, u32Ch, PWM_CAPTURE_INT_FALLING_LATCH);

  12.     u32i = 0;

  13.     while(u32i < 4)
  14.     {
  15.         /* Wait for Capture Falling Indicator */
  16.         while(PWM_GetCaptureIntFlag(PWM, u32Ch) < 2);

  17.         /* Clear Capture Falling and Rising Indicator */
  18.         PWM_ClearCaptureIntFlag(PWM, u32Ch, PWM_CAPTURE_INT_FALLING_LATCH | PWM_CAPTURE_INT_RISING_LATCH);

  19.         /* Get Capture Falling Latch Counter Data */
  20.         u32Count[u32i++] = PWM_GET_CAPTURE_FALLING_DATA(PWM, u32Ch);

  21.         /* Wait for Capture Rising Indicator */
  22.         while(PWM_GetCaptureIntFlag(PWM, u32Ch) < 2);

  23.         /* Clear Capture Rising Indicator */
  24.         PWM_ClearCaptureIntFlag(PWM, u32Ch, PWM_CAPTURE_INT_RISING_LATCH);

  25.         /* Get Capture Rising Latch Counter Data */
  26.         u32Count[u32i++] = PWM_GET_CAPTURE_RISING_DATA(PWM, u32Ch);
  27.     }

  28.     u16RisingTime = u32Count[1];

  29.     u16FallingTime = u32Count[0];

  30.     u16HighPeroid = u32Count[1] - u32Count[2];

  31.     u16LowPeroid = 0x10000 - u32Count[1];

  32.     u16TotalPeroid = 0x10000 - u32Count[2];

  33.     printf("\nCapture Result: Rising Time = %d, Falling Time = %d \nHigh Period = %d, Low Period = %d, Total Period = %d.\n\n",
  34.            u16RisingTime, u16FallingTime, u16HighPeroid, u16LowPeroid, u16TotalPeroid);
  35. }
复制代码


新唐MCU