首页 > 解决方案 > 如何在 Arduino 代码中进行基于时间的内部中断?

问题描述

我需要创建一个中断系统,每个时间间隔 x 更新一个 PWM 寄存器。但是查看 attachinterrupt() 函数,似乎没有基于时间的选项,而只有上升沿或下降沿检测输入。是否可以通过基于重复时间的启动来中断?

这是我的代码,我基本上需要用基于时间的中断替换 for 循环和 microdelay():

int D4 = 6;

byte arr[] = {0x06, 0x0C, 0x12, 0x18, 0x1E, 0x2A, 0x30, 0x36, 0x3C, 0x40, 0x3C, 0x36, 0x30, 0x2A, 0x1E, 0x18, 0x12, 0x0C, 0x06};

void setup() {
  CLKPR = (1<<CLKPCE)|(0<<CLKPS3)|(1<<CLKPS2)|(1<<CLKPS1)|(1<<CLKPS0);
  DDRC = (1<<DDC7)|(1<<DDC6);
  TCCR4A = (0<<COM4A1)|(1<<COM4A0)|(1<<PWM4A);
  TCCR4B = (0<<DTPS41)|(0<<DTPS40)|(0<<CS43)|(0<<CS42)|(0<<CS41)|(1<<CS40); 
  TCCR4D = (0<<WGM41)|(0<<WGM40);
  pinMode(D4, OUTPUT);
}

void loop() {
  OCR4C = 0x40;
 for (int i = 0; i <= sizeof(arr) ; i++ ){

  OCR4A= arr[i];
  delayMicroseconds(100);
 }
}

标签: arduinoide

解决方案


我猜您已经使用 Atmel 控制器很长时间了,并且对 Arduino 很陌生。

使用此处描述的计时器库。 https://playground.arduino.cc/Code/Timer1

或者您可以使用 micros 实现一种状态空间类型的程序。例子

long nextUpdateTime=micros();
loop(){
    if(nextUpdateTime<micros())
        return;
    nextUpdateTime=micros()+100; //Change 100 to what ever delay you want.
    // Write your required code here. This code will be called every 100 (Or whatever you set) us.
}

再说一次,您可以只使用analogWrite 函数来生成您要生成的任何pwm。我不确定您要做什么,但我相信了解该功能会有所帮助。这是链接 https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/

我希望这有帮助。祝你有美好的一天。


推荐阅读