【发布时间】: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 中不是好的做法。 -
这个调用将测量脉冲的大小,这正是信号开始变高到信号开始变低所用的时间。不知道你对什么感到困惑。