Boa noite amigos.

estou desenvolvendo um pequeno modulo de injeção, onde regulo o tempo de injeção do bico atraves de um potenciometro. Um sensor hall fica acoplado no eixo do do motor e dispara o bico injetor mas o tempo que ele fica aberto se dá atraves da posição do potenciometro. Até ai tudo OK.

Mas estou usando o DELAY e ele trava o loop como todos sabem, Isso causa uma onda totalmente instavel na saida se for medida com o osciloscopio pois quando ele esta em delay as vezes o senhor novamente ativa o bico.

Gostaria de saber se tem como fazer o que quero sem usar o delay Eu nao consigo de jeito nenhum aprender a usar o millis. Me ajudem por favor

Segue o scketch.

Exibições: 1051

Anexos

Responder esta

Respostas a este tópico

Boa noite LSS,

obrigado por atender minhas recomendações.

Fiz uma pequena analise do seu sketch ( ultima_revisao.ino ), e seguindo as mesma premissas 

do  José Gustavo Abreu Murta , modifiquei o seu sketch para usar micros() ao invés de delay.

Estou anexando o arquivo.  ultima_revisao_V02.ino

Mas algo me chamou atenção.

Seguindo o seu código original, verifiquei o seguinte:

Você coloca o bico em  HIGH, aguarda um tempo (tempodebico) e então coloca ele em  LOW.

Até aqui tudo bem.

Mas em seguida quase que instantaneamente ele volta pra HIGH (Só o tempo de alguns usegundos gastos

pelos ifs).

É assim mesmo que o bico deve funcionar, ou ele precisa ficar algum tempo em LOW antes de voltar para HIGH,

E se precisar, quanto tempo é este?

RV

Anexos

Seguinte.. O bico so fica em HIGH quando o sensor é ativado. digitalRead(sensorvira);  

Caso o ima passe na frente do sensor Hall ele dispara o bico. Mas dispara de acordo com o tempo programado pelos IFs pois antes ele mede a posição do potenciometro em analogread(A0).

Quem "prende" o bico aberto "HIGH" é o delay... mas o delay obedece o tempo (tempodebico) que foi gerado pelos Ifs comparando com a posição do potenciometro

olá Leonardo.

      Acredito que eu entendi como seu Sistema deve funcionar, mas posso estar enganado, uma vez que estas descrições só são completamente claras para quem as fez.

      Se eu estiver certo, entendo sua frustração, uma vez que usando um circuito discreto é perfeitamente possível sua implementação (mas claro que aí não terá a mesma flexibilidade e "sofisticação").

      Então, partindo de que entendi corretamente, implementei seu Sistema no Arduino, e ele funcionou perfeitamente. Inclusive também fiz a simulação do mesmo, a qual também funcionou como esperado.

      Para isto, implementei uma Máquina de Estados, que controla a geração dos pulsos, baseado no valor atual do "tempo de bico" (um nome um tanto esquisito, né?). E foram necessários apenas 2 estados para a implementação (um tanto surpreendente, pois diversas outras Máquinas que já implementei aqui no LDG tinham mais estados).

      Claro, além da implementação da Máquina de Estados, tive que utilizar algumas técnicas "especiais", e sobre algumas dessas técnicas falarei mais à frente.

      Mas antes Leonardo, gostaria de esclarecer um ponto:  não era exatamente o "delay" o culpado pelos problemas que vc estava tendo. Eram vários culpados (e o "delay" era o menos culpado). Mas claro, em Sistemas de "tempo real", deve-se evitar o uso do "delay" a todo custo (no código que implementei não há nenhum), pois ele geralmente compromete as temporizações existentes no Sistema.

      Outro detalhe: como vc não disse praticamente nada sobre o Hardware, testei com o Arduino UNO (e a simulação também fiz com o UNO).

      Assim, a implementação de Hardware pode ser vista na figura a seguir, onde já mostro o resultado da simulação:

(clique na figura para "zoom")

      Sobre esta implementação e resultado, farei algumas observações relevantes:

     1) observe o sinal na cor amarela no Osciloscópio:  são os pulsos do Sensor Hall. O código implementado, não depende da largura destes pulsos do Sensor, o que é ótimo. Mas como na simulação eu tinha que colocar uma largura para eles, coloquei em 500us. Se na prática for maior ou menor, não haverá problema, pois o código trata isso sempre de forma adequada.

      2) o sinal na cor azul no Osciloscópio, são os pulsos de acionamento dos bicos injetores. A largura destes é determinada pelo valor lido do Potenciômetro, conforme vc disse que deveria ser. Sempre que o valor lido do Potenciômetro entra numa nova faixa, a largura dos pulsos muda de acordo com esta faixa. Os períodos dos pulsos que medi estavam bem precisos, e isto é devido a algumas das "técnicas especiais" que apliquei.

      3) para a geração dos pulsos do Sensor Hall, na simulação foi utilizado um Gerador de Pulsos (na prática usei um Sensor Hall mesmo). Veja que na simulação, o valor da Frequência do Gerador, está em 80 Hz, ou seja, 80 pulsos por segundo. Isto corresponde a 4800 RPM, já que a rotação do motor em RPM = Frequência x 60 (ou seja, 80 x 60 = 4800 RPM), isso considerando que há apenas um único ímã acoplado ao eixo do Motor (se fossem dois, a frequência dobraria). Assim, para alterar a rotação na simulação, basta alterar o parâmetro "Frequência" do Gerador de Pulsos.

      4) observe que há um Capacitor (o "C1") conectado entre o "A0" e o GND do circuito. Aconselho fortemente que vc o conecte. Na simulação não há ruídos, mas na prática os Sistemas em ambientes com Motores, costumam ter um bom nível de ruídos. E o capacitor é justamente para filtrar estes ruídos do sinal vindo do Potenciômetro (e também para minimizar a "injeção de carga" existente no circuito interno do Processador do Arduino). O valor pode estar entre 100kpF (que é o que eu coloquei na simulação), e 1uF. Use capacitor cerâmico, ou de tântalo (não use outros tipos!!!).

      5) na simulação, conectei também um Voltímetro no pino "A0", de forma a poder conferir o valor indicado nele com o medido pelo Arduino (bateu sempre). Na prática, se vc for conectar algum voltímetro ou multímetro ali, apenas faça isso se tiver colocado o capacitor "C1".

      6) o LED conectado na simulação (também conectei na prática), é quase um "enfeite". Mas é interessante, pois piscará na frequência dos pulsos gerados.

      7) observe que no Terminal do Arduino (a Serial padrao), é possível ver os valores atuais da tensão medida no Potenciômetro, e "tempo de bico" correspondente. O sistema é otimizado, e apenas atualiza o Terminal, quando o "tempo de bico" muda. Isso é importante, pois a Serial consome alguma performance do Arduino, e então isso é minimizado com a técnica utilizada. Vc pode facilmente desligar essa exibição no Terminal, veja como:  no código, há um #define com o nome "SYS_DEBUG_ON", que pode assumir "1" ou "0".  Se colocar "1", você verá as informações no Terminal do Arduino. Se colocar "0", o sistema não exibirá no Terminal. Este #define do "SYS_DEBUG_ON" está no início do código, facilmente encontrado.

      Agora falando sobre uma das técnicas utilizadas para garantir maior performance do Sistema, o que é muito importante, pois o Processador AVR8 do Arduino não é nenhum foguete. Você verá que no tratamento interno, a tensão medida é multiplicada por 1000 (mil, isso mesmo). Isso converte o valor "float" para um valor inteiro com até 4 dígitos. Este valor é então utilizado para determinar qual a faixa do "tempo de bico" correspondente. Mas por que?  Ocorre que as rotinas de Ponto Flutuante do Arduino não são nada velozes, então no caso deste Sistema é melhor evitá-las sempre que possível. Claro, se em algum momento vc precisar do valor original em Volts, bastará dividir por 1000, mas evite fazer isso, e se fizer use uma temporização como a que utilizei em diversas partes do código.

      O código está todo comentado e com observações importantes. Então está bem acessível de seguir e entender.

      A Máquina de Estados implementada, é extremamente simples, já que tem apenas 2 estados. Se quiser aprender sobre como funciona, eu já postei aqui no LDG diversas outras Máquinas também simples, que irão ajudar nesse processo. Na figura a seguir, vc pode ver o Diagrama de Estados, a partir do qual implementei a Máquina de Estados deste Sistema:

(clique na figura para "zoom")

      Segue o código, incluindo os arquivos de simulação no Proteus, e o Diagrama de Estados (formato Visio e PDF).

     Código:    Injecao_Bicos_02.zip

      Caso tenha alguma dúvida ou comentário, não deixe de postar.

      Espero ter ajudado.

      Abrçs,

      Elcids

Fala meu amigo... MUIIIITO top sua explicação.

Muito obrigado mesmo pelas dicas.

carreguei o seu sketch no meu arduino mas ele fica doidinho coitado. o bico abre e fecha descompassado com o motor. e seu eu acelero um pouquinho so o motor ele fica praticamente aberto direto

Desliguei o debug mas nao mudou nada. seria muito problema vc me dar uma consultoria via whatapp?  Agent pode combinar um valor

Como vc disse acima que nao mencionei o hardware. estou usando o seguinte.

Arduino UNO

Sensor hall KY-024

Potenciometro no lugar do SENSOR MAP (sensor de pressao) pois a saida é em forma de tensao. entao da pra usar o potenciometro no lugar do MAP pra testes

Acoplei um Imã em um motor com regulador de velocidade para dar pulso no sensor hall.

A saida do arduino controla uma PONTE H L298N para fazer a interface de potencia do arduino com o bico. Nao usei transistor pois estava chegando 10 volts no bico apenas. Com a ponte H esta chegando 11,8V

Seria isso mesmo.

Se puder me dar uma ideia pelo zap ficaria muito grato. 22-998484320

A imagem das minhas gambiarras esta aqui: circuito.jpg

olá Leonardo.

      Vamos checar alguns pontos do seu circuito, pois pela foto que vc postou não ajuda muito (muitos fios misturados). Por favor:

      1) faça um desenho de como vc está ligando o Potenciômetro. Ele tem 3 pinos, então me mostre como está ligando cada pino.

      2) faça um desenho me mostrando como vc está ligando o Sensor Hall. Post também uma foto do sensor (acredito que provavelmente seja uma dessas plaquinhas comercializadas), ou então post aqui o link de onde vc adquiriu o sensor. Se tirar uma foto, que seja boa (que dê pra identificar o modelo da sua plaquinha). Eu preciso identificar exatamente qual é a plaquinha do seu Sensor, pois existem variantes do KY-024.

      3) da mesma forma, mostre como vc está ligando a saída 8 do Arduino (a que gera os pulsos de controle dos bicos)  até a Ponte H. Mostre também como vc está ligando a alimentação da ponte H, pois pela sua foto não dá pra ver direito.

      O desenho, vc pode fazer do jeito que achar mais fácil (pode ser até a lápis num papel e vc fotografa e envia aqui, ou pode fazer no Paintbrush ou qualquer outro programa de desenho). O importante é que o desenho permita que eu possa conferir seu circuito.

      Eu fiz uma versão melhorada do código anterior, que é mais precisa em termos de temporização.  Mas veja:  se houver algum problema no seu circuito, vc vai continuar tendo problemas, então também é importante checarmos seu circuito.

      Assim, segue a versão melhorada:   Injecao_Bicos_03.zip

      Teste o programa como ele está. Não faça alterações, pois isto dificulta o diagnóstico.

      Esta versão, eu testei também, e de fato funcionou melhor que a versão anterior.

      Fico no aguardo,

      Abrçs

      Elcids

Fala mano. Boa tarde

Entao. não funcionou. Ficou do mesmo jeito do outro.

O potenciometro esta ligado do jeito padrão. Pino do meio no A0. pino da esquerda 5V e da direita GND

Saída D0 do sensor hall ligado na entrada 2 do arduino.

a foto do sensor hall é essa: hall.jpg

Ponte H está assim: Saída 8 do arduino no IN1 A, ponte alimentada com a fonte +14V e a saída OUT2 ligada no bico injetor

O arduino está com 14V da mesma fonte ligado no VIN GND da fonte, do arduino, da ponte H, do sensor Hall tudo junto.

Sou tecnico em eletronica. Essas ligaçoes pra mim sao tranquilas. O problema é a programação.

rapaz. Acabei de notar uma coisa aqui.

usei um motor spindle com um imã acoplado nele e o sensor hall preso nele.

Quando acelero o motor o arduino da esse problema de ligar o bico direto

mas quando eu desligo o motor e ele fica girando na inercia seu sketch funciona.

O que pode ser? o motor nao tem nada a ver com o ciscuito. Esta ligado direto na tomada

ok Leonardo.

      Pelo que vc me relatou aqui e no Skype, acho que já sei qual o problema do seu Sistema.

      Irei te responder lá no Skype, e depois que concluirmos, postarei aqui como foi resolvido, ok?

      Abrçs

      Elcids

Bom dia LSS,

vc tem razão, acho que eu já estava com sono qdo não entendi quem colocava

o bico em HIGH.

RV

Sugiro que estude um projeto que já funcionou.

Veja que complexidade ao usar a sonda Lambda. 

http://scottsnowden.co.uk/electronic-fuel-injection-success/#more-286

https://bitbucket.org/SSnowden/project-arduino-ecu/src/master/

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço