Controle de temperatura por PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor itamar » 19 Mar 2011 18:06

andre_teprom escreveu:
...Ótima ideia, mas como faço a comutação física?...


itamar,

Esse componente pode ser uma chave analógica comum, cuja especificação sugira por exemplo "relay replacement", como esta abaixo :
http://datasheets.maxim-ic.com/en/ds/MA ... AX4660.pdf
Estas chaves são comumente usadas em circuitos digitais.
Imagem

...como seria o código fonte? teria que tratar como uma interrupção certo? e nesse caso como ficam as leituras dos sensores e a exibição das menssagens no LCD?...


No caso, vai depender de como foi implementado.
De qualquer modo, como boa prática de programação, a estrutura do código deve ser implementada em camadas, e essa abstração permite que o restante do programa seja indiferente á essa função de chaveamento.

+++

caro andre_teprom, gostei da idéia de comutar o PWM. na verdade até havia pensado antes e tentei fazer isso, mas como eu tenho que chamar uma função tipo "comute para PWM 1" e após algum tempo(antes da outra resistência esfriar) chamar outra "comute para PWM 2" eu faço com que o PIC "esqueça" de gerenciar os sensores(que não estão ligados ao RB0/int e por isso não podem gerar um interrupção com mais prioridade). como eu deveria fazer pra comutar esse PWM por soft sem fazer com o PIC esqueça do "dever" dele ?
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor _blackmore_ » 19 Mar 2011 18:07

blz. .. eu não imaginei que estivesse neste ponto o projeto.
:)
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor fabim » 19 Mar 2011 18:15

nossa mais uma simples chamada para pwm ?
RB0 = interrupt..

C ta fazendo por interrupt ?

Se sim,

Tu pode fazer uma maquina de estados dentro da interrupt do timer 0 por exemplo, e mandar mensagens por semaforos .,...

Isso funciona putamente bem no arm..
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 itamar » 19 Mar 2011 18:28

fabim escreveu:nossa mais uma simples chamada para pwm ?
RB0 = interrupt..

C ta fazendo por interrupt ?

Se sim,

Tu pode fazer uma maquina de estados dentro da interrupt do timer 0 por exemplo, e mandar mensagens por semaforos .,...

Isso funciona putamente bem no arm..


então vamos lá, AJUDE A RESOLVER!
O PIC que to utilizando só tem 2 módulos PWM(não posso mudar de PIC e nem quero adicionar outros CI's ao circuito ) e preciso controlar a potência entrege a 3 resistências utilizando PWM e a leitura do canal AD.
isso já pronto pro caso de 2 resistências e 2 potêciometros. como eu faço então para gerar o PWM da terceira resistência sem fazer com que o pic deixe de monitorar alguns ( 8 ) míseros sensores?


fabim escreveu:
RB0 = interrupt..


essa interrupção é externa e tá sendo utilizada para uma parada de emergência (pra não pegar fogo no troço)
Editado pela última vez por itamar em 20 Mar 2011 10:16, em um total de 1 vez.
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor andre_luis » 19 Mar 2011 19:34

itamar,

Algum custo terá de ser administrado.

Ou adiciona elementos externos além do que voce havia previsto, ou voce sobrecarrega o processamento da CPU implementando o PWM via firmware.

Quando voce diz "...antes da outra resistência esfriar...", significa uma capacidade térmica além de 10Hzx2 ? ( isso porque na sugestão inicial foi metade do ciclo do Timer para cada resistencia ). Como voce mesmo disse, não se trata de um controle em malha fechada, e portanto a precisão irá cair. Em 20Hz a temperatura irá cair tanto assim ?

Se for o caso, ou voce terá de compensar o limiar de decisão da sua função "termostato", ou colocar mecanicamente na junção sensor / resistencia, algum material que tenha uma alta capacidade térmica, afim de ajir como um filtro PI ( Proporcional-Integral ) no seu controle.

Seguinte : Para voce calibrar o valor inicial do PWM, teria de primeiro definir o duty-cicle para a resistencia compartilhada, operando em modo exclusivo ( ou seja, fixando a saída do Timer para essa resistencia ), e depois multiplicar por 2 esse valor, já que no modo compartilhado estaria acionando a resistencia na metade do tempo.

A propósito : Se a aplicação em que voce está trabalhando não envolver sigilo, acho que seria o caso de voce informar em que está trabalhando, pois existe a possibilidade de alguem aqui já ter feito algo semelhante e dar algum palpite mais preciso.

+++
Editado pela última vez por andre_luis em 19 Mar 2011 19:38, em um total de 1 vez.
"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 fabim » 19 Mar 2011 19:37

uai meo..
Pwm via software, com interrupt...

PWM1 e 2, utilizam timer 1 e 2, e seus respectivos matchs..

não sei qual sua frequencia de pwm, mais isso pra fazer no TMR0 é papinha de nenem, e ainda pode aproveitar a saida do timer para pegar um port com os 8 sensores, e jogar cada um na sua devida posição em uma estrutura.. Isso se o sensor for tipo Xon/Xoff, se for com tensão variavel pode colocar a rotina com o resultado em um ponteiro...

ponteiro[posicao] = leia adc..
inc(posicao);
SE posição > 7 posicao = 0;

lá no main, nas maquinas de estado.

Tu fica fazendo os testes, se maior menor igual, o que deve fazer o que não deve fazer etc..

Tu ta preocupado ai,com deixar de observar isso ou aquilo outro..
P**** , que carai de função que tem que ser tratada dentro de 100uS ? por exemplo ?..

Não se preocupe com esse negocio de deixar de tratar sei lá o que...

No main.,

while 1

faz um

faz dois

faz trez
end

e ler adc, testar um botão, tomar uma atitude de desligar pwm,gerar o pwm , ou sei lá o que, tu soca tudo lá no interrupt do timer!!!

eu mesmo aqui no meu projeto de equipo medico..
Criei uma maquina de estados no main.
Como ja diz, o que rege isso é um valor para o switch, que só muda com seu semaforo verde , fora isso , esta maquina de estados fica em cada volta pelo while executando apenas aquela determinada rotina...

Só que os ADCS, botões, touch screem, sensor SPo2, chave incremental, e tudo mais, tudo por interrupt..
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 Silvio51 » 19 Mar 2011 19:45

Além do que você pode usar um PIC para cada resistência... suponho que não seja um projeto em larga escala e apenas "um" dispositivo para atender uma emergência.... pois se fôsse para usa comercial, temos diversos produtos prontos no mercado a um preço pequeno.
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil

Mensagempor itamar » 19 Mar 2011 19:59

fabim escreveu:uai meo..
Pwm via software, com interrupt...

PWM1 e 2, utilizam timer 1 e 2, e seus respectivos matchs..

não sei qual sua frequencia de pwm, mais isso pra fazer no TMR0 é papinha de nenem, e ainda pode aproveitar a saida do timer para pegar um port com os 8 sensores, e jogar cada um na sua devida posição em uma estrutura.. Isso se o sensor for tipo Xon/Xoff, se for com tensão variavel pode colocar a rotina com o resultado em um ponteiro...

ponteiro[posicao] = leia adc..
inc(posicao);
SE posição > 7 posicao = 0;

lá no main, nas maquinas de estado.

Tu fica fazendo os testes, se maior menor igual, o que deve fazer o que não deve fazer etc..

Tu ta preocupado ai,com deixar de observar isso ou aquilo outro..
P**** , que carai de função que tem que ser tratada dentro de 100uS ? por exemplo ?..

Não se preocupe com esse negocio de deixar de tratar sei lá o que...

No main.,

while 1

faz um

faz dois

faz trez
end

e ler adc, testar um botão, tomar uma atitude de desligar pwm,gerar o pwm , ou sei lá o que, tu soca tudo lá no interrupt do timer!!!

eu mesmo aqui no meu projeto de equipo medico..
Criei uma maquina de estados no main.
Como ja diz, o que rege isso é um valor para o switch, que só muda com seu semaforo verde , fora isso , esta maquina de estados fica em cada volta pelo while executando apenas aquela determinada rotina...

Só que os ADCS, botões, touch screem, sensor SPo2, chave incremental, e tudo mais, tudo por interrupt..



Desculpe mas não entendi o que vc disse.
E também acho que vc não me entendeu... fazer com o pic faça testes "if bla bla bla" vai desviar a "atenção" dele pq ele deve esperar que algum dos sensores informe que ele deve tomar uma decisão, pois este é o firm. que já está implementado e FUNCIONA perfeitamente, novamente repito o problema é adicionar o PWM 3 .
Quanto aos 100ms acho que não gostaria de esperar esse tempo pra que o PIC decida se meu dedo é ou não importante rsrsrsr.
mas de qualqer forma Valew pela idéia
Editado pela última vez por itamar em 20 Mar 2011 10:19, em um total de 1 vez.
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor itamar » 19 Mar 2011 20:11

andre_teprom escreveu:itamar,

Algum custo terá de ser administrado.

Quando voce diz "...antes da outra resistência esfriar...", significa uma capacidade térmica além de 10Hzx2 ? ( isso porque na sugestão inicial foi metade do ciclo do Timer para cada resistencia ). Como voce mesmo disse, não se trata de um controle em malha fechada, e portanto a precisão irá cair. Em 20Hz a temperatura irá cair tanto assim ?
.
.
.
A propósito : Se a aplicação em que voce está trabalhando não envolver sigilo, acho que seria o caso de voce informar em que está trabalhando, pois existe a possibilidade de alguem aqui já ter feito algo semelhante e dar algum palpite mais preciso.
ah... e como eu já disse essa resistência é de um HOT STAMP com outras 2 para corte.

+++

O unico problema que vi na sugestão de comutar o PWM é que o PIC teria que designar uma parte do tempo pra isso. então vamos falar em termos mais claros: digamos que a resistência 1 após aquecida demore 1 segundo pra cair a temp além do tolerável mas a resistência 2 pode levar mais de 1s pra aquecer logo, as duas vão esfriar com erros cumulativos. Porém, se eu dedicar 100ms pra aquecer R1 e 100ms pra aquecer R2 duas coisas podem acontecer:
1 - se o tempo que R1 levar aquecer(ainda não medi) for grande, o PIC perde tempo e a interrução ou a mudança de algum sensor pode acontecer.
2 - se eu restringir muito o tempo o PIC terá que ficar preso nesse "laço" de comutação e também poderá perder algum sensor.
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor andre_luis » 19 Mar 2011 21:28

itamar escreveu:...O unico problema que vi na sugestão de comutar o PWM é que o PIC teria que designar uma parte do tempo pra isso...


Não...A sinalização para essa ação de comutação seria feita pela interrupção do Timer.

itamar escreveu:...as duas vão esfriar com erros cumulativos...


Isso significa que se deve pensar numa abordagem de controle em malha fechada, tipo com sensores de temperatura para isso.
Dependendo da aplicação, até daria pra conviver com esse controle em malha aberta, pois a velocidade de resfriamento é proporcional ao gradiente de temperatura, e assim a temperatura atingiria o equilíbrio num limiar assintótico.

Porém, como não sabemos do que se trata, voce terá de avaliar a situação e decidir.

+++
"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 » 19 Mar 2011 22:20

itamar escreveu: ... valew mesmo pelas idéias MOR_AL ... acho que a implementação da sua idéa(que particularmente achei excelente) seria muito complicada pra mim, tendo em vista meus conhecimentos nesse momento.


... Mas Itamar, eu postei a "Receita de Bolo", passo-a-passo para chegar à constante de tempo do seu sistema (Tal)! Na realidade nem precisa da equação. Esqueça ela. Basta medir as 10 temperaturas, colocar em um gráfico e verificar qual o tempo que corresponde a 63% da variação do gráfico.
Verifique novamente. Agora pulando a parte da equação, que você poderá chegar ao seu período do PWM e acompanhe as instruções na figura.

Imagem

O único timer apenas informará o momento de monitorar cada uma das tres temperaturas. Uma vez com esses tres valores, você poderá comparar com as temperaturas desejadas e alterar o delta de cada uma delas. Acredito que vai dar tempo de sobra para outras tarefas.
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 » 20 Mar 2011 10:11

andre_teprom escreveu:
itamar escreveu:...O unico problema que vi na sugestão de comutar o PWM é que o PIC teria que designar uma parte do tempo pra isso...


Não...A sinalização para essa ação de comutação seria feita pela interrupção do Timer.

+++
.

agora acho que sou eu que não estou entendendo mais.
vejamos, quando ocorrer a interrupção terei que tratá-la e limpar os flags etc.
supondo que a comutação deva ocorrer com uma taxa de 20Hz cada vez que o TIMER estourar (20 vezes em cada segundo) será chamada a rotina para tratar a interrupt que, pela sua própria natureza, é uma prioridade e faz com que o uC deixe o que está fazendo pra tomar a decisão da interrupt certo? e após o término da rotina de interrupt ele recupera na pilha o endreço de onde estava e volta ao serviço ok.
Minha pergunta é:
Tem como gerar algum tipo de clock num pino utilizando o TIMER sem fazer com que o PIC fique empacado nesta ação.
pergunto isso pois veja um exemplo de como eu faria utilizando C no CCS.


#INCLUDE <16F877.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use standard_io(B)

#int_TIMER0
void TIMER0_isr(void) {
output_toggle(PIN_B0);
set_timer0 (0x1B); } //carga de tempo no TIMER
void main() {
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);//configuração do TIMER

set_timer0 (0x1B);
enable_interrupts(INT_TIMER0);
enable_interrupts(global);
\\
\\
\\aí vai fazendo coisas até "bum" estourar o TIMER0
\\
\\
while (1);
}
// da forma como está aí, gera um pulso de 1kHz e 50% de duty cicle
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor andre_luis » 20 Mar 2011 10:28

Tem como gerar algum tipo de clock num pino utilizando o TIMER sem fazer com que o PIC fique empacado nesta ação ?

Agora, fui eu que não entendi a sua dúvida.

O Toogle do pino é executado apenas uma vez por interrupção.
Além disso, voce é que está "amarrando" o seu programa num loop infinito no final do main - while(1) - sem monitorar e/ou controlar qualquer coisa.

Lembrando que no tratamento da interrupção do Timer, voce teria de também reparametrizar o módulo PWM, um na subida, outro na descida.
( Mas vamos considerar que voce ainda não está testando essa parte )

+++
"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 » 20 Mar 2011 10:35

andre_teprom escreveu:itamar,

Algum custo terá de ser administrado.
.
.
.
A propósito : Se a aplicação em que voce está trabalhando não envolver sigilo, acho que seria o caso de voce informar em que está trabalhando, pois existe a possibilidade de alguem aqui já ter feito algo semelhante e dar algum palpite mais preciso.

+++
.
Ok quanto ao custo já tô sabendo... pensei em colocar uma placa a parte com um 555 e seu respectivo potenciômetro somente com o enable ligado ao PIC.
Quanto ao sigilo(rsrsrs) eu já postei nas entrelinhas de outra msg que é um datador Hot Stamp de uma máquina. As outras resistências são os filamentos de corte da mesma. O controle antigo era feito por um reostato de fio, "gigante" (nada inteligente). Ele aquecia além das resistências a si próprio e gastava bastante energia.Por isso sugeri implementar por PWM ok.
Abraços
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Mensagempor itamar » 20 Mar 2011 10:45

O Toogle do pino é executado apenas uma vez por interrupção.
Além disso, voce é que está "amarrando" o seu programa num loop infinito no final do main - while(1) - sem monitorar e/ou controlar qualquer coisa.
+++
.
Ok, na verdade não é pra ser um toggle...mas sim:
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).

Quanto ao while(1) foi só pro caso de algém querer compilar e verificar o sinal de 1kHz no pino.
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x