Controle de temperatura por PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor Smarley » 20 Mar 2011 10:47

Cara, um amigo meu fez um protótipo para aquecer uma chapa de cobre com uns resistores.

Primeiro ele levantou a curva de temperatura x tempo com várias tensões aplicadas(demorou horas e horas).

Depois ele modelou a planta por um circuito RC e passou para o domínio da freqüência. Ele utilizou um controlador PI com anti windup.

Discretizou o controlador e colocou no PIC.
Ficou perfeito.

Ele utilizou o próprio PWM nativo do PIC.

Só precisa estudar um pouco sobre controle e tu verá que não é tão difícil assim.

Abraço!
Smarley
Bit
 
Mensagens: 48
Registrado em: 17 Jul 2008 17:05

Vou fazer uns testes

Mensagempor itamar » 20 Mar 2011 10:47

andre_teprom,

vou testar a idéia de comutar o PWM e posto o resultado. se resolver ótimo...
se não... rsrsrs
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor itamar » 20 Mar 2011 10:50

Smarley escreveu:Cara, um amigo meu fez um protótipo para aquecer uma chapa de cobre com uns resistores.

Primeiro ele levantou a curva de temperatura x tempo com várias tensões aplicadas(demorou horas e horas).

Depois ele modelou a planta por um circuito RC e passou para o domínio da freqüência. Ele utilizou um controlador PI com anti windup.

Discretizou o controlador e colocou no PIC.
Ficou perfeito.

Ele utilizou o próprio PWM nativo do PIC.

Só precisa estudar um pouco sobre controle e tu verá que não é tão difícil assim.

Abraço!


Tô ligado nessas idéias... porém, como já disse, nativo no PIC só temos 2 PWM...e necessito de 3 distintos e independentes tanto em frequência quanto em duty cycle.
mas valew
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor _blackmore_ » 20 Mar 2011 11:01

itamar

no PIC só temos 2 PWM...e necessito de 3 distintos e independentes tanto em frequência quanto em duty cycle.


se o PWM é atrelado ao TM2 ... como vc faz para ter dois PWM com frequências distintas? a cada retorno no loop vc altera as config do TM2? e isso não vai alterar para os 2 PWM?
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor itamar » 20 Mar 2011 11:10

_blackmore_ escreveu:itamar

no PIC só temos 2 PWM...e necessito de 3 distintos e independentes tanto em frequência quanto em duty cycle.


se o PWM é atrelado ao TM2 ... como vc faz para ter dois PWM com frequências distintas? a cada retorno no loop vc altera as config do TM2? e isso não vai alterar para os 2 PWM?


Sim, sempre que é necessário alterar a frequência do PWM utilizo uma biblioteca... e quanto ao duty altero de acordo com a leitura do AD. na frase anterior enfatizei o termo errado não é a freqência que deve ser distinta mas o ciclo
dá uma olhada:
//======================================= pwm =========================
Encontrei pronta e funfa legal

#define PWM_250HZ_CLK4 setup_timer_2(T2_DIV_BY_16, 250, 1) //
#define PWM_500HZ_CLK4 setup_timer_2(T2_DIV_BY_16, 125, 1) //
#define PWM_1KHZ_CLK4 setup_timer_2(T2_DIV_BY_4, 250, 1) //
#define PWM_1K25HZ_CLK4 setup_timer_2(T2_DIV_BY_16, 50, 1) //
#define PWM_2KHZ_CLK4 setup_timer_2(T2_DIV_BY_4, 125, 1) //
#define PWM_2K5HZ_CLK4 setup_timer_2(T2_DIV_BY_4, 100, 1) //
#define PWM_4KHZ_CLK4 setup_timer_2(T2_DIV_BY_1, 250, 1) //
#define PWM_5KHZ_CLK4 setup_timer_2(T2_DIV_BY_1, 200, 1) //
#define PWM_8KHZ_CLK4 setup_timer_2(T2_DIV_BY_1, 125, 1) //
#define PWM_10KHZ_CLK4 setup_timer_2(T2_DIV_BY_1, 100, 1) //
#define PWM_20KHZ_CLK4 setup_timer_2(T2_DIV_BY_1, 50, 1) //
#define PWM_25KHZ_CLK4 setup_timer_2(T2_DIV_BY_1, 40, 1) //
#define PWM_100KHZ_CLK4 setup_timer_2(T2_DIV_BY_1, 10, 1) //

#define PWM_500HZ_CLK8 setup_timer_2(T2_DIV_BY_16, 250, 1) //
#define PWM_1KHZ_CLK8 setup_timer_2(T2_DIV_BY_16, 125, 1) //
#define PWM_2KHZ_CLK8 setup_timer_2(T2_DIV_BY_4, 250, 1) //
#define PWM_2K5HZ_CLK8 setup_timer_2(T2_DIV_BY_16, 50, 1) //
#define PWM_4KHZ_CLK8 setup_timer_2(T2_DIV_BY_4, 125, 1) //
#define PWM_5KHZ_CLK8 setup_timer_2(T2_DIV_BY_4, 100, 1) //
#define PWM_8KHZ_CLK8 setup_timer_2(T2_DIV_BY_1, 250, 1) //
#define PWM_10KHZ_CLK8 setup_timer_2(T2_DIV_BY_1, 200, 1) //
#define PWM_16KHZ_CLK8 setup_timer_2(T2_DIV_BY_1, 125, 1) //
#define PWM_20KHZ_CLK8 setup_timer_2(T2_DIV_BY_1, 100, 1) //
#define PWM_40KHZ_CLK8 setup_timer_2(T2_DIV_BY_1, 50, 1) //
#define PWM_50KHZ_CLK8 setup_timer_2(T2_DIV_BY_1, 40, 1) //
#define PWM_200KHZ_CLK8 setup_timer_2(T2_DIV_BY_1, 10, 1) //

#define PWM_1KHZ_CLK16 setup_timer_2(T2_DIV_BY_16, 250, 1) //
#define PWM_2KHZ_CLK16 setup_timer_2(T2_DIV_BY_16, 125, 1) //
#define PWM_4KHZ_CLK16 setup_timer_2(T2_DIV_BY_4, 250, 1) //
#define PWM_5KHZ_CLK16 setup_timer_2(T2_DIV_BY_16, 50, 1) //
#define PWM_8KHZ_CLK16 setup_timer_2(T2_DIV_BY_4, 125, 1) //
#define PWM_10KHZ_CLK16 setup_timer_2(T2_DIV_BY_4, 100, 1) //
#define PWM_16KHZ_CLK16 setup_timer_2(T2_DIV_BY_1, 250, 1) //
#define PWM_20KHZ_CLK16 setup_timer_2(T2_DIV_BY_1, 200, 1) //
#define PWM_32KHZ_CLK16 setup_timer_2(T2_DIV_BY_1, 125, 1) //
#define PWM_40KHZ_CLK16 setup_timer_2(T2_DIV_BY_1, 100, 1) //
#define PWM_80KHZ_CLK16 setup_timer_2(T2_DIV_BY_1, 50, 1) //
#define PWM_100KHZ_CLK16 setup_timer_2(T2_DIV_BY_1, 40, 1) //
#define PWM_400KHZ_CLK16 setup_timer_2(T2_DIV_BY_1, 10, 1) //

#define PWM_800HZ_CLK10 setup_timer_2(T2_DIV_BY_16,195, 1) //
#define PWM_1KHZ_CLK10 setup_timer_2(T2_DIV_BY_16,156, 1) //
#define PWM_2KHZ_CLK10 setup_timer_2(T2_DIV_BY_16, 78, 1) //
#define PWM_4KHZ_CLK10 setup_timer_2(T2_DIV_BY_4, 156, 1) //
#define PWM_5KHZ_CLK10 setup_timer_2(T2_DIV_BY_4, 125, 1) //
#define PWM_8KHZ_CLK10 setup_timer_2(T2_DIV_BY_4, 78, 1) //
#define PWM_10KHZ_CLK10 setup_timer_2(T2_DIV_BY_1, 250, 1) //
#define PWM_16KHZ_CLK10 setup_timer_2(T2_DIV_BY_1, 156, 1) //
#define PWM_20KHZ_CLK10 setup_timer_2(T2_DIV_BY_1, 125, 1) //
#define PWM_32KHZ_CLK10 setup_timer_2(T2_DIV_BY_1, 78, 1) //
#define PWM_40KHZ_CLK10 setup_timer_2(T2_DIV_BY_1, 62, 1) //
#define PWM_80KHZ_CLK10 setup_timer_2(T2_DIV_BY_1, 31, 1) //
#define PWM_100KHZ_CLK10 setup_timer_2(T2_DIV_BY_1, 25, 1) //

//================================================================
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor andre_luis » 20 Mar 2011 11:13

Na verdade o que irá mudar é o Duty-cicle.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor andre_luis » 20 Mar 2011 11:23

itamar escreveu:estoura uma vez
lê adc 1
carrega duty 1 do PWM
nível alto pino (para setar R1) .
---
estoura de novo
recarrega o timer
lê adc 2
carrega duty 2 do PWM
nível baixo pino(para setar R2).


Itamar,

Creio que voce não esteja programando da maneira mais eficiente.
Se usasse o conceito de tarefas assincronas, não teria de aguardar o resultado da leitura do AD para prosseguir com o processamento das tarefas seguintes.

Sugestão :

Código: Selecionar todos
#INTERRUPCAO DO TIMER
estoura uma vez
carrega duty 1 do PWM
nível alto pino (para setar R1) .
---
estoura de novo
recarrega o timer
carrega duty 2 do PWM
nível baixo pino(para setar R2).

#MAIN ( dentro do loop infinito )
lê adc 1
lê adc 2


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor MOR_AL » 20 Mar 2011 19:02

Desculpe Itamar, mas a minha solução ou necessita de mais pelo menos um timer, ou a ocupação da CPU para contar tempo.

Pensei em outra hipótese. Não use PWM nenhum.
Use um timer para gerar uma interrupção a cada período de, digamos 0,5s.
Quando ocorrer esta interrupção, leia o sensor de temperatura 1 por meio do CAD. Se a temperatura for maior que a desejada, desligue a resistência 1. Se for menor que a desejada, ligue a resistência 1.
Repita esse procedimento para a resistência 2 e para a resistência 3. No total isso deve durar menos de 600 ciclos de clock a cada 0,5s. Se o cristal for de 4MHz, cada ciclo tem 1us e 0,5s terão 500.000 ciclos.
Isso significa que apenas um pequeno período da CPU vai ser dedicado ao ajuste da temperatura. Você estará atualizando o estado das resistências a cada meio segundo. O restante fica às suas necessidades.
O único problema é que a temperatura poderá sofrer um overshoot, pois você só garante um controle estável com um sistema PID.
Acho que mais simples que isso só acender e apagar led com PIC!! hehe!! :lol:
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor andre_luis » 20 Mar 2011 21:21

MOR_AL escreveu:...você só garante um controle estável com um sistema PID...


Uma alternativa para isso seria mudar gradualmente o Duty-cicle do PWM ( em passos fixos ou variáveis ) a cada interrupção, ao invéz de simplesmente recarregar o valor tabelado para a temperatura final desejada.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor itamar » 21 Mar 2011 00:08

olha só o que fiz:


Código: Selecionar todos


int1 controle=0;

#int_timer0
void comuta_PWM(){

if(controle==0){
output_high(enable_1);
output_low(enable_2);
delay_us(100);// coloquei só pra ajudar na visualização
controle=!controle;//inverte para que no proximo cilco vá para o outro IF
clear_interrupt(int_timer0);
set_timer0 (128);
}


if(controle==1){
output_high(enable_2);
output_low(enable_1);
delay_us(100);
controle=!controle;
clear_interrupt(int_timer0);
set_timer0 (128);
}

}


porém na simulação ficou assim
Imagem

os traços de baixo(enables - rosa e verde) tão ok o problema é que a comutação o PWM tá perdendo as características. no caso, estou pegando a saida pwm e lançando direto nas nands e apenas comutando qual deve ser o destino. para esse caso ainda não implementei as rotinas de leitura dos AD's e outros testes.
O estranho é o comportamento das curvas azul e amarela do osciloscópio. No meu entendimento deveriam ter a mesma forma e quando a primeira estivesse ativa a segunda estaria desativada e vice-versa.

Imagem
By no_fear_666999 at 2011-03-20
[/img][/b]

talvez tenha sido o fato de utilizar portas lógicas ao invés de chaves analógicas.
tem alguma forma de melhorar o código?
HELP
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor fabim » 21 Mar 2011 07:46

itamar, voce ta cometendo um erro grave....

Esse negocio de eu acho que não vai dar tempo, ou vai desviar a atenção...

Você ta achando que o pic é algum DKV ? larga mão meo.....

Estes sensores que ele não pode desprender a atenção são tipo um pino em uma porta ? ou é algum NTC etc, que precisa usar o ADC pra poder testar e tomar atitude ?

Vou clarear suas idéias,...
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor MOR_AL » 21 Mar 2011 08:58

andre_teprom escreveu:
MOR_AL escreveu:...você só garante um controle estável com um sistema PID...


Uma alternativa para isso seria mudar gradualmente o Duty-cicle do PWM ( em passos fixos ou variáveis ) a cada interrupção, ao invéz de simplesmente recarregar o valor tabelado para a temperatura final desejada.

+++


Olá André!
Pelo que eu entendi, você está considerando uma tabela duty-cicle x temperatura final, né!? Nesse caso não haveria realimentação e PID.
Isso poderia levar a um overshoot.
Por outro lado, entendi que, ao invéz de colocar o duty-cicle correspondente à temperatura final, você incluiria duty-cicles correspondentes à temperaturas intermediárias. Aí, como o sistema ficaria mais lento, as chances de ocorrerem overshoots seriam reduzidas. É isso?
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor itamar » 21 Mar 2011 09:27

e aí... alguma sugestão ou crítica à "solução" que tentei implementar???
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor EDSONCAN » 21 Mar 2011 09:53

Quando faziamos controle de fornos usado eletronica analogica e malha aberta usavamos o 2n2646 gerando um dente de serra.

Essa rampa era aplicada a um comparador que fazia a vez colocar em ON ou OFF os transistores ( na epoca não tinha Mosfet).

Não sei se essa ideia ajuda.

Edson
EDSONCAN
Word
 
Mensagens: 876
Registrado em: 11 Out 2006 14:11

Mensagempor jack sparrow » 21 Mar 2011 10:03

Oi Itamar,

Não entendi porque você usou um PIC com 2 PWM's se precisava de 3,
dá uma olhada no datasheet do PIC16F1936.
jack sparrow
Bit
 
Mensagens: 25
Registrado em: 25 Jul 2007 01:02

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x