有人可以解释下面显示的这个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
是正确的。
根据我的解释,请向我解释我没有得到什么。
答案 0 :(得分:1)
此代码将等待上升沿。一旦信号变高,它将把当前时间存储在prev_time
并开始等待信号降低。一旦检测到下降沿,它将打印prev_time
与当前时间之间的差值,这是您的接通时间(以微秒为单位)。
pwm_value
是一个误导性的名称。这只是一个与PWM本身无关的时间测量。 PWM值通常是占空比。单独接通时间并不能提供有关PWM的任何信息。您还需要关闭时间或总时间来了解占空比。
正如cleblanc在评论中提到的,在ISR中使用连续打印并不是很好。