OpenEdv-开源电子网

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

关于测量PWM波高电平时间误差问题

[复制链接]

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
发表于 2016-1-30 12:51:24 | 显示全部楼层 |阅读模式
10金钱
如题,最近在测试方波高电平时间,以战舰V3的实验15:输入捕获实验为例,测试1KHz,50%的PWM波,理论上是500us的高电平时间,(示波器也的确测试出500us的高电平时间),但是从PA0口输入,打印到屏幕上却是498us,而且测试很多组数据,都发现高电平时间差2us;稍微改动历程的中断处理函数,变为测量两个上升沿,即测试周期,发现为998us,示波器上也是1000us,这个说明STM32产生的PWM波的高电平时间以及周期都不会产生误差,PWM波的产生正常,但是输入捕获,测量高电平以及周期会产生误差?即2us的误差?求问这个2us的误差来源?

测量占空比和周期,还有另外一种方法,即中文参考手册里面的PWM输入模式,这个可以测量高电平时间以及周期,还是以战舰V3开发板,论坛里的历程移植,测试1KHz 40%的占空比(示波器测试正确),屏幕打印发现差1us,高电平时间以及周期都是差1us,求解释这个1us的误差来源?
小弟认为是程序指令上的误差(空想),能不能用数据说明?即执行一个指令需要多少时间?这个2us的误差是由于调用哪条指令,执行哪些指令产生的?

最佳答案

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

经过别人的提示,暂时解决了PWM输入模式下,差1us的问题,这个1us的误差,是因为计数器的计数初值问题,计数器从0-ARR,从0开始计数,而算占空比的时候,习惯与从1开始计数,所以 duty = TIM_GetCapture1(TIM4)+1; period=TIM_GetCapture2(TIM4)+1; duty跟period都应该+1,对应到主函数里设置占空比的函数: TIM_SetCompare1(TIM3,25); 这样在输出 printf("High Level= %dus \r\n",duty); printf("Period= %du ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
 楼主| 发表于 2016-1-30 12:51:25 | 显示全部楼层
ricefat 发表于 2016-1-30 14:21
输入捕获功能在芯片中应该包括了一个滤波过程,你看下参考手册,里面好像有关于输入捕获引脚电路结构。即使 ...

经过别人的提示,暂时解决了PWM输入模式下,差1us的问题,这个1us的误差,是因为计数器的计数初值问题,计数器从0-ARR,从0开始计数,而算占空比的时候,习惯与从1开始计数,所以
duty = TIM_GetCapture1(TIM4)+1;                                        
period=TIM_GetCapture2(TIM4)+1;
duty跟period都应该+1,对应到主函数里设置占空比的函数: TIM_SetCompare1(TIM3,25);
这样在输出
printf("High Level= %dus \r\n",duty);                               
printf("Period= %dus\r\n",period);
printf("Duty Ration= %d%%\r\n",duty*100/period);
高电平时间,周期,占空比就不会有问题了
还有关于指令的执行所需要的时间,肯定不可能有这么大的误差,(在PWM输入模式下,可能都没有这方面的问题)
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-1-30 14:21:25 | 显示全部楼层
输入捕获功能在芯片中应该包括了一个滤波过程,你看下参考手册,里面好像有关于输入捕获引脚电路结构。即使是最简单的RC滤波也会造成一定的延时。另外STM32因为芯片结构设计的问题(流水线什么的),指令的执行时间不能像51那样明确计算。具体的可以去看看cortex M芯片的设计手册
回复

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
 楼主| 发表于 2016-1-31 15:02:26 | 显示全部楼层
输入捕获实验:TIM_SetCompare2(TIM3,500);设置50%的占空比,应该输出500us高电平时间才对,但是实际输出498us,差2us,测试很多组数据,发现也是差2us;

这个2us的误差来源是由于计数初值的问题;在timer.c文件中测量高电平的时间是这样的,上升沿到来时,进中断,把计数器清0 TIM_SetCounter(TIM5,0);然后等待下降沿,到来时获取计数器的值,TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);注意此时从TIM_SetCounter(TIM5,0);到TIM_GetCapture1(TIM5);这两个差值即为高电平时间,但是是从0开始计数的;把清0变为设置为1,即TIM_SetCounter(TIM5,1);可以发现为499us,误差为1us;说明2us的误差其中1us是这里的缘故;另外1us的缘故在于TIM_SetCompare2(TIM3,500);这里,也是从0开始计数的,0到500,是501个数字,而我们认为这儿是500us的高电平,人为的认为是从1开始计数的,解决方法是TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5)+1;加1即可;或者temp+1也行;亲测修改过后,高电平时间正确,符合预计的500us高电平时间。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 07:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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