Boa tarde a todos!!!! Montei recentemente um circuito dimmer para efetuar o controle PID de temperatura usando um sensor ds18b20 e uma resistência de 25w. Tive dificuldade com relação a fazer funcionar a biblioteca PID, mas com ajuda do Sr. José Gustavo consegui instalar. Agora estou tendo dificuldade em fazer de fato funcionar este projetinho. Estou tentando utilizar o codigo do colega Mauro do link AutomatoBR. Li sobre o codigo e biblioteca mas de fato não estou conseguindo entender, principalmente a parte onde pega o valor medido para aplicar os pulso e chegar até o setpoint.

Montei todo o circuito mas até agora não funcionou. O sensor ds18b20 está indicando a temperatura, mas não ha pulsos saindo da porta para chegar a temperatura setada (Não sei se o valor de set se refere a temperatura). Gostaria de ver se alguém daria uma "luz", uma ajudinha!! Ja faz tres dias que estou martelando e  não saio do lugar.

Exibições: 1817

Anexos

Responder esta

Respostas a este tópico

Não é e não precisa ser, já que só é usada na próxima linha.

JW, boa tarde.
Vou tentar por uma luz na dificuldade que está tendo.

Vamos aqui trabalhar os conceitos do seu sketch.

1.. Identificar a passagem da voltagem pelo zero;
2.. Ler o valor da temperatura usando DS18B20;
3.. Calcular o PID;
4.. Disparar o Triac no deslocamento calculado pelo PID.

1. A rede de 60hz, passa 2 vezes pelo valor zero a cada ciclo. 1seg = 60 ciclos.
    1 ciclo = 1/60 = 16,666 ms cada semiciclo = 8,333ms.
     usar uma rotina de interrupt que identifica a passagem da voltagem pelo valor zero volts.
     Com arduino UNO você pode usar ou o port2 (interrupt 0), ou o 3 (interrupt 1).
     Não é obrigatório, mas é bom definir o port como entrada. (pinMode(x, INPUT);

     Uma vez identificado a passagem da voltagem pelo 0 Volts, podemos disparar o TRIAC,
     (através do MOC), em qq momento entre 0 e 8,333 ms.
     Se dispararmos em tempo 0, o TRIAC ficará todo o semiciclo disparado (até ao fim
     do semiciclo, quando é cortado por ter valor zero entre os A1 e A2), produzindo
     na saída a potencia total da rede sobre a carga.
     Se dispararmos no tempo 8,332, só teremos uma minima fração de voltagem antes
     do fim do semiciclo e portanto a minima potencia sobre a carga.

     Este disparo deverá ser controlado pelo resultado do calculo do PID.

2. Ler o valor da temperatura. 
    Usar a biblioteca do dispositivo (DS18B20) para a leitura e conversão do valor.
    (Esta leitura trava o arduino por cerca de 125 milisegundos.)
    Usar o valor lido para calcular o PID.

3.  Aqui entra a parte complexa do sketch.
     Vou tentar simplificar ao máximo o uso do PID.
     A biblioteca do PID tem vários métodos e parâmetros para serem definidos.
     Não vou entrar em detalhes nos Kp, Ki, e Kd. Sobre eles tem bastante tutorial na net.
     Vamos nos basear somente em alguns parâmetros dos métodos

    "PID pid(&PresentValue, &ManipulatedValue, &SetPoint, kp, ki, kd, DIRECT);"
     e "pid.SetOutputLimits(10, 240);"

     Neste primeiro método, você fornece 2 parâmetros e recebe um calculado, (alem de Kp,Kd e Ki),
     Você fornece "PresentValue", (temperatura lida no DS18B20), SetPoint (valor definido por como "240"),
     e recebe calculado o valor "ManipulatedValue".

     Vamos analisar simplificando este método.
     Se o valor lido estiver abaixo de 240, o PID deve disparar o TRIAC, para que aqueça a carga.
      Ao atingir 240, ou se estiver por qq razão acima deste valor, o TRIAC não é disparado, e a carga
     deveria diminuir a temperatura.

     Aqui vc já deve ter percebido que existe uma incoerência entre o valor que vc lê com o DS18B20 e o valor
     que estabeleceu para o setpoint.
     Leitura do DS18B20 de -55°C até +125°C e set point de 240.
     Desta forma nunca dispara o TRIAC.
     Como para estes casos não gosto de usar valores decimais (float), eu multiplico a leitura

     de temperatura por 100,
     assim, 29,35°C na realidade uso 2935.

     Qual deverá ser seu setpoint? -30,00°C, +48,28°C, +107,23°C, etc?

     Agora vamos continuar.

     Digamos que seu setpoint é de +55,00°C, setpoint = 55,00

4.  Disparo do TRIAC com base no valor calculado.

     Ao detectar a passagem pelo 0 volts, podemos disparar o TRIAC em qq momento na

     condição 0 < disparo < 8,333ms (8333 µS).

     Podemos fazer assim:
     Se precisamos aquecer muito a carga, devemos dispara no inicio, e se for pouco, mais próximo do final.
     Ai usamos o método "pid.SetOutputLimits(x, y);" para definirmos o resultado.
     Variar de x até y.
    "pid.SetOutputLimits(0, 8333);"
     e usamos o valor "ManipulatedValue" com o método um "delayMicroseconds(ManipulatedValue);"
     para disparar o TRIAC e controlar a temperatura da carga.

     Mas aqui entra um problema: Cada leitura do DS18B20 leva cerca de 125 milisegundos, o
     equivalente a 15 semiciclos sem poder disparar

    O autor do sketch que você usou como modelo para o seu usou o sensor LM35,
    e fez uma leitura de um port analógico.
    Este processo é muito rápido se comparado com a leitura do DS18B20.

    Eu desenvolvi um sketch que faz o que vc quer, mas usei para isto o ESP8266, que tem
    recursos adicionais que me permitiram contornar este "delay" causado pelo DS18B20.


    Espero ter ajudado e esclarecido a causa do travamento do seu sketch.

RV

Boa tarde, impressionante a sua explicação!!! Era exatamente oque estava precisando. Andei lendo vários tutoriais na net sobre o assunto e oque estava tendo dificuldade em colocar no sketch seria a integração entre o momento exato em que deve disparar o triac, que é a leitura do ds18b20, comparação com set point e a passagem por zero. Vou efetuar teste e tentar fazer funcionar. Muito obrigado mesmo pela explicação e ajuda.

JW,

veja, se este sketch que escrevi, atende sua necessidade.

Você terá que incluir (se já não tiver), nas suas bibliotecas a  biblioteca timerOne.h

https://github.com/PaulStoffregen/TimerOne

Não esqueça de estabelecer na linha 39 o valor do seu setpoint (multiplicado por 100).

RV

Anexos

Ola minerin, boa tarde, desculpa a demora mas que tinha prova da facul, ai tive que dar uma parada nos testes pra estudar. Montei hoje novamente o circuito para fazer os testes e oque acontece é que a resistência sempre fica ligada. Estando a temperatura ambiente 23 C, eu coloco o set point em 4000 (40C), ao energizar com AC, a resistência liga e não desliga mais. Outro teste que fiz foi colocar o valor do set point em 19 C. Como a temperatura ambiente está em 23 C, não deveria ligar a resistência, mas ela liga. Coloquei um serial print para obter os dados de input, e output. Com a temperatura setada em 19 C a print sai com 2350 em input e 0.00 em output. Entendo que o codigo PID entá funcionando mas a parte de acionamento do triac que está estranho, direto acionado.

JW, boa tarde.

Aqui funciona perfeitamente tanto em 220V qro em 110V.

Por favor post o esquema elétrico que está usando, tanto do Disparo do triac qto do

sensor do zero cross e também a ligação com o arduino.

RV

Montei o circuito deste site https://dxarts.washington.edu/wiki/ac-dimmer-circuit

Até tinha ficado em duvida e fiz testes separadamente para fazer a leitura da passagem por zero e um outro para testar o acionamento  do triac. Será que é algo com o circuito? Mas medindo a porta 4, sempre está com 5v, não corta pra 0 em nenhum momento, mesmo a temperatura estando acima do set point. Não sei se isso tem alguma coisa haver.

olá Juliano.

      Aproveitei este seu post para passar um informação extremamente importante, relacionada ao design de Sistemas com Opto-Acopladores (tipo 4N25, PC817, incluindo os MOC30xx, etc).

      No projeto da página que vc informou acima (este link), há um erro terrível no design da placa de circuito. É tão grave, que pode vir a destruir completamente os circuitos do Arduino, além de ser completamente inseguro (o projeto com a placa daquela forma jamais seria aprovado em um Ensaio de Laboratório de Certificação). Veja o layout da placa daquele projeto:

(clique na figura para "zoom")

      As ligações elétricas do "lado de baixa tensão", não devem "invadir" o "lado de alta tensão", nunca. Caso isso ocorra, vc estará criando um paradoxo no seu próprio sistema, uma vez que vc está usando Opto-Acopladores justamente para isolar um lado do outro. Então por que diabos corromper exatamente este objetivo (a isolação)???

     Veja a figura a seguir, onde mostro a região de "delimitação" entre os lados de baixa e alta tensão:

(clique na figura para "zoom")

      Observe que os Opto-Acopladores são justamente quem determina uma "região de isolação". As ligações elétricas não devem transpassar esta "região". Na realidade é uma área, a qual chamamos tecnicamente  de "insulation clearance".

      A largura dessa área deve ser estar de acordo tanto com a máxima tensão RMS entre os dois lados da isolação, assim como o máximo dV/dt (o gradiente de tensão) a que esta região poderá estar submetida. Mas para facilitar isso, basta fazer essa largura praticamente igual à distância entre os pads do Opto-Acoplador de cada lado da isolação, que é justamente a largura que estou mostrando na figura anterior (área avermelhada no desenho).

      Observe na próxima figura, que as trilhas na "cor azul claro" e "laranja" do "lado de baixa tensão", estão invadindo completamente o "lado de alta tensão":

(clique na figura para "zoom")

      Essa invasão é ainda mais catastrótica, pois a distância entre a trilha do GND do Arduino (área de cobre na "cor laranja" no desenho anterior) no "lado de baixa tensão" e as trilhas do "lado de alta tensão", é menor do que 0.5 mm (menor que meio milímetro). E pior ainda:  ela tem esta distância por uma extensão imensa na placa. Ou seja: se o objetivo aqui é ter problemas muito graves, então basta seguir à risca o desenho da placa que foi postado naquele site.

      Observe que o erro começa já no esquemático do projeto do site, conforme mostro na figura a seguir:

(clique na figura para "zoom")

      Veja que um desenho de esquemático com bom senso e instrutivo para quem for utilizá-lo em qualquer processo (redesign, manutenção, ou mesmo didático), não deve misturar cada lado da isolação (veja no desenho anterior a linha de isolação na "cor rosa"). Eu considero isto uma pratica ruim, e o início para gerar problemas graves. Assim espero ter alcançado a consciência daqueles que "adoram" desenhar circuitos elétricos "largando" componentes espalhados por tudo quanto é canto na folha de desenho. Desenho técnico (seja mecânico ou elétrico) é normatizado, e deve seguir regras de bom senso.

      Claro Juliano, este post que acabei de fazer, não tem relação com o problema que vc está enfrentando. Mas aproveitei o mesmo para fazer este alerta para quaisquer um (incluindo vc) que venha a usar como referência aquele design que está naquele site gringo.

      Então pessoal, fica a dica:  os projetos dos sites gringos (e nacionais também) podem ser muito legais, mas fiquem atentos, pois erros grotescos (como é o caso deste site com título "AC Dimmer Circuit"), podem resultar em problemas imensos, e inclusive perigosos.

      Abrçs,

      Elcids

Olá Elcids, muito obrigado pelo alerta. Vou montar um outro circuito, agora como sugerido pelo Rui. Outra coisa que notei neste circuito é que o desenho para mascara está errado. Quando você passa para a placa as liações ficam invertidas.Mas realmente a parte do led passando pelo lado AC não tinha me atentado. Obrigado pela explicação e dica

Se a Output for zero, o TRIAC deveria estar em corte, Corrente zero para a carga.

RV

Coloquei alguns serial print para analisar a saida. Estou tentando achar uma forma de colocar um serial print para verificar a detecção de zero. Pela imagem da pra ver que a temp ja alcançou o setpoint mas a saida para o triac (pin 4 ) continua alta.

Fiz um teste usando o sketch deste site para ver o circuito detector de zero, se esta funcional https://www.circuitar.com.br/nanoshields/modulos/zero-cross/index.html

aparentemente sim

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço