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: 348

Anexos

Responder esta

Respostas a este tópico

Bom dia JW

aparentemente é uma questão de tempo do disparo.

Vou tentar elaborar aqui um sketch para testarmos o tempo do disparo

relativo ao zerocross.

RV

Achei uma resposta sua sobre um circuito dimmer que usa. Estou tentando fazer testes para testar o Circuito,   http://labdegaragem.com/forum/topics/acionar-triac-no-inicio-do-sem...

Clap, clap, clap! 

JW,

inseri algumas linhas no sketch para "monitorar" o disparo após o zero cross.

Defini a velocidade do serial monitor para 115200.

Segue o sketch e os resultados que obtive aqui, para que vc compare com os seu resultados.

RV

Anexos

Desculpe Rui minha ignorância, mas não estou conseguindo compreender. Mesmo minha saida de temperatura já tenha alcançado e até mesmo passado pelo valor de set point a saída para o triac (pin 4 ) continua disparada. Se alcançou a temperatura não deveria disparar. Não estou conseguindo intender o por que.

segue em anexo os valores

teste_1.txt

JW

use o novo sketch que postei, e poste o a listagem do monitor.

RV

Eu uso este esquema de zero cross e de disparo do triac

Rui, em anexo a listagem do serial. meu set point estava para 40 C (4000), e mesmo zerando output, continuou aquecendo e diag continuou a subir e estabilizar nesses 8720

teste_2.txt

Olá Rui, uma duvida: O resistor R6 é 56K? ou seria 5,6K

56K mesmo.

RV

Boa noite JW,

aquele sketch que postei anteriormente funciona bem mas é bem complexo e difícil de ser diagnosticado.

Com base nisto, resolvi escrever outro, usando o mesmo conceito de timerOne, mas um enfoque um pouco diferente.

Ele tem a vantagem de poder  usar um valor manualmente de 5 a 100 para testar o disparo do TRIAC.

Se colocar 5 na linha 51,  ele acende total, se colocar 70 acende pouco,

se colocar 100, fica apagada.

Desta forma você testa o zerocross e o disparo.

Se comentar esta linha, funciona no automático.

O circuito é exatamente igual ao do sketch anterior.

Segue anexo.

RV

Anexos

Teoria do funcionamento do Sketch TRIAC_PID.


Vamos dividir em partes básicas
1.  Zero Cross

2.  Dimmer (Disparo)

3.  Timer1

4.  Leitura da temperatura na carga

5.  PID


1. Zero Cross   

   A nossa rede elétrica (127/220V), é corrente alternada de 60 Hz.   

  É  também no formato senoidal.   

   Cada ciclo completo dura 16.666 micros segundos (1seg/60) , e passa duas vezes pelo valor zero volts.   

   Então cada semiciclo dura 8.333 micro segundos.   

   Entre uma  e o outra passada pelo valor 0 volts passam-se 8333 micros segundos.   

   Zero cross é o circuito que detecta que a senoide passou pelo valor de zero volt,   

   e é usado para definir o nosso momento zero de disparo do Triac.   

   Não vou me extender mais nesta teoria. Tem bastante material sobre isto na Net.   

   Cada vez que o valor passa pelo zero, usando o circuito do 4N25, um pulso é aplicado no port 2 (interrupt 0),

   e gera um interrupt. 

   Uso este interrupt para zerar a  variável que conta quantas vezes o timer1 chegou ao valor zero.   

   Ou seja incio a contagem do tempo após o zero cross.


2. Disparo.   

   O Triac é um dispositivo que permite a passagem da corrente elétrica de modo controlado.   

   Ao aplicar uma corrente no "gate", ele inicia a passagem de corrente entre os anodos A1 e A2.   

   Qdo a voltagem entre estes anodos fica zero, ele para de conduzir, e só inicia  novamente a

   condução de corrente, com uma nova corrente no "gate".   

   Ele conduz em ambos sentidos, de A1 para A2 ou de A2 para A1, portanto conduz no ciclo positivo e   

   negativo da senoide.    

   Qdo a voltagem da rede passa pelo zero e poucos micro segundos depois enviamos um pulso

   pelo MOC2033 ao triac, ele conduz a corrente, e assim fica até ocorrer novamente o valor zero da   

   voltagem da rede.   

    Se formos controlando estes microssegundos (aumentando), o disparo será cada vez mais próximo do    

    novo zero, e menor tempo o triac ficará disparado, fornecendo menos tempo de corrente para a carga, 

    e consequentemente menor "Potencia".


3. Timer1       https://www.sparkfun.com/datasheets/Components/SMD/ATMega328.pdf  Pag 114. 

   O Atmega (Arduino UNO, Mega, mini, etc) tem alguns timers.   

    Um deles, o Timer1 (Timer/counter1 pode incrementar de 0 até 65535, (0 até 0xFFFF),   

    ou decrementar de 65535 até 0.   

    Quando o valor no timer1 chega a 0 e é decrementado por um, ele vai para 65535    

   ou chega em 65535 e recebe um incremento indo para zero, ele gera um interrupt. 

    Ele pode receber pulsos para contagem selecionados de diversos modos. (Prescaler)   

    O modo que eu uso é o decremento de 1 a cada micro segundo.    

   Neste sketch,  eu carrego o timer1 com o valor  75 (75 micros segundos).   

   Quando ele chega em zero, e recebe um novo decremento, ele gera um interrupt, e na rotina   

   chamada por este interrupt, eu incremento uma variável. 

   Esta variável será confrontada com um valor gerado pelo algorítimo do PID.   

   Quando os valores ficam iguais, é o momento de disparar o triac.   

   Como basta um pequeno pulso de disparo, 10 micro segundos depois do disparo, desligo o disparo.

4. Leitura da temperatura na carga 

   Neste sketch a leitura da temperatura da carga 'e feita usando-se um DS18B20. 

   Este dispositivo é muito preciso, mas antes de ler a temperatura nele,  faz-se necessário enviar para ele um

  comando de conversão da temperatura interna  dele para valores e posterior envio pelo One wire bus. 

   Este processo tem um tempo muito grande.   

   Ele leva cerca de 95 milissegundos se for para resolução de 9 bits,

   (Intervalos de 0,5 °C),   e de 750 milissegundos se a resolução for de 12 bits (Intervalos de 0,0625 °C).   

   Optei pela resolução de 9 bits.   

   Mesmo assim ocorrerão 11 semiciclos da rede entre o inicio e o fim da medida de  temperatura.   

   Como usei interrupt, tanto para detectar o zero como para disparar o triac,    

   o tempo de conversão e leitura da temperatura é interrompido para responder à estas atividades,  

   retornado ao fim das mesmas.   

   Desta forma, se fosse esperar cada medida para disparar o triac, não teria um bom resultado.   

   assim, disparando o triac a cada semiciclo com o valor de uma leitura, não temos o efeito    

   de cintilação na carga.   

5. 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(&Input, &Output, &SetPoint, kp, ki, kd, DIRECT);"   

         e "pid.SetOutputLimits(0, 1000);"   

   Neste primeiro método, forneço 2 parâmetros e recebo um calculado, (alem de Kp,Kd e Ki), 

   forneço "Input", (temperatura lida no DS18B20), SetPoint (3100),  e recebo calculado o valor "Output".   

   Se o valor lido estiver abaixo de 3100, o PID deve disparar o TRIAC, para que aqueça a carga. 

   Ao atingir 3100, ou se estiver por qq razão acima deste valor, o TRIAC não é disparado, e a carga   

   deverá diminuir a temperatura.   

   Mas o PID faz o controle deste disparo para atenuar ao máximo variações    

   Uso valores decimais (float), eu multiplico a leitura de temperatura por 100,   

   assim, 29,35°C na realidade uso 2935.   

   Como o disparo é inverso e varia de 5 a 99, uso a função map para adequar estes valores. 

   e uso o resultado para controlar o disparo do triac.
   Posso forçar disparar manualmente, cancelando o calculo do PID,   para isto basta colocar valores de

   5 a 99 na linha  51.   

   Para usar o automático, (Calculo com o PID), esta linha deverá estar comentada (//).


RV
    

Olá Rui, explicação perfeita!!!! Tentei fazer o teste com meu circuito mas não tive resposta. Vou montar um novo circuito. Tenho somente os h11a1 e moc 3021. Será que terei problema? Acha melhor usar o 4n25? com diodos?

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2019   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço