segunda-feira, 21 de agosto de 2023

Código Arduino Para Motores Trifásicos

- Este programa gera uma sequência que pode ser usada para alimentar as 3 fases de um motor trifásico a partir de uma fonte de corrente contínua.

- Implementa os seguintes controles: 

. liga e desliga a marcha;

. sentido de funcionamento;

. frequência; e

. potência (largura de pulso).


const int dirPin = 3;       // Pino de entrada para controlar a direção
const int controlPin = 2;   // Pino para controlar o estado 000
const int outputPins[] = {5, 6, 9}; // Pinos de saída para a sequência desejada
int currentState = 0;
int currentDirection = 1;   // 1 para contar para cima, -1 para contar para baixo

void setup() {
  pinMode(dirPin, INPUT);
  pinMode(controlPin, INPUT);
 
  for (int i = 0; i < 3; i++) {
    pinMode(outputPins[i], OUTPUT);
  }
}

void loop() {
  int controlState = digitalRead(controlPin);
  int direction = digitalRead(dirPin);
 
  int sequence[] = {5, 4, 6, 2, 3, 1}; // Sequência de estados: 101, 100, 110, 010, 011, 001

  if (controlState == LOW) {
    sequence[0] = 0;
    digitalWrite(outputPins[0], LOW);
    digitalWrite(outputPins[1], LOW);
    digitalWrite(outputPins[2], LOW);
    while (digitalRead(controlPin) == LOW) {
      // Aguarda o pino de controle ficar alto para continuar
    }
  }

  if (direction == HIGH) {
    currentDirection = 1;
  } else {
    currentDirection = -1;
  }

  int frequency = map(analogRead(A0), 0, 1023, 0, 300); // Mapeia a leitura analógica para a faixa de frequência
 
  int pulseWidth = map(analogRead(A1), 0, 1023, 0, 255); // Mapeia a leitura analógica para a faixa de largura de pulsos
 
  int delayTime = 1000 / frequency; // Calcula o tempo de atraso com base na frequência
 
  currentState = (currentState + currentDirection + 6) % 6; // Calcula o próximo estado
 
  int currentOutput = sequence[currentState];
 
  digitalWrite(outputPins[0], bitRead(currentOutput, 2));
  digitalWrite(outputPins[1], bitRead(currentOutput, 1));
  digitalWrite(outputPins[2], bitRead(currentOutput, 0));
 
  delayMicroseconds(pulseWidth); // Mantém o pulso ativo de acordo com a largura de pulsos
 
  digitalWrite(outputPins[0], LOW);
  digitalWrite(outputPins[1], LOW);
  digitalWrite(outputPins[2], LOW);
 
  delay(delayTime); // Atraso entre os estados
}
 

Nenhum comentário:

Postar um comentário