切换到宽版
  • 1906阅读
  • 7回复

[STM]STM8学习之——周期测量的疑问 [复制链接]

上一主题 下一主题
离线zeze10000
 

发帖
2858
M币
8559
专家
35
粉丝
112
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-06-25
最近学STM8的输入捕获功能,遇上了点难题。

STM8用定时器1测量方波信号的周期。

配置捕获输入信号的上升沿。
也就是有上升沿输入时timer1计数器里的值会写入TIM1_CCR1中,并且捕获标志位CC1F会被置位。
如果开启捕获中断时则会产生捕获中断。
本来也是挺简单的事,但是测试并不顺利。
我使用单片机的时钟输出功能输出时钟作为方波来源。
测量时钟输出稳定,8M CPU时钟64分频成125K时钟。
按照正常的逻辑推测得出的周期应该是64个时钟,因为输入波形刚好是计数时钟的64分频嘛。

但是实验结果却不是理想的稳定的64。
而是大部分时间显示的是128。
也就是测量出的周期大了一倍。
我想是不是在处理中断的时候又发生了捕获,导致读取的值是两次方波周期。
查看CC1OF,果然是出现了重复捕获。

是不是64个时钟周期对于中断处理来说太短了,处理不过来??

最后加了个判断,如果出现重复捕获则周期减半,但是还是容易误动作,变成32.。。。
贴上程序
  1. /*周期测量*/
  2. #include<iostm8s105k4.h>
  3. unsigned int T,T1,T2;
  4. unsigned int result;
  5. #pragma vector=TIM1_CAPCOM_CC1IF_vector
  6. __interrupt void timer1()
  7. {
  8.   T1=T2;
  9.   T2=TIM1_CCR1H<<8;
  10.   T2|=TIM1_CCR1L;
  11.   if(T2>T1) T=T2-T1;
  12.   if(TIM1_SR2&0x02)
  13.   {
  14.     TIM1_SR2=0;
  15.     T/=2;
  16.   }
  17. }
  18. void init()
  19. {
  20.   
  21.   CLK_SWCR|=0x02;       //时钟切换
  22.   CLK_SWR=0xB4;         //外部8M晶体
  23.   CLK_CKDIVR=0x00;      //不分频
  24.   CLK_CCOR=0x15;        //Fcpu/64输出 125K
  25.   
  26.   PD_DDR_DDR0=1;        //PD0配置 时钟输出
  27.   PD_CR1_C10=1;
  28.   PD_CR2_C20=1;
  29.   
  30.   PC_DDR_DDR1=0;        //PC1配置 捕获
  31.   PC_CR1_C11=1;
  32.   PC_CR2_C21=0;
  33.   
  34.   TIM1_ARRH=0xff;       //初始化重装载寄存器
  35.   TIM1_ARRL=0xff;
  36.   TIM1_CCR1H=0;         //初始化捕获寄存器
  37.   TIM1_CCR1L=0;
  38.   TIM1_CCMR1=0x01;      //配置捕获通道
  39.   TIM1_IER=0x02;
  40.   TIM1_CR1=0x01;        //开计数器
  41.   TIM1_CCER1=0x01;      //开捕获
  42.   
  43.   
  44. }
  45. int main( void )
  46. {
  47.   init();
  48.   asm("rim");
  49.   while(1)
  50.   {
  51.    /* while(!(TIM1_SR1&0x02)); //等待捕获标志 首次捕获
  52.     
  53.       T1=TIM1_CCR1H<<8;
  54.       T1|=TIM1_CCR1L;
  55.     
  56.     while(!(TIM1_SR1&0x02)); //等待捕获标志 二次捕获
  57.     
  58.       T2=TIM1_CCR1H<<8;
  59.       T2|=TIM1_CCR1L;
  60.     
  61.       if(T2>T1) T=8000/(T2-T1); //计算频率 单位K 判断T1、T2大小,避免计数器溢出影响
  62.     */
  63.   }
  64. }


是不是输入频率较高时使用分频会好些。
使用查询方式就比较稳定,是不是进入中断比较费时间呢?

THE END!
本帖最近打赏记录:共2条打赏M币+13专家+1
jsycwnw 专家 +1 不懂单片机,也要支持 2018-06-26
jsycwnw M币 +13 不懂单片机,也要支持 2018-06-26
离线2545889167

发帖
13268
M币
20754
专家
302
粉丝
4860
只看该作者 1楼 发表于: 2018-06-25
请登录后查看
本帖最近打赏记录:共1条打赏M币+9
jsycwnw M币 +9 熱心助人 2018-06-26
离线2545889167

发帖
13268
M币
20754
专家
302
粉丝
4860
只看该作者 2楼 发表于: 2018-06-25
请登录后查看
离线zeze10000

发帖
2858
M币
8559
专家
35
粉丝
112
只看该作者 3楼 发表于: 2018-06-25
请登录后查看
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线zeze10000

发帖
2858
M币
8559
专家
35
粉丝
112
只看该作者 4楼 发表于: 2018-06-25
回 2545889167 的帖子
请登录后查看
离线2545889167

发帖
13268
M币
20754
专家
302
粉丝
4860
只看该作者 5楼 发表于: 2018-06-25
回 zeze10000 的帖子
请登录后查看
离线junyee

发帖
4100
M币
1036
专家
12
粉丝
165
只看该作者 6楼 发表于: 2018-06-26
请登录后查看
离线jsycwnw

发帖
10363
M币
29005
专家
396
粉丝
302
只看该作者 7楼 发表于: 2018-06-26
请登录后查看
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个