Arduino使用attachInterrupt()测量PWM

时间:2017-12-12 17:41:06

标签: c++ arduino

有人可以解释下面显示的这个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()正在测量信号处于高电平(脉冲宽度)的时间对吗?

然后,一旦信号的下降沿进入,attachInterrupt()中的void rising()函数将触发void falling()。此时信号处于低电平,micros()中的void falling()正在测量信号处于低电平的时间?那么采取pwm_value = micros()-prev_time是没有意义的。

只有当prev_time是低信号的测量值且micros()是信号周期的测量值时才有意义。然后pwm_value = micros()-prev_time是正确的。

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

1 个答案:

答案 0 :(得分:1)

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

pwm_value是一个误导性的名称。这只是一个与PWM本身无关的时间测量。 PWM值通常是占空比。单独接通时间并不能提供有关PWM的任何信息。您还需要关闭时间或总时间来了解占空比。

正如cleblanc在评论中提到的,在ISR中使用连续打印并不是很好。