使用millis函数制作大范围的方波脉冲计数器

    xiaoxiao2021-03-25  223

    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

    最新回复(0)