Как мне прочитать состояние 3 выходных контактов на Arduino UNO, а затем соединить их вместе?

#arduino #arduino-c

#arduino #arduino-c

Вопрос:

Итак, я работаю над программным обеспечением для управления инвертором H8. Я получил код, который выполняет SPWM для 3-фазного инвертора онлайн. Затем я применил программный вентиль NAND к 3 выходам Arduino UNO, и вот результат, который я получил: Результат применения программного элемента NAND на 3 выходах Arduino UNO

и это: Результат применения программного элемента NAND на 3 выходах Arduino UNO

Я использовал аппаратный вентиль NAND, и я получил это: Результат применения аппаратного элемента NAND на 3 выходах 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)amp;amp;digitalRead(Output2)amp;amp;digitalRead(Output3)));

   /*g1 = (PORTD amp; B00100000) >> 5;
    g3 = (PORTB amp; B00000100) >> 2;
    g5 = (PORTD amp; B00001000) >> 3;
    g7 = ~((g1amp;g3)amp;g5);
    digitalWrite(G7,g7);*/
    /*
    g4 = (PORTD amp; B01000000) >> 6;
    g6 = (PORTB amp; B00000010) >> 1;
    g2 = (PORTB amp; B00001000) >> 3;
    g8 = !((g4amp;amp;g6)amp;amp;g2);
    digitalWrite(G7,g8);*/
  a = PORTB amp; 0b00001111;
  w = (a amp; 0b00001000) >> PORTB3;
  x = (a amp; 0b00000100) >> PORTB2;
  y = (a amp; 0b00000010) >> PORTB1;
  z = ~(wamp;xamp;yamp;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 менялся, и это результат, который я пытаюсь получить.

Комментарии:

1. Входы для вашего аппаратного NAND и вашего программного NAND совершенно разные. Конечно, у вас не будет таких же результатов. Ваши программные входы NAND никогда не бывают одновременно высокими.

2. Я беспокоюсь, когда вижу amp;amp; , что применяется к битам. Кроме того, эти медленные и раздутые DigitalRead() вызовы НЕ выполняются одновременно. Вы знаете это, верно? И использование AnalogWrite контактов on, которые вы будете использовать DigitalRead , — действительно плохая идея. Это очень, очень плохой дизайн.

3. @TomServo итак, что мне делать?

Ответ №1:

Согласно https://en.wikipedia.org/wiki/NAND_logic , ваш код должен быть хорошим:

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

Или

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

Возможно, проблема связана с тем, что вы используете analogWrite функцию и digitalRead на одном и том же выводе. Или инструменты моделирования не работают должным образом (я не знаю).

Ответ №2:

Создайте еще один вывод для чтения (NAND) всех вместе

Ответ №3:

Еще один вопрос: вы хотите объединить все сигналы, подобные помехам, я не думаю, что использование NAND сделало бы это возможным, возможно, вам следует попробовать использовать другую функцию