[AVR单片机] 对外部脉冲信号计数

[复制链接]
 楼主| yzai 发表于 2016-1-13 17:53 | 显示全部楼层 |阅读模式
atmega16单片机怎么使用定时/计数器1对外部脉冲信号进行计?    我将外部脉冲信号连接到T1引脚上,想通过T1对脉冲计数,实际就是测速  怎么实现?着急中。。。
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的脉冲,我没做试验,你自己试验下。有 ...

我已经解决了!谢谢!

评论

说说你的解决方法吧  发表于 2016-1-25 18:16
 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部

7

主题

128

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部