[RESOLVIDO] sugestões para problemas com delay/millis/interrupção

Prezados,


recentemente recebi ajuda nesse projeto, tive alguns avanços mas não consegui ainda concluir, por isso recorro a vocês mais uma vez.

O que o sistema faz:
Busca garantira a alimentação de cargas de forma ininterrupta oriunda de fontes distintas (não é um no-break)
As fontes são alimentadas em 220VAC e fornecem uma tensão de 12VCC (Fonte A e Fonte B)
O sistema opera de duas formas, MANUAL e AUTOMÁTICO

Quando em automático ele verifica o flag PRIOR que indica qual a fonte prioritária, depois verifica o flag de status da fonte SVA ou SVB e depois a entrada de sincronismo SINCRO que indica que as fontes estão em fase (esta indicação é uma entrada do arduino que vem de um circuito eletrônico a parte, responsável por controlar o ângulo de fase das fontes e também por fazer o acionamento através de chaves estáticas). Atendendo a todas as condições a troca de fontes e feita de forma instantânea, desliga uma, liga outra.

Quando em manual a sequência de verificação é a mesma descrita acima, mas com a ressalva de que a comutação não pode ocorrer de forma instantânea, deve haver um retardo entre o desligamento e a entrada da outra fonte. (proteção). Esse retardo deve ser da ordem de 20 milissegundos

Obs: testes com delay não funcionam, ficam muito acima do tempo. Testes com millis() consegui chegar a 300 milissegundos, abaixo disso se perde. Tentei interrupção mas não consegui aplicar no programa. Acredito que resolva com interrupção, mas não soube aplicar.

A análise dos tempos de comutação são realizadas com osciloscópio.

Estou anexando o código e um desenho simplificado.

muito obrigado,

Teodoro

Exibições: 522

Responder esta

Respostas a este tópico

Você pode estar utilizando a opção delayMicroseconds(20), no lugar de Delay, é bem util ele faz umas pausas imperceptíveis.

https://www.arduino.cc/en/Reference/DelayMicroseconds

você pode tambem estar utilizando a biblioteca SimpleTimer, para o uso do millis ela é bem pratica quando o código fica muito grande, simplifica a programação.

http://playground.arduino.cc/Code/SimpleTimer

Teodoro, desculpe não ter respondido, eu comecei a responder no meu celular, mas acabei não publicando.

Eu iria dizer exatamente isso, o problema do delay é que o controlador para de executar uma ação para poder aguardar o delay, enquanto no millis ele continua contando o tempo, como se fosse uma Thread, alias de uma pesquisada sobre Threads no arduino existem excelente dicas.

tente refazer a lógica com swithcase é um pouco mais rapido a leitura que os if's

http://playground.arduino.cc/Referencia/SwitchCase

ou tente fazer algo assim mais quebradinho

if (SELECAO == "CA" && SVA&&   CB ==true) {
  CB = false;
  Delay_ms(delay_comutacao);

}

if (SELECAO == "CA" && SVA&&   CB ==false) {
  CA = true;
  Delay_ms(delay_comutacao);

}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço