C 使用定时器、Simpletimer或定时器3、定时器5作为中断/更好的解决方案?

C 使用定时器、Simpletimer或定时器3、定时器5作为中断/更好的解决方案?,c,arduino,C,Arduino,我正在试着让素描运行,但还没有成功 我想每100ms设置一个高引脚,这是5个50hz交流电源的全波。当它打开时,我想启动第二个定时器,在0-100毫秒后关闭它。所以我可以用ssr捕捉1-10个半波,包括过零 用SimpleTimer试用无效 #include <SimpleTimer.h> SimpleTimer mot_on; SimpleTimer mot_off; int MOTORspeed=50; int timer_id; void setup() { Seri

我正在试着让素描运行,但还没有成功

我想每100ms设置一个高引脚,这是5个50hz交流电源的全波。当它打开时,我想启动第二个定时器,在0-100毫秒后关闭它。所以我可以用ssr捕捉1-10个半波,包括过零

用SimpleTimer试用无效

#include <SimpleTimer.h>

SimpleTimer mot_on;
SimpleTimer mot_off;
int MOTORspeed=50;
int timer_id;

void setup()
{
   Serial.begin(115200);
   pinMode(19, OUTPUT);
   mot_on.setInterval(1000, on);       // initialize timer1, and set a 100ms= 5 full waves=10% of full cycle

//   mot_off.setInterval(10, off);    // initialize timer
   timer_id=mot_off.setInterval(1000, off);
   Serial.println(timer_id);
}

void on()
{
  if (MOTORspeed>90)
  {
     mot_off.enable(0);
  }
  digitalWrite(19, HIGH);   // Fire the TRIAC
}

void off()
{
   digitalWrite(19, LOW);   // Fire the TRIAC
   mot_off.disable(0);  //
}
我试过用定时器3和定时器5。。。也不走运: SKcript不会停止计时器

#include <TimerThree.h>
#include <TimerFive.h>

int MOTORspeed=50;
int timer_id;

void setup()
{
   Serial.begin(115200);
   pinMode(19, OUTPUT);

  Timer3.attachInterrupt(on);
  Timer3.initialize(100000);

  Timer5.attachInterrupt(off);
  Timer5.initialize(10000);
}

void on()
{
  if (MOTORspeed>90)
   {Timer5.start();}//
   Serial.println("ON");
   digitalWrite(19, HIGH);   // Fire the TRIAC
}
void off()
{
   digitalWrite(19, LOW);   // Fire the TRIAC
   Serial.println("off");
   Timer5.stop();  //
}     
void loop()
{
  int off_time=MOTORspeed/100;
  Timer5.setPeriod(100*off_time);
}
#包括
#包括
int电机速度=50;
int timer_id;
无效设置()
{
序列号开始(115200);
pinMode(19,输出);
定时器3.连接中断(on);
定时器3.初始化(100000);
时间5.连接中断(关闭);
定时器5.初始化(10000);
}
在()上无效
{
如果(电机速度>90)
{Timer5.start();}//
序列号。打印号(“ON”);
digitalWrite(19,高);//触发双向可控硅
}
作废
{
digitalWrite(19,低);//触发双向可控硅
序列号。打印号(“关闭”);
Timer5.stop()//
}     
void循环()
{
int off_时间=电机速度/100;
定时器5.设置周期(100*关闭时间);
}

我们开始吧,答案!!!! 对于所有具有过零功能的SSR,可以在10步内改变速度(您可以在脚本中改变速度,使其达到100000:-)步)

使用SimpleTimer:

#include <SimpleTimer.h>

SimpleTimer mot_off;

volatile int i;               // Variable to use as a counter of dimming steps. It is volatile since it is passed between interrupts
int AC_pin = 19;                 // Output to Opto Triac

int mot_speed = 50;                  // in % Speed level (0-100)  0 = off, 100 = full speed
                                //1 Second = 1.000
int freqStep = 20;              // Means 20ms ONE FULL wave. Every 20ms we check if we should switch SSR off to get the right speed
                                //if speed is 50 (50%) we set Pin HIGH every 200ms, but after 5x calling Timer (i=50)Time = 100ms we set PIN low for next 5x calling of timer)
                                //if speed is 10 (10%) we set Pin HIGH every 200ms, but after 1x calling Timer (i=10)Time = 20ms we set PIN low for next 9x calling of timer)

void setup()
{
   Serial.begin(115200);
   pinMode(AC_pin, OUTPUT);   
   mot_off.setInterval(freqStep, off_check);
}

void off_check() {

    if(i>mot_speed) 
    {                     
      digitalWrite(AC_pin, LOW);  // turn off SSR 
//      Serial.println("OFF");
//      Serial.println(i);                 
    } 
    else 
    {
      digitalWrite(AC_pin, HIGH);
//      Serial.println("ON");
//      Serial.println(i);           
    } 
    i+=10;  
    if (i>100) {i=0;}                                 
}

void loop()
{
  mot_off.run();
}
#包括
SimpleTimer-mot_-off;
易失性int i;//用作变光步骤计数器的变量。它是不稳定的,因为它在中断之间传递
int AC_pin=19;//输出至光双向晶闸管
int mot_速度=50;//在%速度级别(0-100)中,0=关闭,100=全速
//1秒=1.000
int freqStep=20;//指20毫秒一个全波。每隔20毫秒,我们检查是否应关闭SSR以获得正确的速度
//如果速度为50(50%),我们每200ms将引脚设置为高,但在5倍调用计时器(i=50)时间=100ms后,我们将引脚设置为低,以便下一次5倍调用计时器)
//如果速度为10(10%),我们每200ms将引脚设置为高,但在1x呼叫计时器(i=10)时间=20ms后,我们将引脚设置为低,以便下一次9x呼叫计时器)
无效设置()
{
序列号开始(115200);
引脚模式(AC_引脚,输出);
mot_关闭设置间隔(频率步进、关闭检查);
}
作废支票(){
如果(i>mot_速度)
{                     
数字写入(AC_引脚,低);//关闭SSR
//序列号。打印号(“关闭”);
//序列号println(i);
} 
其他的
{
数字写入(交流引脚,高电平);
//序列号。打印号(“ON”);
//序列号println(i);
} 
i+=10;
如果(i>100){i=0;}
}
void循环()
{
不停地跑;
}
而泰美龙:

#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1

volatile int i;               // Variable to use as a counter of dimming steps. It is volatile since it is passed between interrupts
int AC_pin = 19;              // Output to Opto Triac

int mot_speed = 50;           // in % Speed level (0-100)  0 = off, 100 = full speed

                                  //1 Second = 1.000.000
int freqStep = 20000;             // Means 20ms ONE FULL wave. Every 20ms we check if we should switch SSR off to get the right speed
                                  //if speed is 50 (50%) we set Pin HIGH every 200ms, but after 5x calling Timer (i=50)Time = 100ms we set PIN low for next 5x calling of timer)
                                  //if speed is 10 (10%) we set Pin HIGH every 200ms, but after 1x calling Timer (i=10)Time = 20ms we set PIN low for next 9x calling of timer)



void setup() {  // Begin setup
  Serial.begin(115200);   
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(off_check, freqStep);      // 
  // Use the TimerOne Library to attach an interrupt
}

void off_check() {

    if(i>mot_speed) 
    {                     
      digitalWrite(AC_pin, LOW);  // turn off SSR 
//      Serial.println("OFF");
//      Serial.println(i);                 
    } 
    else 
    {
      digitalWrite(AC_pin, HIGH);
//      Serial.println("ON");
//      Serial.println(i);           
    } 
    i+=5;  
    if (i>100) {i=0;}

}

void loop() 
{  

}
#包括//可从http://www.arduino.cc/playground/Code/Timer1
易失性int i;//用作变光步骤计数器的变量。它是不稳定的,因为它在中断之间传递
int AC_pin=19;//输出至光双向晶闸管
int mot_速度=50;//在%速度级别(0-100)中,0=关闭,100=全速
//1秒=1.000.000
int freqStep=20000;//指20毫秒一个全波。每隔20毫秒,我们检查是否应关闭SSR以获得正确的速度
//如果速度为50(50%),我们每200ms将引脚设置为高,但在5倍调用计时器(i=50)时间=100ms后,我们将引脚设置为低,以便下一次5倍调用计时器)
//如果速度为10(10%),我们每200ms将引脚设置为高,但在1x呼叫计时器(i=10)时间=20ms后,我们将引脚设置为低,以便下一次9x呼叫计时器)
void setup(){//开始安装
序列号开始(115200);
pinMode(交流引脚,输出);//将双向晶闸管引脚设置为输出
Timer1.initialize(freqStep);//为我们需要的频率初始化TimerOne库
定时器1.连接中断(关闭检查,频率步进);//
//使用TimerOne库附加中断
}
作废支票(){
如果(i>mot_速度)
{                     
数字写入(AC_引脚,低);//关闭SSR
//序列号。打印号(“关闭”);
//序列号println(i);
} 
其他的
{
数字写入(交流引脚,高电平);
//序列号。打印号(“ON”);
//序列号println(i);
} 
i+=5;
如果(i>100){i=0;}
}
void循环()
{  
}
#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1

volatile int i;               // Variable to use as a counter of dimming steps. It is volatile since it is passed between interrupts
int AC_pin = 19;              // Output to Opto Triac

int mot_speed = 50;           // in % Speed level (0-100)  0 = off, 100 = full speed

                                  //1 Second = 1.000.000
int freqStep = 20000;             // Means 20ms ONE FULL wave. Every 20ms we check if we should switch SSR off to get the right speed
                                  //if speed is 50 (50%) we set Pin HIGH every 200ms, but after 5x calling Timer (i=50)Time = 100ms we set PIN low for next 5x calling of timer)
                                  //if speed is 10 (10%) we set Pin HIGH every 200ms, but after 1x calling Timer (i=10)Time = 20ms we set PIN low for next 9x calling of timer)



void setup() {  // Begin setup
  Serial.begin(115200);   
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(off_check, freqStep);      // 
  // Use the TimerOne Library to attach an interrupt
}

void off_check() {

    if(i>mot_speed) 
    {                     
      digitalWrite(AC_pin, LOW);  // turn off SSR 
//      Serial.println("OFF");
//      Serial.println(i);                 
    } 
    else 
    {
      digitalWrite(AC_pin, HIGH);
//      Serial.println("ON");
//      Serial.println(i);           
    } 
    i+=5;  
    if (i>100) {i=0;}

}

void loop() 
{  

}