首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用attachInterrupt()测量脉宽调制技术

用attachInterrupt()测量脉宽调制技术
EN

Stack Overflow用户
提问于 2017-12-12 17:41:06
回答 1查看 1.4K关注 0票数 0

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

代码语言:javascript
复制
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是正确的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-12 22:25:29

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

pwm_value是一个误导的名字。这只是一个与PWM本身无关的时间测量。PWM值通常是占空比。时间本身并不能给你任何PWM方面的信息.您还需要关闭时间或总时间才能知道任务周期。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47778500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档