打印

急问:关于TIM2输入捕获问题

[复制链接]
5101|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mousie|  楼主 | 2010-8-12 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为不需要一直捕获,所以在每次需要测量时进行初始化,然后TIM2ENABLE,测量结束后TIM2DISABLE。测量时发现,程序运行后首次测量很准确,但是第二次测量时发现捕获的前两个数值不对,从第三个数才开始准确,请问是怎么回事啊?
沙发
mousie|  楼主 | 2010-8-12 09:32 | 只看该作者
事实上TIM2我开了2.3两个通道,通道2触发计数器清零。我在测量之前的TIM2ENABLE处打断点确定CNT为0,然后测量时发现CCR3的值还是对的,CCR2的值前两个就大了近10倍,然后第三个值又神奇的准确了,怎么会这样呢?

使用特权

评论回复
板凳
香水城| | 2010-8-12 09:41 | 只看该作者
你要测量什么?什么原理?

使用特权

评论回复
地板
无冕之王| | 2010-8-12 09:49 | 只看该作者
楼主这样做的用途?

使用特权

评论回复
5
mousie|  楼主 | 2010-8-12 10:18 | 只看该作者
要测两路周期相同,但有一定偏差脉冲的周期和偏差,把这两股脉冲引到TIM2的2.3通道,设置通道2清零CNT,CCR2算周期,CCR3算时差

使用特权

评论回复
6
mousie|  楼主 | 2010-8-12 13:20 | 只看该作者
本帖最后由 mousie 于 2010-8-12 13:42 编辑

补充说明一下,CCR2每次错的数据都一样,具体数字不记得,大概是5万多,每次都一模一样,好像实际测量出来的一样

使用特权

评论回复
7
香水城| | 2010-8-12 14:01 | 只看该作者
要测两路周期相同,但有一定偏差脉冲的周期和偏差,把这两股脉冲引到TIM2的2.3通道,设置通道2清零CNT,CCR2算周期,CCR3算时差
mousie 发表于 2010-8-12 10:18


能说说你的具体配置吗?

使用特权

评论回复
8
mousie|  楼主 | 2010-8-13 09:41 | 只看该作者
测量之前的初始化:
void InitTIM2(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef  TIM_ICInitStructure;
  
  /*时基初始化*/
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;//更新事件装入活动的自动重装载寄存器的周期
    TIM_TimeBaseStructure.TIM_Prescaler = 0x0F;//作为TIMx 时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//时钟分割
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数器模式
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化 TIM2 的时间基数单位       
  
  TIM_PrescalerConfig(TIM2,2211,TIM_PSCReloadMode_Immediate);//TIM2以0.1ms为单位计时
  
  
  /*TIM2 Channel2设置*/
    TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;//模式:输入捕获            
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//捕获下降沿         
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管脚与寄存器分配:IC1->TI1
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//预分频器:每捕获一个边沿执行一次
    TIM_ICInitStructure.TIM_ICFilter = 0x4;//滤波器
  TIM_ICInit(TIM2, &TIM_ICInitStructure);
  
  /*TIM2 Channel3设置*/
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;//通道
  TIM_ICInit(TIM2, &TIM_ICInitStructure);
   
  /*TIM2 Channel4设置*/
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;//通道
  TIM_ICInit(TIM2, &TIM_ICInitStructure);  
   
  /*时钟设置*/
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);//选择时钟触发源(TIM2_CH2)

  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//触发方式:触发信号的上升沿重新初始化计数器及触发寄存器的更新

  TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//启动定时器的被动触发

  TIM_ITConfig(TIM2, /* TIM_IT_CC2 | */ TIM_IT_CC3 , ENABLE);//打开中断
                       
  /*使能TIM2*/
  TIM_Cmd(TIM2, ENABLE);   
}

然后在测量结束后调TIM_Cmd(TIM2, DISABLE);   

等下次测量开始时再重新初始化

使用特权

评论回复
9
acgean| | 2010-8-13 12:47 | 只看该作者
不需要测量之前初始化. 上电初始化就够了.
设定 CC2 捕捉到后, 自动清零 CNT, 重新开始计数.
看:    TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);

而 CC3 就普通的捕捉就是了.

使用特权

评论回复
10
mousie|  楼主 | 2010-8-16 14:42 | 只看该作者
CC2捕捉的那句TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);我程序里已经设置了,CC3的捕捉方式我没有专门的设置语句,是不是就是普通捕捉了呢?我上面程序里的设置具体需要怎么改呢?
另外如果我只是上电初始化的话,怎样保证平时非测量状态时即使管脚上有信号也不会进入中断呢?只在测量之前打开中断,TIM_ITConfig(TIM2,TIM_IT_CC3 , ENABLE);测量结束时关闭中断行吗?

使用特权

评论回复
11
香水城| | 2010-8-16 14:49 | 只看该作者
1)至少你要设置CC3捕获的边沿。

2)测量之前打开中断,测量结束时关闭中断。

使用特权

评论回复
12
mousie|  楼主 | 2010-8-16 15:02 | 只看该作者
您看,我的程序TIM_ICInit在通道2时有“TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//捕获下降沿 ”,在通道3时只改了“ TIM_ICInitStructure.TIM_Channel = TIM_Channel_3”, 是不是就等于把通道3也设为捕获下降沿了呢?
也就是说只要把初始化改到上电处,测量只改中断就行了吧,我回来试试!

使用特权

评论回复
13
mousie|  楼主 | 2010-8-17 09:20 | 只看该作者
还得问一下,我是一批做得三块板子,一块放在手边调,一块装到实际用到的电控柜里(有强电),还有一块刚焊不久给项目其他人员用。现在只有装到电控柜里的板子有上述第二次之后测量捕获不准的现象,而且错误测量数值还每次都一样。另外两块板子都没有发现这个问题。请问这种情况是否是板子环境造成的,有办法避免吗?现在电控柜暂时不在手边,我担心如果是环境原因,即使把初始化放到上电处也不管用啊!大家有遇到过这种情况吗?

使用特权

评论回复
14
hxcic| | 2010-8-17 09:44 | 只看该作者
:o

使用特权

评论回复
15
香水城| | 2010-8-17 10:00 | 只看该作者
还得问一下,我是一批做得三块板子,一块放在手边调,一块装到实际用到的电控柜里(有强电),还有一块刚焊不久给项目其他人员用。现在只有装到电控柜里的板子有上述第二次之后测量捕获不准的现象,而且错误测量数值还每次都一样。另外两块板子都没有发现这个问题。请问这种情况是否是板子环境造成的,有办法避免吗?现在电控柜暂时不在手边,我担心如果是环境原因,即使把初始化放到上电处也不管用啊!大家有遇到过这种情况吗? ...
mousie 发表于 2010-8-17 09:20


1)板子的环境是什么?不要说是电控柜而已,我指的是电磁环境。
2)出现你说的错误现象时,还有什么其它问题?
3)你的系统中有什么硬件和软件方面的抗干扰措施?

使用特权

评论回复
16
mousie|  楼主 | 2010-8-17 11:43 | 只看该作者
1)电控柜里有220强电和接触器,其它没什么强干扰;
2)TIM2的CCR2在程序运行后首次测量很准确,但是第二次测量时发现捕获的前两个数值不对,从第三个数才开始准确,并且每次错误数值都一样,同时程序其它功能正常;
3)没有特殊抗干扰措施,板子是放在塑料盒子里,强弱电光耦隔离,没啦;
4)鉴于错误测量值不是随机数,所以我也不确定是干扰问题

使用特权

评论回复
17
香水城| | 2010-8-17 13:57 | 只看该作者
16楼的第4点很重要,如果错误测量值不是随机数,应该还是与程序和程序的环境相关,你需要在这种环境下分析是什么原因导致的错误。

使用特权

评论回复
18
mousie|  楼主 | 2010-8-23 16:38 | 只看该作者
所谓程序环境是指什么呢?我的三块板子烧的程序是一样的,怎么就那块板子不对呢?不过我会把定时器的初始化改到上电处再试试。会管用吗?
一般研发经常会遇到这种情况吗?大概都从什么方向找毛病呢?

使用特权

评论回复
19
香水城| | 2010-8-23 18:01 | 只看该作者
程序环境是指所有影响这个程序运行的东西,例如:供电、外设、操作等等。

使用特权

评论回复
20
mousie|  楼主 | 2010-9-1 16:50 | 只看该作者
又出现新问题:程序通过使能/禁止通道三中断实现是否测量,现在在两次测量之间如果出现测量信号,虽然当时没有显示,但是在下次测量开始后,测量数据会比测量信号多出一个,其数值是再次使能中断前CCR寄存器的值,请问这种情况这么处理?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

63

帖子

1

粉丝