简易频率计数器

您可能已经在许多网站上看到了各种项目,该网站名为频率计数器,数字频率计数器等。我只是发布了另一个。显示使用AVR微控制器的定时器/计数器(ATMEGA8)在它的形式之一。该电路可用作工程课程的简单微控制器项目。频率周期性信号是每秒重复的循环次数!因此,如果我们计算在第二个中记录的周期数,它将直接读取频率。所以我们将要做的是一个频率计数器电路,也可以称为频率计。

制作这个频率计1)我们需要一个信号(必须计算其频率)2)来自Avr的Atmega8微控制器3)显示计数频率的LCD。我认为你是熟悉AVR ATMEGA8你知道如何编程它。你还需要知道 -如何将LCD与Avr接口

现在让我们进入项目的细节-简易频率计数器或其他频率计!

看一看电路图下面给出并通过在本文结束时浏览该计划的程序。

频率计数器电路

电路描述: -

所以我在这里所做的是;将计数器设置为零,等待1S,然后再次读取计数器。但是请记住,您需要在延迟循环结束后立即读取该值。这很简单。只需分配一个变量并将计数复制到该变量即可。变量的数据类型本质上是一个无符号整数。您也可以尝试浮点数据类型!但在这里你需要打字!就这些!要阅读Avr中的浮点转换,请仔细阅读本文——AVR的字符串格式

是的!更好地应用于计数频率的条件信号。即,方波或脉冲痕迹。您可以使用合适的信号调理电路比较器;施密特触发器,正弦波到方波转换器,无论是什么适合您。如果信号具有低功率,则使用调节电路。您可以在本网站上获取大量信号调理电路 - 在此处查看 -信号调节器电路

现在是我项目的技术细节。我希望你有太多问题来实现这一点。

该程序[嵌入式C,AVR Studio]:

#define f_cpu 1000000.
#包括
#define smp 1

int main(无效)
{无符号整数i;
stdout =&lcd_str;
initlcd();

_延迟时间(50);

而(1)
{tcnt1 = 0;
_延时μms(1000/SMP);
我= tcnt1;
LCDcmd(0x01);
printf(“频率:%uhz”,i * smp);
_delay_ms(500);
}
返回0;
}

标题文件的内部代码“Atmega8lcdcfg1.h”

笔记:头文件的位置为:“C:\ Program Files \ Atmel \ AVR工具\ AVR Toolchain \ AVR \ Include \ User”

#ifdef _lcd_cfg_h.
#warning“已加载的LCD配置文件。Atmega8lcdcfg.h包含跳过。”
#恩迪夫

#ifndef _lcd_cfg_h.
#定义\u LCD\u CFG\u H 1

#如果没有_
#包括
#恩迪夫

#如果没有使用延迟_
#包括
#恩迪夫

#ifndef _stdio_h_
#包括
#恩迪夫

#定义DEL1 10
#define del2 40.

#ifndef DPORT
#define dport portb.
#恩迪夫

#ifndef cport.
#定义CPORT-PORTD
#恩迪夫

#ifndef dpddr.
#定义DPDDR DDRB
#恩迪夫

#ifndef cpddr.
#define cpddr ddrd.
#恩迪夫

#ifndef Rs.
#define rs pd6.
#恩迪夫

#ifndef en
#定义EN PD7
#恩迪夫

int LCD(字符通道,文件*fp);
//函数将单个字符发送到LCD

无效LCDcmd(char-ch);
void initlcd();

静态文件lcd_str=FDEV_SETUP_流(lcd,NULL,_FDEV_SETUP_WRITE);
/*
//上面:设置流以提供格式化的输出
//使用宏FDEV_SETUP_STREAM()到LCD。溪流
//包括函数“LCD()”,该函数描述
//单个字符被发送到LCD。但该功能
//“LCD()”的原型必须符合宏的要求
//'fdev_setup_stream()''。请参阅定义的原型。这个
//原型是固定的。如果此原型不同,程序
//不会得到遵守。
//在'fdev_setup_stream(a,b,c)'的参数字段中。第一的
//字段(a)保存函数/例程的名称
//用于发送单个字符。下一个字段定义
//函数接收字符。下一个定义了
//要设置的流可用于读取字符,
//写字符或两者兼而有之。
//欲了解更多信息,请访问:
* /

void lcdcmd(char ch)
{DPORT=ch;
CPORT=(1<_delay_us(del1);
cport =(0 << en);
_延迟(DEL2);
if(ch == 0x01 || ch == 0x02)
_delay_ms(10);
}

int lcd(char ch,文件* fp)
{dport = ch;
cport =(1 << en)|(1 << RS);
_delay_us(del1);
cport =(0 << en)|(0 << RS);
_延迟(DEL2);
返回0;
}

void initlcd()
{CPDDR=(1<dpddr = 0xff;
LCDCMD(0x38);
LCDCMD(0x0F);
LCDcmd(0x01);
LCDCMD(0x02);
}

#endif/\u LCD\u CFG\u H

下载十六进制文件

频率计十六进制文件

5.评论

  1. 亚伦

    简单频率计数器的工作原理

Baidu