OpenEdv-开源电子网

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

(求相位差时出现的终极错误)定时器开启两个通道捕获中断里会出错

[复制链接]

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-10-29
在线时间
16 小时
发表于 2015-12-17 18:12:10 | 显示全部楼层 |阅读模式
5金钱

本人最近依然在求相位差,做的只差最后一步,会出现一段很小的区间混乱,其余都正常,不同频率该区间还会变化,实在无解前来求助!

经过调试发现问题再定时器开两个通道捕获中断上,一旦开启两个通道捕获,在中断里鉴别到的频率也会随着相位的变化出现某个不对称小区间的变化。

部分代码如下:

初始化里
 //CH2后捕获一个上升沿//初始化TIM2输入捕获参数 CH1 CH2
 TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01  选择输入端 IC1映射到TI1上
   TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
   TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
   TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
   TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
   TIM_ICInit(TIM2, &TIM2_ICInitStructure);
 
 TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2;
   TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
   TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上********

***********************(如果是IndirectTI,为什么频率不出错但是无法求任何相位了)**********************
   TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
   TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
   TIM_ICInit(TIM2, &TIM2_ICInitStructure);//初始化TIM2输入捕获参数 CH1 CH2
 TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01  选择输入端 IC1映射到TI1上
   TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
   TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
   TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
   TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
   TIM_ICInit(TIM2, &TIM2_ICInitStructure);
 
   TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2;
   TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
   TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上********
   TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
   TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
   TIM_ICInit(TIM2, &TIM2_ICInitStructure);

//中断分组初始化
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级1级
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
 NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
 
 TIM_ITConfig(TIM2,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_Update,ENABLE);//允许更新中断 ,允许CC2IE捕获中断
 TIM_Cmd(TIM2,ENABLE );  //使能定时器2


就这样配置了两个通道的捕获中断,都开启后,在中断函数里只写一个单通道频率求取函数就出现了一个小区间的错误,但是两个通道都有输入,相位调节过程中出现的错误,标志位是都清除的。如果是溢出问题(已经考虑到溢出),那也太高深了,求解答!万分感谢!

都快而立之年,还是要写代码...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-10-29
在线时间
16 小时
 楼主| 发表于 2015-12-17 18:12:52 | 显示全部楼层
只开启一个捕获中断求频率很准确,不会有这种小区间的混乱。
都快而立之年,还是要写代码...
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-10-29
在线时间
16 小时
 楼主| 发表于 2015-12-17 18:13:53 | 显示全部楼层
再顶一下!求解释这个多通道开启后,不同的捕获中断有无优先级?还有溢出更新中断跟它们的优先级是否相同?
都快而立之年,还是要写代码...
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 09:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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