/*-------结合他人代码改写------*/
#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
volatile unsigned long raiseTime = 0; //前一次上升沿时间
volatile unsigned long fallTime = 0; //前一次下降沿时间
//volatile double duty = 0; //占空比
volatile double fre = 0; //频率
int pwmPin = 27; //信号输入管脚为27
LiquidCrystal_I2C lcd(0x27, 16, 2);
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; //自旋锁
void changeISR()
{
auto now = micros();//(以微秒为单位记录当前时间)
if(digitalRead(pwmPin)) //现在是高电平
{
portENTER_CRITICAL_ISR(&mux); //进入临界区域
auto total = now - raiseTime;
fre = 1e6/(double)total;
//auto h = fallTime - raiseTime;
//duty = h/(double)total;
portEXIT_CRITICAL_ISR(&mux); //离开临界区域
raiseTime = now;
}
else
{
fallTime = now;
}
}
void setup() {
// lcd.init();
// lcd.backlight();
// lcd.setCursor(0,0);
// lcd.print("fre: ");
// lcd.setCursor(0,1);
// lcd.print("duty: ");
Serial.begin(115200);
pinMode(pwmPin, INPUT);
attachInterrupt(digitalPinToInterrupt(pwmPin), changeISR, CHANGE);
}
void loop() {
delay(1000);
portENTER_CRITICAL(&mux);
double f = fre;
//double d = duty;
portEXIT_CRITICAL(&mux);
Serial.print("信号频率为:");
Serial.print(f);
Serial.println("hz");
// lcd.setCursor(5,0);
// lcd.print(f);
// lcd.setCursor(6,1);
// lcd.print(d);
}