OpenEdv-开源电子网

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

关于定时器输入捕捉的问题

[复制链接]

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2012-2-15
在线时间
0 小时
发表于 2012-3-29 11:27:08 | 显示全部楼层 |阅读模式

我想捕捉一组PWM脉冲的两个相邻的上升沿求出周期,都设置为上升沿触发,看手册TIMx_CCMR1中
IC1PSC[1:0]:输入/捕获1预分频器 (Input capture 1 prescaler) 位3:2 这2位定义了CC1输入(IC1)的预分频系数。 一旦CC1E=’0’(TIMx_CCER寄存器中),则预分频器复位。
 00:无预分频器,捕获输入口上检测到的每一个边沿都触发一次捕获;
 01:每2个事件触发一次捕获;
 10:每4个事件触发一次捕获;
 11:每8个事件触发一次捕获。

然后我一个设置00 一个01 ,映射到同一个通道上,这样可以不,不知道我有没有理解错?

代码如下:
 u16 PWM_Period[6]={0,0,0,0,0,0};
 //两个相邻的上升沿(周期)CCR1,2,3,4上升沿触发
 TIM2->CCER=0x0;
 TIM3->CCER=0x0;

 TIM2->CCMR1=0x0601;    //输入捕获1连接到通道1 捕获2连接到通道1,每2个事件触发一次捕获
 TIM2->CCMR2=0x0601;    //输入捕获3连接到通道3 捕获4连接到通道3,每2个事件触发一次捕获     
 TIM3->CCMR1=0x0601;       //输入捕获1连接到通道1 捕获2连接到通道1,每2个事件触发一次捕获
 //输入捕捉使能
 TIM2->CCER|=0x1111;
 TIM3->CCER|=0x0011;   
 //定时器使能
 TIM2->CR1|=0x0001;
 TIM3->CR1|=0x0001;   
 //等待捕捉完成
// delay_ms(22);
 while(!(TIM2->SR&(1<<1)))
 while(!(TIM2->SR&(1<<2)))
 while(!(TIM2->SR&(1<<3)))
 while(!(TIM2->SR&(1<<4)))
 while(!(TIM3->SR&(1<<1)))
 while(!(TIM3->SR&(1<<2)))
 //关定时器关捕捉
 TIM2->CCER&=(~0x1111);
 TIM3->CCER&=(~0x0011);
 TIM2->CR1 &=(~0x0001);
 TIM3->CR1 &=(~0x0001);
 WM_Period[0]=(TIM2->CCR2)-(TIM2->CCR1);
 WM_Period[2]=(TIM2->CCR4)-(TIM2->CCR3);
 WM_Period[4]=(TIM3->CCR2)-(TIM3->CCR1);

 TIM2->CCMR1=0x0502;    //输入捕获1连接到通道2 捕获2连接到通道2,每2个事件触发一次捕获  
 TIM2->CCMR2=0x0502;    //输入捕获3连接到通道4 捕获4连接到通道4,每2个事件触发一次捕获
 TIM3->CCMR1=0x0502;      //输入捕获1连接到通道2 捕获1连接到通道2,每2个事件触发一次捕获
 //输入捕捉使能
 TIM2->CCER|=0x1111;
 TIM3->CCER|=0x0011;   
 //定时器使能
 TIM2->CR1|=0x0001;
 TIM3->CR1|=0x0001;   
 //等待捕捉完成
// delay_ms(22);
 while(!(TIM2->SR&(1<<1)))
 while(!(TIM2->SR&(1<<2)))
 while(!(TIM2->SR&(1<<3)))
 while(!(TIM2->SR&(1<<4)))
 while(!(TIM3->SR&(1<<1)))
 while(!(TIM3->SR&(1<<2)))
 //关定时器关捕捉
 TIM2->CCER&=(~0x1111);
 TIM3->CCER&=(~0x0011);
 TIM2->CR1 &=(~0x0001);
 TIM3->CR1 &=(~0x0001);
 WM_Period[1]=(TIM2->CCR2)-(TIM2->CCR1);
 WM_Period[3]=(TIM2->CCR4)-(TIM2->CCR3);
 WM_Period[5]=(TIM3->CCR2)-(TIM3->CCR1);

 printf("\r\n CH1 is 0x%X\r\n", PWM_Period[0]);
 printf("\r\n CH2 is 0x%X\r\n", PWM_Period[1]);
 printf("\r\n CH3 is 0x%X\r\n", PWM_Period[2]);
 printf("\r\n CH4 is 0x%X\r\n", PWM_Period[3]);
 printf("\r\n CH5 is 0x%X\r\n", PWM_Period[4]);
 printf("\r\n CH6 is 0x%X\r\n", PWM_Period[5]);


而实际上,跑一会,基本就会卡在某个标志位检测哪里,异常蛋疼

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2012-2-15
在线时间
0 小时
 楼主| 发表于 2012-3-29 16:11:46 | 显示全部楼层
继续顶,经在线调试,上面的情况下,第一轮检测六个标志位没问题,读CCR也能正常清除,但第二轮检测标志位时,发现SR没相应置位,所以卡主了,
然后我看了下手册,在代码开头加了两行
        TIM2->EGR|=0x001E;
TIM3->EGR|=0x001E;
虽然后来在线调试时看寄存器设置发现没起作用,(依然是TIM2->EGR=0x0000),但能正常置位,一直跑下去了,但退出DEBUG,重新跑又卡死了···再开DEBUG,不卡···
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2012-3-29 17:42:32 | 显示全部楼层
这个论坛有网友发过帖子了.你参考下别人是怎么做的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2012-2-15
在线时间
0 小时
 楼主| 发表于 2012-3-29 18:52:08 | 显示全部楼层
我发现更改捕捉映射后,做一定硬件延时就可以了,(这一定程度上说明了为啥在线调试一步一步来不卡死,但直接放他跑会跑死······)
至于为什么会有这种奇怪的情况?是不是STM32硬件本身的问题呢?

希望有高手能提供验证的方法,哦,忘了说,这个是接收机输出的PWM信号接收程序的一部分
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2012-3-29 21:22:31 | 显示全部楼层
有点类似DMA的时钟.DMA在时钟开启之后也要等待一段时间.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-10-22
在线时间
0 小时
发表于 2014-3-7 17:22:37 | 显示全部楼层
原子哥,小弟想请教一下为什么用捕获方式接收其它定时器PWM输出的信号时,测得的脉宽误差比较大呢?例如修改一下《ALIENTEK战舰STM32开发板》的第十五个实验,PWM脉宽设定为固定值(TIM_SetCompare2(TIM3, 299);),测到的脉宽只有8.4us,程序串口打印值为6us。我还做了个测试,发现误差基本在2us。怎么理解这里边的误差(A-B)呢?附图。



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-7 21:27:56 | 显示全部楼层
回复【6楼】englyf:
---------------------------------
输入捕获实验的计数器时钟为1Mhz,也就是1us的基本事件,你这里误差基本就是2us,还算正常了。
你想高精度,那就用更快的速度,比如用10Mhz的计数脉冲,或者72M的计数脉冲,那就准确的多了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-10-22
在线时间
0 小时
发表于 2014-3-10 17:18:37 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
提高输入捕获的时钟频率后,误差减少得不多,发现只有在输入的脉冲宽度提高后才有见效,也就是说还是做不到比较高的捕获精度,尤其是检测脉冲宽度较小的时候。会不会是用C写的缘故?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-10 22:19:19 | 显示全部楼层
回复【8楼】englyf:
---------------------------------
你的脉宽多小的时候,出现误差很大?
中断响应、中断执行都是需要时间的,这些都得考虑。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-10-22
在线时间
0 小时
发表于 2014-3-11 10:16:55 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
十来个us以下,误差有2个us左右。我也觉得中断响应、中断执行的时间得考虑,所以这方面时间控制要求高点。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-13 23:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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