OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2440|回复: 11

stm32采集方波脉宽如何提高测量精度

[复制链接]

15

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2017-2-21
在线时间
159 小时
发表于 2019-9-7 13:15:17 | 显示全部楼层 |阅读模式
10金钱
我想采集一个145HZ左右的方波信号测量他的脉宽,现在使用的是输入捕获,定时器的计数频率是1MHZ,但是精度没有达到预期的效果,但是想提高测量的精度(精度越高越好),大家有什么好的办法推荐一些,谢谢,

最佳答案

查看完整内容[请看2#楼]

这个用的是PWM输入模式,直接可以测PWM的频率和占空比。原子哥那个用的是输入捕获模式,测的是高电平时长。两种方法都可以捕获时间,具体差别去看中文参考手册定时器功能描述相关部分。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-9-7 13:15:18 | 显示全部楼层
usb123 发表于 2019-9-9 15:12
我能再请教您一下吗,我现在是试用的原子哥的那个例程中的进行捕获时间的,您这个我简单的测试了一下,还 ...

这个用的是PWM输入模式,直接可以测PWM的频率和占空比。原子哥那个用的是输入捕获模式,测的是高电平时长。两种方法都可以捕获时间,具体差别去看中文参考手册定时器功能描述相关部分。
回复

使用道具 举报

8

主题

185

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
47 小时
发表于 2019-9-7 20:00:23 | 显示全部楼层
记住你再高也高不过CPU的主频。。。
回复

使用道具 举报

8

主题

185

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
47 小时
发表于 2019-9-7 20:01:15 | 显示全部楼层
只要你设置的精度不高于CPU的主频即可。
回复

使用道具 举报

8

主题

185

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
47 小时
发表于 2019-9-7 20:02:27 | 显示全部楼层
并且定时器的频率也有指标要求,看看使用手册。
回复

使用道具 举报

15

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2017-2-21
在线时间
159 小时
 楼主| 发表于 2019-9-9 07:56:04 | 显示全部楼层
顶一下
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-9-9 13:53:29 | 显示全部楼层

  1. // TIM3_CH1  PA6 做为捕获通道
  2. // 输入捕获能捕获到的最小的频率为 72M/{ (ARR+1)*(PSC+1) }
  3. void Capture_Init(u16 arr, u16 psc)
  4. {
  5.     GPIO_InitTypeDef GPIO_InitStructure;
  6.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturcture;
  7.     TIM_ICInitTypeDef TIM_ICInitSturcture;
  8.     NVIC_InitTypeDef NVIC_InitStructure;

  9.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  10.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  13.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  15.     TIM_TimeBaseInitSturcture.TIM_Period = arr;
  16.     TIM_TimeBaseInitSturcture.TIM_Prescaler = psc;
  17.     TIM_TimeBaseInitSturcture.TIM_ClockDivision = TIM_CKD_DIV1;
  18.     TIM_TimeBaseInitSturcture.TIM_CounterMode = TIM_CounterMode_Up;
  19.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitSturcture);

  20.     TIM_ICInitSturcture.TIM_Channel = TIM_Channel_1;
  21.     TIM_ICInitSturcture.TIM_ICFilter = 0x00;
  22.     TIM_ICInitSturcture.TIM_ICPolarity = TIM_ICPolarity_Rising;
  23.     TIM_ICInitSturcture.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  24.     TIM_ICInitSturcture.TIM_ICSelection = TIM_ICSelection_DirectTI;
  25.     //TIM_ICInit(TIM3, &TIM_ICInitSturcture);

  26.     TIM_PWMIConfig(TIM3, &TIM_ICInitSturcture);                        //初始化PWM输入模式
  27.     // 当工作做PWM输入模式时,只需要设置触发信号的那一路即可(用于测量周期)
  28.     // 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置

  29.     TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);                        //选择输入捕获触发信号
  30.     TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);       // PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT会被复位
  31.     TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);


  32.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  33.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  34.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  35.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  36.     NVIC_Init(&NVIC_InitStructure);

  37.     TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);          // 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个)
  38.     TIM_Cmd(TIM3, ENABLE);
  39. }

  40. float DutyCycle = 0;
  41. float Frequency  = 0;
  42. u32 IC1Value = 0;
  43. u32 IC2Value = 0;
  44. // 如果是第一个上升沿中断,计数器会被复位,锁存到CCR1寄存器的值是0,CCR2寄存器的值也是0,
  45. // 无法计算频率和占空比。当第二次上升沿到来的时候,CCR1和CCR2捕获到的才是有效的值。其中
  46. // CCR1对应的是周期,CCR2对应的是占空比。
  47. void TIM3_IRQHandler(void)
  48. {
  49.     TIM_ClearITPendingBit(TIM3,  TIM_IT_CC1);

  50.     IC1Value = TIM_GetCapture1(TIM3);                //总长度
  51.     IC2Value = TIM_GetCapture2(TIM3);                //占空比

  52.     if(IC1Value != 0)
  53.     {
  54.         DutyCycle = (float)(IC2Value  * 100) / IC1Value ;
  55.         Frequency = 1000000 / (float)IC1Value ;
  56.         printf("频率:%0.2f,占空比:%0.2f \r\n", Frequency, DutyCycle);
  57.     }
  58.     else
  59.     {
  60.         DutyCycle = 0;
  61.         Frequency = 0;
  62.     }
  63. }


  64. int main(void)
  65. {
  66.     u32 j = 0;
  67.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  68.     uart_init(115200);
  69.     Capture_Init(59999,71);  // 可捕获最小频率 72M/(72*60000)= 17Hz
  70.     while(1)
  71.     {
  72.     }
  73. }
复制代码


回复

使用道具 举报

15

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2017-2-21
在线时间
159 小时
 楼主| 发表于 2019-9-9 15:09:30 | 显示全部楼层
五月爸爸 发表于 2019-9-7 20:01
只要你设置的精度不高于CPU的主频即可。

这个我清楚,采集分的越细当然精度越高,我想问的是我现在这个方案是对的吗,捕获
回复

使用道具 举报

15

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2017-2-21
在线时间
159 小时
 楼主| 发表于 2019-9-9 15:09:57 | 显示全部楼层
五月爸爸 发表于 2019-9-7 20:02
并且定时器的频率也有指标要求,看看使用手册。

谢谢啦
回复

使用道具 举报

15

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2017-2-21
在线时间
159 小时
 楼主| 发表于 2019-9-9 15:12:25 | 显示全部楼层

我能再请教您一下吗,我现在是试用的原子哥的那个例程中的进行捕获时间的,您这个我简单的测试了一下,还没有做详细的对比,我想同时才可以三个通道,按照您现在这个写法,应该也是支持的吧,还有就是您这个写法相对于原子哥的那个按键捕获高低电平时间来说,有什么优点,这个不太懂,谢谢啦
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-9-10 10:13:58 | 显示全部楼层
usb123 发表于 2019-9-9 15:12
我能再请教您一下吗,我现在是试用的原子哥的那个例程中的进行捕获时间的,您这个我简单的测试了一下,还 ...

这个用的是PWM输入模式,直接可以测PWM的频率和占空比。原子哥那个用的是输入捕获模式,测的是高电平时长。两种方法都可以捕获时间,具体差别去看中文参考手册定时器功能描述相关部分。
回复

使用道具 举报

15

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2017-2-21
在线时间
159 小时
 楼主| 发表于 2019-9-10 16:11:17 | 显示全部楼层
HXYDJ 发表于 2019-9-10 10:14
这个用的是PWM输入模式,直接可以测PWM的频率和占空比。原子哥那个用的是输入捕获模式,测的是高电平时长 ...

谢谢啦,我再研究一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 00:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表