Bom dia galera, estou com uma situação que é a seguinte: preciso integrar dois arduinos pra execução de um sistema de tempo real, já estou com a parte de aquisição de dados e processamento dos dados prontos, só preciso pegar duas variáveis e jogar do arduino 1 para o arduino 2 e fazer o arduino 2 executar um pwm com as variáveis que estará recebendo.

       Isso é um problema que o arduino acaba ficando em conflito na execução de um PWM com frequência variável caso o processador esteja processando alguma interrupção que é o caso do processamento para leitura de rotação do motor. 

 

       Vou postar o código abaixo pra ver se alguém consegui me dar uma força com isso.

        Preciso jogar as variáveis ti e tioff no arduino 2 e fazer com que ele execute o seguinte código:

 

  digitalWrite(injetor, HIGH);
  delayMicroseconds(ti);
  digitalWrite (injetor, LOW);
  delayMicroseconds(tioff); 

                

#include <TimerOne.h> // Incluir biblioteca TimerOne
#include <LiquidCrystal.h>

LiquidCrystal lcd(13,12,11,10,9,8);

int injetor = 6;
int borboleta = A0;
int janela = 0;
float Borboleta;
int tps; //Variavel para receber a variação da posição da borboleta
float ti = 0 ;
float tioff = 0 ;
float Pulso = 0; // Variavel para contagem de pulsos
float RPM = 0; // Variavel para calculo de RPM
//----------------------------------------
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("INJeletronica");

delay (1000);

pinMode (injetor, OUTPUT);

Serial.begin(9600); // Inicializa o serial monityor
pinMode(2, INPUT); // Define pinoi de entrada para interrupt 0
Timer1.initialize(100000); // Inicializa o Timer1 para um período x uSegundos
Timer1.attachInterrupt(RotaPerMin); // Ena Int timer1 e define rotina chamada a cada interrupção do Timer1
attachInterrupt(0, Conta, FALLING); // Ena int port2 e define rotina chamada pela queda do pulso do sensor do encoder
}
//----------------------------------------
void RotaPerMin() // Funcao chamada pelo overflow do tempo
{
RPM = Pulso / 6; // Divide os pulso contado por 6
Pulso = 0; // Zera contagem de pulsos
}
//----------------------------------------
void Conta() // Funcao chamada a cada pulso do encoder
{
Pulso++; // Incrementa pulsos
}
//----------------------------------------
void loop()
{
Borboleta = analogRead(borboleta);

// map it to the range of the analog out:
tps = map(Borboleta, 0, 1023, 0, 90);

janela = ((1/((RPM*1000)/60))* 1000);

// vai iniciar um duty cicle minimo de 5% da janela
// somando a porcentagem de 0 a 90% que sera referente ao
// angulo de aceleracao

ti = ( (janela * 0.05) + ((janela * tps) / 100) );
tioff = (janela - ti);

// acionamento do Injetor
//noInterrupts();

//digitalWrite(injetor, HIGH);
//delayMicroseconds(ti);
//digitalWrite (injetor, LOW);
//delayMicroseconds(tioff);

lcd.setCursor(0, 0);
lcd.print("off:");
lcd.print(tioff);
lcd.print("");
lcd.setCursor(9, 0);
lcd.print("on:");
lcd.print(ti);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("TPS:");
lcd.print(tps);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("RPM:");
lcd.print(RPM);
lcd.print(" ");

Serial.print("RPM: "); // Imprfime
Serial.println(RPM);




}

   

Exibições: 162

Responder esta

Respostas a este tópico

   Algo ficou confuso na minha descrição, o arduino 2 tem que processar somente o digitalWrite, o restante do código é o que está no arduino 1 para aquisição e processamento dos dados do motor.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço