Página 1 de 2
Conversão A/d e interrupções

Enviado:
25 Mai 2011 20:48
por itamar
olá galera.
Queria saber se existe como gerar uma interrupção cada vez que houver uma mudança na entrada analógica.
Basicamente o que eu quero é que sempre que o valor da tensão mude, o pic desvie o que está fazendo e trate uma determinada rotina.
tudo isso sem que haja necessidade de realizar uma leitura periódica do canal AD, por exemplo por meio de um loop while, que é o que tenho visto quando queremos ver, por exemplo, a leitura de um sensor em um LCD .

Enviado:
25 Mai 2011 21:22
por MOR_AL
Bom.
Pelo que eu sei, para o PIC (ou qualquer micro) detectar uma alteração na entrada analógica, só mesmo medindo. Ele só vai saber se alterou, se comparar a leitura anterior, ou a última guardada, com a leitura atual. Isso acarreta em manter o loop.
Não imagino como poderia ser uma lógica que leia a entrada analógica, sabendo que ela alterou; antes de lê-la.
Talvez com um circuito externo ...
... Me veio agora uma dica ...
Se o seu PIC tiver comparador analógico, entre com o sinal em uma das entradas e na outra coloque um filtro passa-baixa (um RC). Quando houver mudança, tal que a tensão em uma das entradas cruze a tensão da outra, haverá um pulso na saída.
Faça o mesmo com um segundo comparador. Só que desta vez com as entradas invertidas em relação ao primeiro. Assim você detecta tanto alteração para mais como para menos.
Bom.
Como você não comentou minha postagem, editei porque imaginei que você não entendeu o que eu postei.
No circuito abaixo, há mudança na saída dos comparadores, toda vez que a entrada altera mais de 10% do seu valor. Se você desejar uma mudança mais sensível, troque o resistor de 10R para 100R.
MOR_AL

Enviado:
26 Mai 2011 08:47
por andre_luis
Itamar
Voce pode pensar em utilizar uma entrada digital que possua interrupção de I/O por borda.
Porém fica restrito ás seguintes condições :
> O nível para disparo dessa interrupção será sempre o mesmo.
> Se a capacidade de corrente da sua entrada analógica não for baixa terá de bufferizar ( tipo..AmpOp )
> Se a precisão necessária for muito alta a entrada digital poderá propagar algum ruído da alimentação digital para a entrada analógica - que agora estarão conectadas.
+++

Enviado:
26 Mai 2011 10:57
por Red Neck Guy
Daria pra usar os comparadores como trigger pra o evento de mudança de nível... Porém, seria necessários alguns componentes...

Enviado:
26 Mai 2011 20:20
por andre_luis
Aquino escreveu:Daria pra usar os comparadores como trigger pra o evento de mudança de nível... Porém, seria necessários alguns componentes...
Mas seriam só 2 resistores Aquino...
Bem lembrado. Tem PIC que tem comparador interno. Além disso tem alta impedancia de entrada; o que não atrapalharia o A/D.
+++

Enviado:
26 Mai 2011 20:31
por itamar
andre_teprom escreveu:Itamar
Voce pode pensar em utilizar uma entrada digital que possua interrupção de I/O por borda.
Porém fica restrito ás seguintes condições :
> O nível para disparo dessa interrupção será sempre o mesmo.
> Se a capacidade de corrente da sua entrada analógica não for baixa terá de bufferizar ( tipo..AmpOp )
> Se a precisão necessária for muito alta a entrada digital poderá propagar algum ruído da alimentação digital para a entrada analógica - que agora estarão conectadas.
+++
desculpa pela minha ignorância mas eu não entendi como poderia utilizar uma interrupção em uma porta digital para monitorar uma variação analógica. pelo que me lembro existe uma referência minima de tensão para que o micro reconhrça os níveis lógicos por exemplo até 2,5--->0 e maior que isso --> 1. se for assim não resolve, pois quero que o micro detecte por exemplo 0,1V em cima de um potenciometro.

Enviado:
26 Mai 2011 20:32
por itamar
andre_teprom escreveu:Aquino escreveu:Daria pra usar os comparadores como trigger pra o evento de mudança de nível... Porém, seria necessários alguns componentes...
Mas seriam só 2 resistores Aquino...
Bem lembrado. Tem PIC que tem comparador interno. Além disso tem alta impedancia de entrada; o que não atrapalharia o A/D.
+++
Posta aew um esquema dos triggers para ver se eu consiigo entender como eles me ajudariam

Enviado:
26 Mai 2011 21:01
por andre_luis
Itamar
Como sugerido pelo aquino e como dito anteriormente...alguns modelos de PIC possuem módulo comparador embutido.
Ao menos os PICs que conheço possuem 2 desses módulos.
Os 2 comparadores poderiam ser usados para estabelecer o valor máximo e mínimo de comparação; e assim qualquer coisa fora dessa janela seria detectado.
Posso estar enganado...mas também há interrupção para esse comparador.
Espero que essas informações o ajudem a resolver o problema.
+++

Enviado:
26 Mai 2011 21:19
por Red Neck Guy
Assim, liga os dois comparados no mesmo sinal, porém, ligando o sinal na entrada positiva de um e negativa do outro.
No inicio dos tempos, configura a referência deles pra 0, digamos assim. Dessa forma irá ocorrer uma interrção por mudança de estado - não lembro se o pic gera essa int, os msps e hcs08 geram...
Assim dentro da int, tu mede o nível dessa tensão com o adc e seta a referência dos comparadores pra esse valor, assim quando mudar ocorrerá outra interrupção.
Como fazer pra mudar a referência se a ref interna é de baixa resolução?
Usando um DA feito com um filtro de segunda ordem e um sinal PWM, ou utilizando uma rede R2R, ou utilizando um CI pra isso. Mas sei lá, saí caro...
Mas eu só faria isso tudo, se por algum motivo muito especial, esse tipo de aquisição fosse necessário, pois saí muito mais barato ficar fazendo amostragem da tensão...

Enviado:
26 Mai 2011 21:37
por andre_luis
Aquino
Essa idéia de programar o limiar de comparação por firmware também é muito interessante.
Acredito que se a histerese de comparação for maior que a amplitude do ripple gerado pelo PWM filtrado...isso solucionaria.
+++

Enviado:
27 Mai 2011 07:35
por ze
mas um loop principal é obrigratório. voce pode encaixar sua comparação nele uai. a não ser que vá dormir.
voce pode fazer por leitura de ad dentro de uma interr por timer. neste caso fica fora do loop. algo como
int adantigo,adnovo;//global
static bit tg;
...
void interrupt timer0(){
if (tg) adatingo=readadc();
else adnovo=read(adc);
if (adnovo!=adantigo) façaisso(); //sua falsa interrupção
tg^=1;//um ad a cada passada pela interr
...
}
pensando bem isso num deve dar muito certo. mas sei lá... fica anotado aí.
abç

Enviado:
27 Mai 2011 08:32
por luisf.rossi
Para baixa resolução e uma bw ridiculamente baixa você poderia mudar os taps da referencia do comparador "on-the-fly". Isso seria uma mega gambiarra e vai te dar poucos niveis de variação.... mas é simples de se fazer. A ideia do PWM é muito boa, mas mesmo assim ainda teria o tempo de acomodação do filtro.. o que reduz a banda.. mas tem resultados infinitamente melhores do que com apenas os taps internos... Mas existe algum motivo para todo esse trabalho? Se você tiver DMA você pode criar um buffer com duas posições e sempre que der (mais rapido que o AD) comparar as duas. Isso seria um gasto ridiculo de instruções...
Abs

Enviado:
27 Mai 2011 09:00
por andre_luis
luisf.rossi escreveu:...A ideia do PWM é muito boa, mas mesmo assim ainda teria o tempo de acomodação do filtro...
Luis
Concordo contigo. Mas, o próprio firmware pode realizar a medição após esse tempo de acomodação. A frequencia do PWM pode ser bem alta ( KHz ) e a constante do filtro também terá um valor baixo.
Outra opção é estabelecer o período de medição após o um intervalo de T= (K)R.C ( K por exemplo 0.5 ) -> Supondo um filtro de 1a ordem.
Ou seja, como opções o programa pode, ou esperar a nova tensão filtrada atingir um limiar assintótico para o novo valor, ou considerar essa diferença por firmware.
Esse segundo caso teria de tomar bastante cuidado, pois essa compensação deveria ser multiplicada pela diferença de Duty-cicle do PWM. Assim o valor medido não seria exatamente a tensão estabilizada. Seria lida num tempo inferior á constante do filtro.
Enfim. Como se diz :
"
Por firmware é possível corrigir qualquer deficiencia do Hardware".
+++

Enviado:
28 Mai 2011 08:05
por itamar
MOR_AL escreveu:Bom.
Como você não comentou minha postagem, editei porque imaginei que você não entendeu o que eu postei.
No circuito abaixo, há mudança na saída dos comparadores, toda vez que a entrada altera mais de 10% do seu valor. Se você desejar uma mudança mais sensível, troque o resistor de 10R para 100R.
É, realmente não havia entendido a idéia... mas agora que entendi me parece ótima, genial, fenomenal, vou testar e ver se resolve meu problema.
Valew mesmo

Enviado:
28 Mai 2011 15:52
por MOR_AL
itamar escreveu:MOR_AL escreveu:Bom.
Como você não comentou minha postagem, editei porque imaginei que você não entendeu o que eu postei.
No circuito abaixo, há mudança na saída dos comparadores, toda vez que a entrada altera mais de 10% do seu valor. Se você desejar uma mudança mais sensível, troque o resistor de 10R para 100R.
É, realmente não havia entendido a idéia... mas agora que entendi me parece ótima, genial, fenomenal, vou testar e ver se resolve meu problema.
Valew mesmo
Quando não entender, pergunte! Afinal ninguém nasceu sabendo e estamos aqui para trocarmos experiências.
Tomara que dê certo! É quase garantido! Usei esta técnica para detectar onda quadrada com alguns milivolts, proveniente de um amplificador de transimpedância (entra corrente e sai tensão) conectado a um fotodiodo.
Só complementando...
A saída dos comparadores também retorná ao seu estado inicial, após algum tempo depois da alteração, devido à mudança na entrada. É uma falsa alteração na entrada. Quando isso ocorrer, você deve saber identificar e descartar o tratamento.
É o caso de transição positiva no comparador de cima e transição negativa no comparador de baixo.
MOR_AL