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