如何读取Arduino UNO上3个输出引脚的状态,然后将它们一起与非?

问题描述

所以我正在研究控制H8逆变器的软件。我获得了在线为三相逆变器执行SPWM的代码。然后,我在Arduino UNO的3个输出上应用了软件NAND门,这是我得到的结果:

Result of applying a software NAND gate on 3 outputs from the Arduino UNO

和:

Result of applying a software NAND gate on 3 outputs from the Arduino UNO

我使用了一个硬件“与非”门,我得到了:

Result of applying a hardware NAND gate on 3 outputs from the Arduino UNO

//-------www<electronics-project-hub>com--------//
#include <math.h>
int Output1 = 11;
int Output2 = 10;
int Output3 = 9;

int Output4 = 8;

uint8_t a = 0;
uint8_t w = 0;  //PB3
uint8_t x = 0;   //PB2
uint8_t y = 0;  //PB1
uint8_t z = 0;  //PB0

int potVal = 0;
float A = 0;
float B = 0.104;
int Freq_IN = A0;
int var1 = 0;
int var2 = 0;
int var3 = 0;
int var4 = 0;
int var5 = 0;
int var6 = 0;
float Phase1 = 2 * PI / 3;
float Phase2 = 4 * PI / 3;
float Phase3 = 2 * PI;
boolean toggle = true; // true = Enabling Serial Plotter Output
void setup()
{
  Serial.begin(9600);
  pinMode(Output1,OUTPUT);
  pinMode(Output2,OUTPUT);
  pinMode(Output3,OUTPUT);
  pinMode(Freq_IN,INPUT);
}
void loop()
{
  A += B;
  analogWrite(Output1,var1);
  analogWrite(Output2,var2);
  analogWrite(Output3,var3);

  //digitalWrite(Output4,! 
(digitalRead(Output1)&&digitalRead(Output2)&&digitalRead(Output3)));

   /*g1 = (PORTD & B00100000) >> 5;
    g3 = (PORTB & B00000100) >> 2;
    g5 = (PORTD & B00001000) >> 3;
    g7 = ~((g1&g3)&g5);
    digitalWrite(G7,g7);*/
    /*
    g4 = (PORTD & B01000000) >> 6;
    g6 = (PORTB & B00000010) >> 1;
    g2 = (PORTB & B00001000) >> 3;
    g8 = !((g4&&g6)&&g2);
    digitalWrite(G7,g8);*/
  a = PORTB & 0b00001111;
  w = (a & 0b00001000) >> PORTB3;
  x = (a & 0b00000100) >> PORTB2;
  y = (a & 0b00000010) >> PORTB1;
  z = ~(w&x&y&z);
  PORTB = PORTB | z;
  if (toggle == true)
  {
    Serial.print(var1);
    Serial.print(" ");
    Serial.print(var2);
    Serial.print(" ");
    Serial.println(var3);
  }
  var4 = 126 * sin(A + Phase1);
  var1 = var4 + 128;
  var5 = 126 * sin(A + Phase2);
  var2 = var5 + 128;
  var6 = 126 * sin(A + Phase3);
  var3 = var6 + 128;
  if (A >= 2 * PI)
  {
    A = 0;
  }
  potVal = analogRead(Freq_IN);
  delay(potVal);
}
//-------www<electronics-project-hub>com--------//

我想指出,软件NAND输出始终保持打开状态。硬件NAND输出变化很大,这就是我想要得到的结果。

解决方法

根据https://en.wikipedia.org/wiki/NAND_logic,您的代码应该不错:

digitalWrite(Output4,!(digitalRead(Output1) && digitalRead(Output2) && digitalRead(Output3)));

digitalWrite(Output4,(!digitalRead(Output1) || !digitalRead(Output2) || !digitalRead(Output3)));

问题可能出在您在同一引脚上使用analogWrite函数和digitalRead的事实。还是仿真工具不能正常工作(我不知道)。

,

创建另一个引脚以一起读取(NAND)

,

这里的另一个问题是,您是否要合并所有信号,例如干扰,我认为使用NAND不会使这种可能性成为可能,也许您应该尝试使用其他功能