我只是想知道是否有更好的方法来使用中断和延迟。 我正在使用5个中断,我不确定,如果我应该采取另一种方式来等待" 10us后用于固定Pin 我需要的功能是对50Hz交流电源进行双翘电压以改变电机的速度。所以每一半都是10ms长,所以现在我想改变设置PIN高速的速度100us x调光系数*
txt
第一个答案是添加一个计时器:
void ISR_0() //Interrupt D2
{PULSEcounter[0]++;}
void ISR_1() //Interrupt D3
{PULSEcounter[1]++;}
void ISR_2() //Interrupt D21
{PULSEcounter[2]++;}
void ISR_3() //Interrupt D20
{PULSEcounter[3]++;}
void ISR_4() //Interrupt D19
{// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle)
// 10ms=10000us
// (10000us - 10us) / 100 = 100 (Approx)
int dimtime = (100*dimming); // For 50Hz =>100 when 0-100
delayMicroseconds(dimtime); // Wait till firing the TRIAC
digitalWrite(AC_LOAD, HIGH); // Fire the TRIAC
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(AC_LOAD, LOW); // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC}
void ISR_5() //Interrupt D18
{PULSEcounter[5]++;}
像这样?
或void ISR_4() //Interrupt D19
{// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle)
// 10ms=10000us
// (10000us - 10us) / 100 = 100 (Approx)
int dimtime = (10000-100*dimming); // For 50Hz =>100 when 0-100
if (micros() > dimtime) // Wait till firing the TRIAC
digitalWrite(AC_LOAD, HIGH); // Fire the TRIAC
if (micros() > dimtime+10) // triac On propogation delay
digitalWrite(AC_LOAD, LOW); // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC}
dimtime = 0;
}
???中的计时器
答案 0 :(得分:2)
在中断服务程序中,永远不会延迟。
通常,中断需要尽可能快地处理,以允许其他中断触发。
要在10μs后更换引脚,您可以启动定时器。
有可能在中断服务程序中使用延迟功能甚至不起作用,因为该功能也可能使用(定时器)中断。
<强>更新强>:
我需要的功能是对50Hz交流电源进行变换 电机的速度。所以每一半都是10ms长,所以现在我想要 更改设置PIN高速100us调光的速度 因子
你可能需要Pulse-width modulation (PWM)。
在Arduino上,可以使用analogWrite()
完成此操作。请参阅PWM on Arduino。
analogWrite()
负责输出波形,因此您需要做的就是调用analogWrite()
一次。
更新(@ PeterM的评论):
在这种情况下,我认为最好启动计时器(并最终修改/更新具有延迟时间的volatile变量)。同时,可以触发和处理所有其他中断。在定时器中断时,可以设置/复位引脚。
还要记住,Arduino digitalWrite
函数是rather slow(它必须将Arduino引脚号映射到PORT /引脚),所以在你的情况下写入PORT会更好/ pin直接。根据时钟速度,使用digitalWrite
可能会占用10μs的大部分时间。
一些interesting info about delayMicroseconds()
combined with interrupts:
在Arduino上配置了定时中断,大多数都没有意识到 的。在执行期间收到中断时 delayMicroseconds(),
delayMicroseconds()
的时间将是错误的。 在调用delayMicroseconds()
之前,您当然可以停止中断 并在之后启用它们,但这又会影响计时准确性 通过编译代码的持续时间来启用/禁用。