Usar 2 AD e 2 PWM distintos ..

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Usar 2 AD e 2 PWM distintos ..

Mensagempor _blackmore_ » 29 Mai 2009 00:25

Pessoal, boa noite.

Estou com uma problema na implementação de leitura de 2 AD´s e controlar 2 PWM de um PIC16F876A ... como não sou experiente ou grande conhecedor como muitos do fórum fico enrolado qdo preciso de algum software mais elaborado.
O que acontece .. eu até consigo fazer duas leituras independentes ... mas quando coloco no próprio programa que a diferença entre AD1 e AD2 deve ser o duty dos PWM ... e um inverso ao outro ... ou seja enquanto o ccp1 será por exemplo 25% de Ton no ccp2 será 75% Toff ...

Segue um fragmento do loop ... a parte de ligar o PWM é que estou na dúvida se preciso de fazer algo mais (ou de outro jeito) do que tem ali para trabalhar certo pq assim não vai ...

Agradeço aos amigos que puderem me esclarecer ...

Código: Selecionar todos
   while (true)                     // Repetição
   {


      set_adc_channel(0);
      AD1=read_adc();          
      delay_us(20);
      AD1=((AD1+1)*50/1024);

      lcd_pos_xy(5,1);      
      printf (lcd_escreve,"%2.1f",AD1);

      set_adc_channel(1);
      AD2=read_adc();                             delay_us(20);
      AD2=((AD2+1)*50/1024);

      lcd_pos_xy(5,2)
      printf (lcd_escreve,"%2.1f",AD2);


      ciclo1 = AD1 ;                set_pwm1_duty (ciclo1);

      ciclo2 = AD2 ;                set_pwm2_duty (ciclo2);


   }
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor fabim » 29 Mai 2009 08:43

ta sei, esta bem compreensivel o seu fonte.
MAis diga lá. O seu PWM está setado para 8bits ?!!
Caso não, e esteja para 10 bits, o seu compilador é capaz de decidir quando está a 8 ou a 10 e manipular a 10 ou a 8 ?

E outra você esta simplesmente calculando o resultado do ADC de forma a ficar com valor inteiro de 0...50.Seler 512 = 25, se ler 1024 = 50.
Ou seja, qualquer um dos resultados vai setar os pwm´s com no maximo o valor 50. = +/- 19.7% máximo de Ton.

Não se esqueça que a setagem do pwm = peso binário de 0...255 no caso de 8 bits, 0....1024 no caso de 10 bits.

Bom, foram só algumas observações.
Mais me ispricanha direitinho como deveria funcionar na pratica, só pra eu ter certeza antes de postar a solução.

Braços por trazzz{}.

Fabim
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 gastao » 29 Mai 2009 21:26

Caro Blackmore,

Teste colocar um delay de no mínimo 20Us após mudar a seleção de um canal. Este delay é necessário para estabilizar o mux de entrada e a tensão no capacitor do S/H.
Então fica assim :

set_adc_channel(0);
delay_us(20);
AD1=read_adc();
AD1=((AD1+1)*50/1024);

lcd_pos_xy(5,1);
printf (lcd_escreve,"%2.1f",AD1);

set_adc_channel(1);
delay_us(20);
AD2=read_adc();
AD2=((AD2+1)*50/1024);

lcd_pos_xy(5,2)
printf (lcd_escreve,"%2.1f",AD2);

Grande Abraço,
Gastão.
gastao
Bit
 
Mensagens: 10
Registrado em: 20 Mai 2009 09:52

Mensagempor _blackmore_ » 29 Mai 2009 23:51

fabim

MAis diga lá. O seu PWM está setado para 8bits ?!!

está para 10 bits , estou usando o compilador CCS.

E outra você esta simplesmente calculando o resultado do ADC de forma a ficar com valor inteiro de 0...50.Seler 512 = 25, se ler 1024 = 50.
Ou seja, qualquer um dos resultados vai setar os pwm´s com no maximo o valor 50. = +/- 19.7% máximo de Ton.


quanto ao valor inteiro estou ciente ... é o que eu preciso "ver"

Quanto a ispicanhar ... vamos lah ...
Preciso controlar rotação de um motor AC 220V ... e o aquecimento de resistências tb em AC 220V ... tudo isso acionado por MOC e Triac.
O que acontece que preciso fazer o período estar nos 60Hz da rede ... e o MOC já faz o controle de passagem por zero direto ... e o PIC "diz" o quanto vai ficar ligado dentro dos 60Hz ... nada demais, mas 2 controles com o mesmo PIC eestou penando .. hehe

gastao

bixo .. dah uma olhada direitinho .. coloquei no meu código esse tempo de carga do capacitor... não sei o que aconteceu mas quando postei a mensagem o código deu uma distorcida.
Mesmo assim valeu pelo coments ...

abrax!

[/b]
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor gastao » 30 Mai 2009 00:19

Caro Blackmore,

Volto a insistir que faças um teste.
O seu delay foi colocado sim, porém depois da conversão.

Veja bem :

set_adc_channel(0); // seleciona a mux analógico e a tensão chega ao capacitor ( a chave do S/H é normal fechada )

delay_us(20); // Aguarda a comutação do mux estabilizar e a carga ou descarga do capacitor espelhar a tensão de entrada. Este é o delay mínimo e depende da impedância do sinal a ser medido. Veja o datasheet a fórmula para seu cálculo.

AD1=read_adc(); // Abra a chave do S/H e faz a conversão AD.

// Aqui a conversão já aconteceu.


Grande Abraço,
Gastão.
gastao
Bit
 
Mensagens: 10
Registrado em: 20 Mai 2009 09:52

Mensagempor fabim » 30 Mai 2009 00:47

meo, como é o negócio aí ?
Controlar angulo de fase com pwm ? e usando moc ?
De onde tu tirou isso?

:lol:
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 proex » 30 Mai 2009 08:40

O Gastão esta certo heim, se não colocar o delay depois de selecionar o canal A/D, bagunça tudo a leitura.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor _blackmore_ » 30 Mai 2009 10:30

proex e gastão

Amigos, realmente vocês estão certos, eu vi mas não enxerguei !! vou trocar a posição do delay no programa ... muito obrigado pela observação. :)

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor fabim » 30 Mai 2009 19:00

_blackmore_ escreveu:fabim

MAis diga lá. O seu PWM está setado para 8bits ?!!

está para 10 bits , estou usando o compilador CCS.

E outra você esta simplesmente calculando o resultado do ADC de forma a ficar com valor inteiro de 0...50.Seler 512 = 25, se ler 1024 = 50.
Ou seja, qualquer um dos resultados vai setar os pwm´s com no maximo o valor 50. = +/- 19.7% máximo de Ton.


quanto ao valor inteiro estou ciente ... é o que eu preciso "ver"

Quanto a ispicanhar ... vamos lah ...
Preciso controlar rotação de um motor AC 220V ... e o aquecimento de resistências tb em AC 220V ... tudo isso acionado por MOC e Triac.
O que acontece que preciso fazer o período estar nos 60Hz da rede ... e o MOC já faz o controle de passagem por zero direto ... e o PIC "diz" o quanto vai ficar ligado dentro dos 60Hz ... nada demais, mas 2 controles com o mesmo PIC eestou penando .. hehe


gastao

bixo .. dah uma olhada direitinho .. coloquei no meu código esse tempo de carga do capacitor... não sei o que aconteceu mas quando postei a mensagem o código deu uma distorcida.
Mesmo assim valeu pelo coments ...

abrax!

[/b]


rham rham,,,, explica isso aí direitinho, só pra eu não ficar rindo de você, as vezes a aplicação não é apenas 1 moc com zero crossing, com o led de atuação sendo controlado por pwm....

fabim
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 _blackmore_ » 30 Mai 2009 21:18

fabim

explica isso aí direitinho, só pra eu não ficar rindo de você,

é normal rir ... :)
o que eu quero fazer ... controlar a velocidade de um motor AC e controlar o aquecimento de uma resistência ... só isso ... em DC eu consegui fazer, porém no AC eu ainda não fiz ... penso que seja necessário ter um PWM em 60 Hz e definir o dutycicle com um AD do PIC ... dae o MOC para ativar o Triac ... mas vou ver se hoje espeto na protoboard e ver o que dá ... vai que não é necessário tudo isso ... ou necessário mais coisa ...

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor jorgeluiz » 30 Mai 2009 22:47

Quanta confusao! Se uma saida e' inversa uma da outra porque nao usa simplesmente um INVERSOR na saida? Pode ser um 4050, ou um bc da vida, emissor comum. Ela "desvira" o sinal, transfomando seus 25% em 75%, sem sofrimento.
Avatar do usuário
jorgeluiz
Byte
 
Mensagens: 448
Registrado em: 26 Mar 2007 02:26

Mensagempor _blackmore_ » 30 Mai 2009 22:55

jorgeluiz

humm ... é uma boa mesmo ... valeu a dica !!!

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor fabim » 31 Mai 2009 17:51

buga buga!! mim entendeu agóra sobre o AC.

1° - o moc não pode ser com zero crossing.
R>: pois vamos trabalhar com disparo do triac em angulo de fase e o zero crossing só dispara quando a tensão estiver bem pertinho da passagem por zero, coisa de uns 7..15V dependendo do modelo.

Pensando no lado pratico.
Cada semi ciclo tem 8.333mS.
Bole alguma coisa assim ó!.
Leia o ADC em 10 bit´s * 4.
Tipo.
_u int motor;
_u int estouro;

motor = adc_read(x)*4;
minimo valor = 0, máximo valor = 4096.

agora raciocine assim, lógico que tem que haver alguns acertos no tempo por causa da tensão de detecção de passagem por zero.

Passou por zero, espera 1/2 de meio ciclo.

imagina agora um delay_us((-4096)+motor);//inverti a logica.

Você vai escursionar o brilho da lamada proporcionalmente de 0 a 100%.

Se não fui muito claro, pode perguntar.

Fabim
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 _blackmore_ » 31 Mai 2009 19:24

fabim

acho que entendi o que tu demonstrou ... porém uma coisa ficou confusa para mim ... se não posso usar o MOC com zero crossing pq tu diz mais a baixo que espera um X tempo qdo passar por zero ???

de resto acho q entendi ... vou fuçar amanhã .. estou sem scope hoje .. humpt ... :?

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor fabim » 31 Mai 2009 20:54

opa, é que eu esqueci de colocar.
Tu precisa de um opto diac, coisa do tipo, só por isto.. :)
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!!!?


Voltar para PIC

Quem está online

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

x