Arduinoide的函数库中内建了两个函数来统计系统执行时间,一个是micros,一个是millis,micros会自动的统计arduino从复位开始的时间,返回值为ms单位的时间值,而millis则返回us单位的时间值,通过这个方式我们可以自制一个简单的频率计,并拥有比pulseIn函数更大的计量范围(pulseIn的脉冲必须大于2ms)。
IDE:Arduino 1.6.7
元件表:
1602液晶
Arduino UNO
I2C转8位1602液晶驱动模块
【使用频率发生器生成脉冲,GWtek示波器进行简单校准】
源代码:
#include
//利用millis函数来测量出高电平持续时间并在1602液晶上显示,i2c接线方式
const int offset = 5;//用于方式1
const int offset2 = 10;//用于方式2
LiquidCrystal_I2C lcd(0x27, 16 , 2);
int DataSave[3];//用于简单的计算平均值
int savecursor = 0 ;
int MeasureMode = 0;//(未开发)测量模式0:hz级测量,1:Mhz级测量,2:秒钟测量
//int Wide = 0;
const int AINPUT = 3;
int pulseTime;
int GetPulseWide()//求高电平时间
{
int Wide, StartTime = 0;
while (digitalRead(AINPUT) == HIGH) {};//如果目前输入的是高电平则等待
while (digitalRead(AINPUT) == LOW) {};//等待变为高电平
StartTime = micros();//记录当前系统时间
while (digitalRead(AINPUT) == HIGH) {};//等待高电平结束
Wide = micros() - StartTime +offset;//高电平的时间为当前系统时间减去开始记录的时间
return Wide / 2;
}
int GetPulseWide2()//求高电平时间V2
{
int HighVTime;
HighVTime = pulseIn(AINPUT, HIGH );
return HighVTime + offset2;
}
float countRate()
{
float hz = 1000000.0 / pulseTime;
return hz;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(AINPUT, INPUT);
lcd.init();
lcd.backlight();
}
void loop() {
// put your main code here, to runrepeatedly:
lcd.printStr("Wide:
");
//delay(500);
lcd.print(pulseTime);
Serial.println(pulseTime);
lcd.print("us");
lcd.setCursor(0, 1); //定位到第二行第二个字符为光标位置
lcd.print("Rate:
");
lcd.print(countRate() / 2);
lcd.print("HZ");
pulseTime = GetPulseWide2() ;
delay(1000);
lcd.clear();
}
转载请注明原文地址: https://ju.6miu.com/read-650.html