arduino - 如何在 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);
}
}
解决方案
我猜您已经使用 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/
我希望这有帮助。祝你有美好的一天。
推荐阅读
- .net-core - 在 .net 核心应用程序中同时使用 SQS 消息
- spring-boot - 基于 SSL 的 RestTemplate
- assembly - mov dword ptr [eax], 5 和 mov dword [eax], 5 有什么区别?
- c# - 具有 Graph API 分页调用的持久函数?
- python - 如何从输入框中获取自定义输入以形成特定的超链接?
- python - 我正在尝试使用 Django_tables2 将应用程序部署到 Heroku 并收到“ImportError: cannot import name 'FieldDoesNotExist'”
- python - 在 Python 中将人类可读时间转换为纪元时间戳
- ruby-on-rails - 未知验证器:Ruby on Rails 上的“InValidator”
- firebase - 删除按钮颤动 Firestore
- angular - 为什么我的 Mongoose 控制器没有被调用?