打印
[STM8]

stm8 定时器输入捕获问题

[复制链接]
4387|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gpjun2008|  楼主 | 2013-11-27 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1;比如我设的是上升沿捕获,那输入捕获是在上升沿捕获的吗?捕获的是一个周期吗?那就可以用它来测输入信号的频率了。
2;比如我现在还是设上升沿捕获,我想捕获按键按下去的低电平时间,那应该怎么实现,那不是得检测完下降沿再检测上升沿吗?好像同时上升沿下降沿不行吧,还是说设完下降沿再换成上升沿捕获。这样好像不是很好。有没有更好的办法?
沙发
huzi2099| | 2013-11-27 09:59 | 只看该作者
1:是上升沿,是不是周期就不知道了,捕获时计数值送通道值,由逻辑电路实现.
2:按键的话消抖必须硬件解决;捕获后要及时的处理.

使用特权

评论回复
板凳
gpjun2008|  楼主 | 2013-11-27 10:06 | 只看该作者
huzi2099 发表于 2013-11-27 09:59
1:是上升沿,是不是周期就不知道了,捕获时计数值送通道值,由逻辑电路实现.
2:按键的话消抖必须硬件解决;捕获 ...

1:连续上升沿捕获,周期T=捕获n-捕获n-1,测频率应该没问题了。
2:按键的话,我只想测低电平,那这感觉要下降沿捕获一次,上升沿捕获一次,然后
低电平时间 T = 捕获上升沿 - 捕获下降沿。能这样实现吗。
还有就是消抖的话,可以用滤波的吧。

使用特权

评论回复
地板
huzi2099| | 2013-11-27 12:11 | 只看该作者
gpjun2008 发表于 2013-11-27 10:06
1:连续上升沿捕获,周期T=捕获n-捕获n-1,测频率应该没问题了。
2:按键的话,我只想测低电平,那这感觉 ...

把计数回零考虑进去没问题
可以,这个不难.

使用特权

评论回复
5
chuangpu| | 2013-11-27 17:53 | 只看该作者
这个不是很懂   楼主   帮你顶一个   看看别人的意见吧   

使用特权

评论回复
6
gpjun2008|  楼主 | 2013-11-28 08:45 | 只看该作者
chuangpu 发表于 2013-11-27 17:53
这个不是很懂   楼主   帮你顶一个   看看别人的意见吧

谢谢。

使用特权

评论回复
7
gpjun2008|  楼主 | 2013-11-28 08:49 | 只看该作者
我的中断差不多可以了,但是只能进入一次中断(即复位后只能检测到一次的按键低电平脉冲,后面再按进不了中断),不知道哪个问题,求解。附上中断函数:s为全局变量,如果
//下降沿开始,上升沿结束。测低电平脉冲宽度
#pragma vector=0x10
__interrupt void TIM2_CAP_COM_IRQHandler(void)
{
   u16 n=0;
   TIM2_EGR|=0x02;         
   if(!TIM2_CCER1_CC1P)     //上升沿结束
   {
     n=TIM2_CCR1H*256;
     TIM2_SR1 &=~(0x02);    //清除通道1捕获中断标志
     TIM2_CCER1=0x02;       //设为下降沿
   }
   s=n;
   if(TIM2_CCER1_CC1P)      //下降沿开始
   {
     TIM2_CCR1H=0;          // 清零
     TIM2_CCR1L=0;
     TIM2_SR1 &=~(0x02);    //清除通道1捕获中断标志
     TIM2_CCER1&=0xfd;      //设为上升沿捕捉
   }   
}

使用特权

评论回复
8
Rain_King| | 2013-11-28 08:57 | 只看该作者
你要捕获按键按下去低电平的时间???恐怕很难啊.....因为按键按下去的时候会有抖动,这个过程会产生很多捕获中断啊......

使用特权

评论回复
9
gpjun2008|  楼主 | 2013-11-28 09:40 | 只看该作者
Rain_King 发表于 2013-11-28 08:57
你要捕获按键按下去低电平的时间???恐怕很难啊.....因为按键按下去的时候会有抖动,这个过程会产生很多 ...

这个应该可以实现的吧。stm有tim2_ccmr可以设置滤波。只是这个滤波设置的根据,滤掉几个时间,不是很清楚。我设了N=4和N=8没什么区别。

使用特权

评论回复
10
Rain_King| | 2013-11-28 09:46 | 只看该作者
gpjun2008 发表于 2013-11-28 09:40
这个应该可以实现的吧。stm有tim2_ccmr可以设置滤波。只是这个滤波设置的根据,滤掉几个时间,不是很清楚 ...

哦....我也是刚接触STM8,不是很了解,其实你可以人工滤波的啊....比如捕获的时间太短,没有超过一定时间的,可以自动滤掉嘛....

使用特权

评论回复
11
Rain_King| | 2013-11-28 09:48 | 只看该作者
gpjun2008 发表于 2013-11-28 09:40
这个应该可以实现的吧。stm有tim2_ccmr可以设置滤波。只是这个滤波设置的根据,滤掉几个时间,不是很清楚 ...

还有能不能告诉我一些基础的关于stm8的语法啊...比如脚的定义,中断等等方面的知识,资料也可以啊...刚从pic转过来.....

使用特权

评论回复
12
gpjun2008|  楼主 | 2013-11-28 09:55 | 只看该作者
Rain_King 发表于 2013-11-28 09:46
哦....我也是刚接触STM8,不是很了解,其实你可以人工滤波的啊....比如捕获的时间太短,没有超过一定时间 ...

这也是一种办法。不过如果能用寄存器直接滤波效果应该更好,代码还少点。只能慢慢摸索,stm8的资料略少点。

使用特权

评论回复
13
gpjun2008|  楼主 | 2013-11-28 10:30 | 只看该作者
Rain_King 发表于 2013-11-28 09:48
还有能不能告诉我一些基础的关于stm8的语法啊...比如脚的定义,中断等等方面的知识,资料也可以啊...刚从 ...

脚的定义主要就是配置DDR、CR1、CR2。输出就从ODR输出,读入就从IDR读入。中文参考手册P83
中断的话注意开关总中断:asm(sim);asm(rim);中文参考手册P74.资料正在传,网速有点慢
void IO_Init(void)
{
  PE_DDR |= 0x20;       //片选 PE5片选
  PE_CR1 |= 0x20;
  PE_CR2 &=~ 0x20;
  PE_ODR |= 0x20;
  PC_DDR |= 0x60;       //PC5 SCK时钟连1621wr, PC6 MOSI 连1621data都设推
  PC_CR1 |= 0x60;      
  PC_CR2 &=~ 0x60;
  PD_DDR &=~ 0x10;       //PD4 上拉捕获输入
  PD_CR1 |= 0x10;
  PD_CR2 &=~ 0x10;
  PB_DDR &=~ 0x03;       //PB 上拉捕获输入
  PB_CR1 |= 0x03;
  PB_CR2 &=~ 0x03;
}

使用特权

评论回复
14
Rain_King| | 2013-11-28 10:35 | 只看该作者
gpjun2008 发表于 2013-11-28 10:30
脚的定义主要就是配置DDR、CR1、CR2。输出就从ODR输出,读入就从IDR读入。中文参考手册P83
中断的话注意 ...

谢谢啦.......你是在读书,还是在工作????

使用特权

评论回复
15
kkzz| | 2013-11-28 11:04 | 只看该作者
stm32f3是有时钟周期捕获的,不知道stm8有木有的。

使用特权

评论回复
16
kkzz| | 2013-11-28 11:04 | 只看该作者
你可以通过设置不同的捕获方式来实现的。

使用特权

评论回复
17
gpjun2008|  楼主 | 2013-11-28 11:13 | 只看该作者
Rain_King 发表于 2013-11-28 10:35
谢谢啦.......你是在读书,还是在工作????

资料
资料已经上传,欢迎沙发。

使用特权

评论回复
18
gpjun2008|  楼主 | 2013-11-28 11:14 | 只看该作者
kkzz 发表于 2013-11-28 11:04
你可以通过设置不同的捕获方式来实现的。

正在尝试中。

使用特权

评论回复
19
Rain_King| | 2013-11-28 11:16 | 只看该作者
gpjun2008 发表于 2013-11-28 11:13
资料
资料已经上传,欢迎沙发。

我勒个擦...这个资料真大.....下载回去好好看看。。。。。。。。。谢谢啦

使用特权

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

本版积分规则

38

主题

267

帖子

3

粉丝