[AVR单片机]

对外部脉冲信号计数

[复制链接]
1519|13
手机看帖
扫描二维码
随时随地手机跟帖
yzai|  楼主 | 2016-1-13 17:53 | 显示全部楼层 |阅读模式
JY-DX-JY| | 2016-1-14 13:19 | 显示全部楼层
可以接到外部中断腿上,脉冲计数,再加上定时器定时,就可以算出转速了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
yzai + 2 赞一个!
yzai|  楼主 | 2016-1-15 16:26 | 显示全部楼层
JY-DX-JY 发表于 2016-1-14 13:19
可以接到外部中断腿上,脉冲计数,再加上定时器定时,就可以算出转速了。 ...

外部中断已经占用了,我想用单片机的内部计数器对外部脉冲计数,能不能完成?

使用特权

评论回复
JY-DX-JY| | 2016-1-15 16:32 | 显示全部楼层
可以,不过可能比较费劲。如果是外部中断,有跳变沿进中断,两个上升沿或者下降沿就是一个周期。
不过是普通IO口,就得查询了。如果频率比较快,有可能有的脉冲检测不到,速度就会算不准。

使用特权

评论回复
yzai|  楼主 | 2016-1-15 16:51 | 显示全部楼层
JY-DX-JY 发表于 2016-1-15 16:32
可以,不过可能比较费劲。如果是外部中断,有跳变沿进中断,两个上升沿或者下降沿就是一个周期。
不过是普 ...

有mega16的脉冲计数程序吗

使用特权

评论回复
JY-DX-JY| | 2016-1-15 16:55 | 显示全部楼层
没有

使用特权

评论回复
mgarm| | 2016-1-18 16:07 | 显示全部楼层
应该可以啊,计数器本来就是用来计数的,就计数外部输入就可以了;

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
yzai + 2 赞一个!
SD10A| | 2016-1-21 19:18 | 显示全部楼层
用 TC1 的输入捕获功能

使用特权

评论回复
SD10A| | 2016-1-21 21:53 | 显示全部楼层
#include <iom16v.h>
#include <macros.h>
#include <STDIO.h>
//时钟4MHZ
//t/c1 8分频
//
volatile char cap_flag=0;//为0是时刻1 为1是时刻2
volatile unsigned int ov_countr=0;
volatile unsigned int cesu_time1,cesu_time2;
//输入捕获初始化
void capture_init(void)
{
   TCCR1B=BIT(ICES1)|BIT(CS11);//上升沿触发,8分频 0X42
   TIMSK=0X24;//输入捕获中断,溢出中断
   SEI();//全局中断使能
}
//计数器1溢出中断
#pragma interrupt_handler ov_timer1:9
void ov_timer1()
  {
  ov_countr++;
  }

////输入捕获中断
#pragma interrupt_handler capture_timer1:6
void capture_timer1()
   {
   if(cap_flag==1)//时刻2
      {cap_flag=0;//
          cesu_time2=ICR1;
          }
   else//时刻1
      {
           ov_countr=0;//时刻1  清空溢出计数器
           cesu_time1=ICR1;
           cap_flag=1;  
          }
   }
   
   
//分析程序
//自己需要的其他程序都可以写在这里
void cesu_fenxi(void)
  {unsigned long int pulse_clocks;
  
   pulse_clocks = (unsigned long)cesu_time2 - (unsigned long)cesu_time1

+ (unsigned long)ov_countr * 0x10000 / 500;        //计算脉冲宽度
  }


///主要程序
void main()
{
capture_init();//
while(1)
    {
        cesu_fenxi();
        }
}

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
yzai + 2 赞一个!
SD10A| | 2016-1-21 22:09 | 显示全部楼层
本帖最后由 SD10A 于 2016-1-21 22:10 编辑

我自己参MACHAO老师的程序写了一下,编译通过,  能测周期小于131MS的脉冲,我没做试验,你自己试验下。有问题大家都来帮忙,要时间再长 你可以用更大的分频。


使用特权

评论回复
yzai|  楼主 | 2016-1-25 11:27 | 显示全部楼层
SD10A 发表于 2016-1-21 22:09
我自己参MACHAO老师的程序写了一下,编译通过,  能测周期小于131MS的脉冲,我没做试验,你自己试验下。有 ...

我已经解决了!谢谢!

使用特权

评论回复
评论
SD10A 2016-1-25 18:16 回复TA
说说你的解决方法吧 
yzai|  楼主 | 2016-1-25 11:29 | 显示全部楼层
SD10A 发表于 2016-1-21 21:53
#include
#include
#include

我用的是计数器,资源限制只能用计数器!谢了!

使用特权

评论回复
yzai|  楼主 | 2016-1-26 11:53 | 显示全部楼层
yzai 发表于 2016-1-25 11:27
我已经解决了!谢谢!

一个定时器,一个计数器,在定时器的逸出中断中读取计数器的值就行了

使用特权

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

本版积分规则

7

主题

128

帖子

2

粉丝