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

本文介绍如何使用Arduino UNO和1602液晶显示器制作一个简易频率计。通过编写特定的程序,利用micros()函数来测量输入信号的脉冲宽度,并在液晶屏上实时显示脉冲宽度及对应的频率。
Arduinoide的函数库中内建了两个函数来统计系统执行时间,一个是micros,一个是millis,micros会自动的统计arduino从复位开始的时间,返回值为ms单位的时间值,而millis则返回us单位的时间值,通过这个方式我们可以自制一个简单的频率计,并拥有比pulseIn函数更大的计量范围(pulseIn的脉冲必须大于2ms)。

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



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();

}



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


<think>好的,我现在需要帮助用户了解在Processing中如何使用millis函数。首先,我得回顾一下自己对millis的理解。millis函数返回程序开始运行以来的毫秒数,通常用于计时和动画控制,而不依赖于frameRate。用户可能希望知道基本用法、示例以及常见应用场景。 接下来,我应该检查用户提供的引用内容,看看是否有相关的信息。引用[3]和[4]提到了Processing的代码示例和arc函数的用法,但并没有直接涉及millis。不过,引用[4]中关于arc的参数和角度表示可能对示例有帮助,比如用millis来控制动画的角度变化。 用户要求示例教程,所以我需要构建一个简单的例子,展示如何使用millis来实现定时任务或动画。比如,让一个图形每隔一段时间改变颜色或位置。考虑到用户可能对时间差计算不太熟悉,我需要详细说明如何用millis记录开始时间,并比较当前时间与开始时间的差值。 另外,用户的问题结构需要符合系统级指令,包括行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中可能用不上数学公式,除非涉及时间计算,比如时间间隔可以用$Δt$表示。不过根据示例,可能不需要数学公式,所以可能可以忽略这部分,但需要确保其他格式正确。 还需要生成相关问题,考虑用户可能感兴趣的扩展内容,比如millis与frameCount的区别,如何避免millis溢出,或者更复杂的定时任务管理。这些问题应该自然相关,帮助用户深入理解。 最后,引用部分需要正确标注。用户提供的引用[1]、[2]似乎与Processing无关,但引用[3]和[4]是Processing代码和函数说明,可能在回答中可以引用,比如在解释arc函数时提到引用[4]。不过用户的问题是关于millis,所以可能引用部分用不上,但需要检查是否有必要。 总结步骤:解释millis的作用,给出基本用法,示例代码,说明代码,常见应用,相关问题。确保代码正确,符合Processing语法,并注释解释关键部分。同时,生成相关问题,如millis的应用场景、与delay的区别、处理长时间运行等。</think>### 在 Processing 中使用 `millis` 函数的教程 `millis()` 是 Processing 中用于获取程序运行时间(以毫秒为单位)的核心函数,常用于实现非阻塞计时和动画控制[^4]。以下是具体用法和示例: --- #### 1. **基本功能** - `millis()` 返回从程序启动到当前时刻的毫秒数,例如 $t = 5000$ 表示已运行 5 秒。 - 与 `frameRate` 不同,`millis` 的时间计算独立于帧率,适合精确计时。 --- #### 2. **示例:间隔触发事件** 以下代码实现每 2 秒切换一次圆形的颜色: ```processing int lastTime = 0; boolean fillCircle = false; void setup() { size(400, 400); } void draw() { background(255); // 计算当前时间与上次触发时间的差值 int currentTime = millis(); if (currentTime - lastTime >= 2000) { // 2000ms = 2秒 fillCircle = !fillCircle; // 切换状态 lastTime = currentTime; // 重置计时 } // 根据状态填充颜色 if (fillCircle) { fill(#FF0000); } else { noFill(); } ellipse(width/2, height/2, 100, 100); } ``` - **关键逻辑**:通过 `currentTime - lastTime` 计算时间间隔,实现周期性操作。 --- #### 3. **示例:平滑动画控制** 用 `millis` 控制圆弧旋转速度,避免帧率波动影响动画: ```processing float angle = 0; void setup() { size(400, 400); } void draw() { background(20); // 根据时间计算旋转角度(0.001 弧度/毫秒) angle = millis() * 0.001; // 绘制动态圆弧(引用[4]中 arc 的用法) noFill(); stroke(#8BF57C); arc(width/2, height/2, 100, 100, angle, angle + PI/2); } ``` - **效果**:圆弧以恒定速度旋转,角度计算公式为 $\theta = t \cdot 0.001$,其中 $t$ 是 `millis()` 的值。 --- #### 4. **常见应用场景** - **游戏计时器**:记录玩家完成关卡的时间。 - **动画同步**:多个独立动画的时间轴控制。 - **传感器数据处理**:按固定间隔读取传感器输入。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值