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);
}
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por