stm32的输入捕获实验程序问题(测量脉冲宽度)
初始化函数没有问题,计数时间单位为1us,编程思路是定义两个全局变量一个32位的一个8位的,32位用来存放输入捕获值,8位的最高位用来表示捕获到高电平(1表示捕获)次高位...
初始化函数没有问题,计数时间单位为1us,编程思路是定义两个全局变量一个32位的一个8位的,32位用来存放输入捕获值,8位的最高位用来表示捕获到高电平(1表示捕获)次高位表示脉冲是否捕获完成(捕获完成置1),低六位用来表示计数器溢出次数的,每溢出一次自加一,通过定义的i/o口结合按键手动输入高电平,本来是不会出现溢出情况的(32位定时器溢出需要4千多秒)但是按一下按键有的时候就会出现溢出的那种情况,实在是找不出来有什么逻辑问题了,求大神指教,本人虚心求教万望各位指点一二
展开
3个回答
展开全部
1、脉冲宽度
如下图所示,采集该高电平脉冲的宽度,只需要进入输入捕获上升沿检测,记录当前的发生上升沿时的CNT值,再进行输入捕获下降沿检测,也记录当前发生下降沿时的CNT值,两次CNT值的差值再根据计数的频率就可以算出脉冲的宽度。
上升沿及下降沿捕获的程序具体实现如下:
TIM8_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
void TIM8_UP_IRQHandler(void)
{
if((TIM8CH4_CAPTURE_STA&0X80)==0) //还未成功捕获
{
if (TIM_GetITStatus(TIM8,TIM_IT_Update) != RESET)
{
if(TIM8CH4_CAPTURE_STA&0X40) //已经捕获到高电平了
{
if((TIM8CH4_CAPTURE_STA&0X3F)==0X3F) //高电平太长了
{
TIM8CH4_CAPTURE_STA"=0X80; //标记成功捕获了一次
TIM8CH4_CAPTURE_VAL=0XFFFF;
}
else
TIM8CH4_CAPTURE_STA++; //捕获高电平后定时器溢出的次数++
}
}
}
TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位
}
void TIM8_CC_IRQHandler(void)
{
if((TIM8CH4_CAPTURE_STA&0X80)==0)
{
if(TIM_GetITStatus(TIM8,TIM_IT_CC4) != RESET) //捕获1发生捕
如下图所示,采集该高电平脉冲的宽度,只需要进入输入捕获上升沿检测,记录当前的发生上升沿时的CNT值,再进行输入捕获下降沿检测,也记录当前发生下降沿时的CNT值,两次CNT值的差值再根据计数的频率就可以算出脉冲的宽度。
上升沿及下降沿捕获的程序具体实现如下:
TIM8_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
void TIM8_UP_IRQHandler(void)
{
if((TIM8CH4_CAPTURE_STA&0X80)==0) //还未成功捕获
{
if (TIM_GetITStatus(TIM8,TIM_IT_Update) != RESET)
{
if(TIM8CH4_CAPTURE_STA&0X40) //已经捕获到高电平了
{
if((TIM8CH4_CAPTURE_STA&0X3F)==0X3F) //高电平太长了
{
TIM8CH4_CAPTURE_STA"=0X80; //标记成功捕获了一次
TIM8CH4_CAPTURE_VAL=0XFFFF;
}
else
TIM8CH4_CAPTURE_STA++; //捕获高电平后定时器溢出的次数++
}
}
}
TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位
}
void TIM8_CC_IRQHandler(void)
{
if((TIM8CH4_CAPTURE_STA&0X80)==0)
{
if(TIM_GetITStatus(TIM8,TIM_IT_CC4) != RESET) //捕获1发生捕
追问
首先感谢您耐心的回答,但是我真找不出我的程序哪里有错误,没有问题的程序我这也有就是想不明白我自己写的这个有什么问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
具体的捕获流程我不太了解,但你的代码里有几个明显的问题。
1.图一中你的判断条件是STA>=0x80进入第一层if后,不可能出现STA==0x3f的情况,因为此时STA总是大于0x3f的。还有STA++会导致一个后果,会可能修改掉你的bit7和bit6,正确的此处加加的方式应该是
//1.达到最大计数后重新开始计数
if(STA & 0x3F == 0x3F)
STA &= 0xC0;
STA++;
//2.或者保持最大计数
if(STA & 0x3F == 0x3F)
STA |= 0x3F;
else
STA++;
2.图三里为什么要乘以0xFFFFFFFF啊?还有while(a==40)完全没意义啊,这个循环体里把a=0了呀
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(22)有版本作“疲龙”;(23)有版本作“喷水”;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询