首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用协议线程通过Arduino控制电机继电器

使用协议线程通过Arduino控制电机继电器
EN

Stack Overflow用户
提问于 2015-07-03 18:47:48
回答 1查看 420关注 0票数 1

我正在通过arduino控制两个马达继电器。设置如下:

每个继电器由一个简单的开关设置控制。当开关闭合时,继电器处于激活状态。当开关打开时,继电器处于非激活状态。

我决定给协议线程一个go,因为我想要两个开关来控制电机并行。为此,我编写了以下代码:

代码语言:javascript
复制
 #include <pt.h>

#define yMaxLimitLeft 8 //these are the limit switches that control the relays
#define yMaxLimitRight 9 //these are the limit switches that control the relays
#define leftRelay 4
#define rightRelay 5

static struct pt pt1, pt2; // each protothread needs one of these



void setup() {
  Serial.begin(9600);
  PT_INIT(&pt1);  // initialise the two
  PT_INIT(&pt2);  // protothread variables
  pinMode(leftRelay, OUTPUT);  //set pins     
  pinMode(rightRelay, OUTPUT);
  pinMode(yMaxLimitLeft,INPUT);
  pinMode(yMaxLimitRight,INPUT);

}

void loop() {

   digitalWrite(leftRelay, HIGH);//enable relays
  digitalWrite(rightRelay, HIGH);//enable relays
   runLeft(&pt1); //protothreads that controls relay number 1
  runRight(&pt2); //protothreads that controls relay number 2

}

/////////////////////////////////////////////////////////////////////////////
// This function controls the left relay
static int runLeft(struct pt *pt) {

  PT_BEGIN(pt);

  while(1){

    PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitLeft)==HIGH); //wait until the switch is closed
     Serial.println("left off"); 
      digitalWrite(leftRelay, LOW);//disable relay

      }   

    PT_END(pt);
}


//this function controls the right relay
static int runRight(struct pt *pt) {
  PT_BEGIN(pt);

   while(1){


    PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitRight)==HIGH); //wait until the switch is closed
     Serial.println("Right off");   
     digitalWrite(rightRelay, LOW);//disable relay

    }


  PT_END(pt);
}

问题如下。只要我只按下一个开关,相应的继电器就会响应。然而,当我按下两个开关时,只有一个继电器响应(可能是最早触发的那个)。

我如何修复代码,以便当两个开关都按下时,两个继电器同时响应?

非常感谢您提前抽出时间帮助我们。

EN

回答 1

Stack Overflow用户

发布于 2015-07-03 19:43:11

只要PT_WAIT_UNTIL (即digitalRead(yMaxLimitLeft)==HIGH)中的谓词为true,执行就会停滞在while循环中。

如果loop()只负责保持协议线程运行,那么代码可能会变得更容易推理。如果我们将继电器的初始启用移到setup()中,则可以重写runLeft/Right以包含与特定switch+relay相关的所有逻辑。在这种情况下,可以使用第二条PT_WAIT_UNTIL语句等待交换机再次打开。

代码语言:javascript
复制
#include <pt.h>

#define yMaxLimitLeft 8 //these are the limit switches that control the relays
#define yMaxLimitRight 9 //these are the limit switches that control the relays
#define leftRelay 4
#define rightRelay 5

static struct pt pt1, pt2; // each protothread needs one of these



void setup() {
  Serial.begin(9600);
  PT_INIT(&pt1);  // initialise the two
  PT_INIT(&pt2);  // protothread variables
  pinMode(leftRelay, OUTPUT);  //set pins     
  pinMode(rightRelay, OUTPUT);
  pinMode(yMaxLimitLeft,INPUT);
  pinMode(yMaxLimitRight,INPUT);    

  digitalWrite(leftRelay, HIGH);//enable relays
  digitalWrite(rightRelay, HIGH);//enable relays

}

void loop() {

  runLeft(&pt1); //protothreads that controls relay number 1
  runRight(&pt2); //protothreads that controls relay number 2

}

/////////////////////////////////////////////////////////////////////////////
// This function controls the left relay
static int runLeft(struct pt *pt) {

  PT_BEGIN(pt);

  while(1) {

    PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitLeft)==HIGH); //wait until the switch is closed
    Serial.println("left off"); 
    digitalWrite(leftRelay, LOW);//disable relay

    PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitLeft)==LOW); //wait until the switch opens again
    digitalWrite(leftRelay, HIGH);//enable relay

  }   

  PT_END(pt);
}


//this function controls the right relay
static int runRight(struct pt *pt) {
  PT_BEGIN(pt);

    while(1){

      PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitRight)==HIGH); //wait until the switch is closed
      Serial.println("Right off");   
      digitalWrite(rightRelay, LOW);//disable relay

      PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitRight)==LOW); //wait until the switch opens again
      digitalWrite(rightRelay, HIGH);//enable relay
    }


  PT_END(pt);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31204950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档