有人能解释一下下面这个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是正确的。
根据我的解释,请向我解释我没有得到什么。
发布于 2017-12-12 22:25:29
此代码将等待上升的边缘。一旦信号变高,它就会将当前的时间存储在prev_time中,并开始等待信号下降。一旦检测到下降的边缘,它将打印prev_time和当前时间之间的差异,即您的准时时间(以微秒为单位)。
pwm_value是一个误导的名字。这只是一个与PWM本身无关的时间测量。PWM值通常是占空比。时间本身并不能给你任何PWM方面的信息.您还需要关闭时间或总时间才能知道任务周期。
正如他在评论中提到的那样,在ISR中使用串行打印并不是很好。
https://stackoverflow.com/questions/47778500
复制相似问题