【问题标题】:Arduino Measuring PWM with attachInterrupt()Arduino 使用 attachInterrupt() 测量 PWM
【发布时间】:2017-12-12 17:41:06
【问题描述】:

有人能解释下这个 Arduino 程序的流程吗?

volatile int pwm_value = 0;
volatile int prev_time = 0;

void setup() {
  Serial.begin(115200);
  // when pin D2 goes high, call the rising function
  attachInterrupt(0, rising, RISING);
}

void loop() { }

void rising() {
  attachInterrupt(0, falling, FALLING);
  prev_time = micros();
}

void falling() {
  attachInterrupt(0, rising, RISING);
  pwm_value = micros()-prev_time;
  Serial.println(pwm_value);

我了解 PWM 意味着寻找信号在每个周期内保持高电平的时间长度。

void setup() 中,信号的第一个上升沿将触发void rising()。所以在void rising() 期间,信号处于高电平,prev_time = micros() 正在测量信号处于高电平(脉冲宽度)的时间,对吗?

那么一旦信号的下降沿进来,void rising()中的attachInterrupt()函数就会触发void falling()。此时信号处于低电平,所以void falling() 中的micros() 正在测量信号处于低电平的时间?那么采取pwm_value = micros()-prev_time 将毫无意义。

这只有在prev_time 是低电平信号的测量值并且micros() 是信号周期的测量值时才有意义。那么pwm_value = micros()-prev_time 是正确的。

根据我的解释,请向我解释我没有得到什么。

【问题讨论】:

  • Serial.println(...) 在 ISR 中不是好的做法。
  • 这个调用将测量脉冲的大小,这正是信号开始变高到信号开始变低所用的时间。不知道你对什么感到困惑。

标签: c++ arduino


【解决方案1】:

此代码将等待上升沿。一旦信号变高,它会将当前时间存储在prev_time 中并开始等待信号变低。一旦检测到下降沿,它将打印prev_time 与当前时间之间的差异,即您的开启时间(以微秒为单位)。

pwm_value 是一个误导性名称。这只是一个时间测量,与 PWM 本身无关。 PWM 值通常是占空比。仅导通时间不会为您提供任何有关 PWM 的信息。您还需要关闭时间或总时间才能知道占空比。

正如 cleblanc 在他的评论中提到的那样,在 ISR 中使用串行打印并不是很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多