在中断中使用delayMicroseconds

时间:2016-01-16 18:39:32

标签: c++ arduino

我只是想知道是否有更好的方法来使用中断和延迟。 我正在使用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; } ???中的计时器

1 个答案:

答案 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()之前,您当然可以停止中断   并在之后启用它们,但这又会影响计时准确性   通过编译代码的持续时间来启用/禁用。