Ir ao conteúdo
  • Cadastre-se

Duvida! como controlar um led RGB com PWM?


Ir à solução Resolvido por YODA.,

Posts recomendados

Pessoal tinha achado no google um video que ensinava isso mais perdi e procurei ,procurei ...

mais tem hora que de tanto você fica no computador e não achar irrita ,

sei que o PWM funciona com o timer2 já é para mim um pequeno passo ,

se não fo incomodar , Alguem posta um exemplo desses pra mim por favor !!so pra alterar a luminozidade do led RGB

ou com três leds mesmo esta otimo!!

na verdade eu preferia com três leds coloridos OK!  e Obrigado!!

Link para o comentário
Compartilhar em outros sites

Existe um pequeno problema... o PIC em geral possui 1 canal de saida PWM, 3 no máximo, porém se bem me lembro não da pra utilizar os três módulos CCP ao mesmo tempo no mesmo modo (ou seja os três em PWM).
 

Eu tenho uma nota de aplicação bem antiga da Microchip, que ensina a fazer PWM por software em PICs pequenos exclusivamente para Leds RGB, mas ja vou adiantando, terá que ler o documento de ponta a ponta, segue o link do PDF:
https://drive.google.com/file/d/0ByfGO_ITCy2tVk1oODc0NHZvNTg/edit?usp=sharing

Em caso de duvidas poste de volta.

Abs.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Ja tem um tempo que postei como fazer um PWM por software de 8 canais ou mais,que vão depender da velocidade do Micro,no caso foi usado um 16F628.

O exemplo foi feito para CCS,mas as rotinas e variáveis podem ser usadas em qualquer compilador.

Faça apenas os ajustes para o seu circuito.

http://www.4shared.com/rar/4tlfqjNN/8pwm_ccs.html

 

Vai junto com projeto do Proteus.

Como citou que vai usar led separados,escolha um canal para cada led e bole uma rotina de controle.

Link para o comentário
Compartilhar em outros sites

///////////////////////////////////////////////////////////////////////////////// Definições de fusiveis da pic#include "16F628A.h"#FUSES NOWDT		   //No Watch Dog Timer#FUSES INTRC_IO	    //Internal RC Osc, no CLKOUT#FUSES PUT			 //Power Up Timer#FUSES NOPROTECT	   //Code not protected from reading#FUSES BROWNOUT	    //Reset when brownout detected#FUSES NOMCLR		  //Master Clear pin used for I/O#FUSES NOLVP		   //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOCPD		  //No EE protection  ////#use delay(clock=4000)#use fast_io(b)/////////////////////////////////////////////////////////////////////////////#define trisb  0b00000000#define PW_Ini 210///////////////////////////////////////////////////////////////////////////// unsigned char		 	  PWM0,PWM1,PWM2,PWM3,	  PWM4,PWM5,PWM6,PWM7,	  PWM0_CNTR,PWM1_CNTR,PWM2_CNTR,PWM3_CNTR,	  PWM4_CNTR,PWM5_CNTR,PWM6_CNTR,PWM7_CNTR,	  AUXILIAR,ESTADO_PWM,	  LARGURA_PULSO;////////////////////////////////////////////////////	  //////////void Multi_PWM(void) {   LARGURA_PULSO--;if (LARGURA_PULSO == 0) {   PWM0_CNTR = PWM0;      PWM1_CNTR = PWM1;   PWM2_CNTR = PWM2;      PWM3_CNTR = PWM3;   PWM4_CNTR = PWM4;      PWM5_CNTR = PWM5;   PWM6_CNTR = PWM6;      PWM7_CNTR = PWM7;   LARGURA_PULSO = PW_Ini;   ESTADO_PWM = 255;   output_b(ESTADO_PWM); }else   {   AUXILIAR = 0;   PWM0_CNTR--;if (PWM0_CNTR == 0){PWM1_CNTR--;} else    {    AUXILIAR |= 0b00000001 ;    PWM1_CNTR--;    }if (PWM1_CNTR == 0){PWM2_CNTR--;} else   {    AUXILIAR |= 0b00000010 ;    PWM2_CNTR--;    }   if (PWM2_CNTR == 0)   {PWM3_CNTR--;} else   {    AUXILIAR |= 0b00000100 ;    PWM3_CNTR--;    }if (PWM3_CNTR == 0)   {PWM4_CNTR--;} else   {    AUXILIAR |=  0b00001000 ;    PWM4_CNTR--;   }if (PWM4_CNTR == 0)   {PWM5_CNTR--;} else   {    AUXILIAR |= 0b00010000 ;    PWM5_CNTR--;   }if (PWM5_CNTR == 0){PWM6_CNTR--;} else   {    AUXILIAR |= 0b00100000 ;    PWM6_CNTR--;   }if (PWM6_CNTR == 0){PWM7_CNTR--;} else   {    AUXILIAR |= 0b01000000 ;    PWM7_CNTR--;   }if (PWM7_CNTR == 0)   {    AUXILIAR &=ESTADO_PWM;    output_b(AUXILIAR);    ESTADO_PWM = AUXILIAR;   } else   {    AUXILIAR |= 0b10000000 ;   AUXILIAR &= ESTADO_PWM;   output_b(AUXILIAR);   ESTADO_PWM = AUXILIAR;   }    return; } }///////////////// VALORES POR CANAL ATÉ 255 [VALOR MÍNIMO É 1]//////////////////////////////////////////void main()	  {	  setup_comparator(NC_NC_NC_NC);	  set_tris_b( trisb );	  PWM0=1;	  PWM1=10;	  PWM2=40;	  PWM3=80;	  PWM4=160;	  PWM5=60;	  PWM6=80;

Teria algo menor para o 16F84A apenas usando três leds

tipo assim oh! codigo pequeno!

tira o restante dos componentes dip switch , e fica apenas o pic e os três leds ,não precisa ser RGB não , apenas leds comuns mesmo!!

34jd5wy.gif

apenas utilizando o tmer2 duty ciclo simples mesmo, e acender os três leds ,sou principiante ,

não precisa ser complexo não pessoal agradecido !

Estou utilizando CCS C compiler!

Link para o comentário
Compartilhar em outros sites

O código não é grande não pois você só vai utilizar o trecho abaixo:

///////////////// VALORES POR CANAL ATÉ 255 [VALOR MÍNIMO É 1]//////////////////////////////////////////void main()      {      setup_comparator(NC_NC_NC_NC);      set_tris_b( trisb );      PWM0=1;      PWM1=10;      PWM2=40;      PWM3=80;      PWM4=160;      PWM5=60;      PWM6=80;      PWM7=100;///////////////////////////////////           while(true)      {         Multi_PWM();        //AQUI VOCE IMPLEMENTA LER AS CHAVES E ALTERAR APENAS 3 SAIDAS      }   }

Explique melhor o que você quer fazer.

Link para o comentário
Compartilhar em outros sites

mudar o brilho tipo aumenta diminui, la na imagem que postei só isso só dos três leds , isso ja ajuda a entender o PWM em programação 

 

OK!!

 

espera ai admitindo que não sei quase nada Rsrs ! para cada pino é um CCP Certo , e quanto no maximo eu posso usar ??????!!!!!!!!!!!

Link para o comentário
Compartilhar em outros sites

@,

 

Não, o CCP só é usado para gerar a frequência básica do PWM. O que será controlado será a relação ALTO/BAIXO de cada um dos pinos que vai ao Led. Não é necessária usar o pino de saída do CCP, pode ser feito com qualquer pino de I/O.

 

Só para ilustrar : suponha que o CCP foi configurado para gerar 320 interrupções por segundo.

 

Se mantivermos a saída do Led em nivel alto durante todas as 320 interrupções, o brilho do Led será o máximo.

 

Mas, se mantivermos em nivel alto apenas nas primeiras 160 interrupções, e nas próximas 160 deixarmos em nivel baixo, o brilho será a metade, pois o nivel é alto em apenas 50% do tempo total.

 

Já se mantivermos em nível alto durante as primeiras 32 interrupções, o brilho será bem baixo, equivalente a 10% do máximo ( 32 equivale a 10% de 320, entendeu ? )

 

O que fazemos é criar um contador diferente para cada pino de Led que queremos controlar, e uma variável onde definimos para qual valor do contador mudamos o nivel do pino do Led .

 

Usando o exemplo que dei, quando ocorrer a ultima das 320 interrupções, zeramos todos os contadores, e começamos de novo !

 

É simples, pode analisar os códigos que a maneira de se gerar PWM por software sempre segue esta mesma ideia geral.

 

Na prática, o numero de interrupções é maior, e tentamos fazer o ciclo inteiro pelo menos 30 vezes por segundo, para que voce não perceba o "tremular" do brilho.

 

Uma ideia de frequência é esta : imagine que voce queira controlar 32 níveis de brilho, para fazer todo o ciclo acontecer 30 vezes por segundo temos de configurar o CCP para gerar 32 x 30 = 960 interrupções por segundo.

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Obrigado aphawk ! :)

Ai pessoal se tiver mais alguem , para contribuir ...

mais para começar tudo isso preciso , esquecer o proteus 8 e começar procurando , algum site que tenha o proteus antigo mais porém completo dizem que

tem a licença para testar qualquer micro controlador desde o 18F84 ao 18Fxxx .... vocês me entenderam!!

aphawk , o modulo ccp de comparação e captura PWM é escencial por que é ele que determina o brilhos dos leds certo?

posso usar o timer 1 também então ,yoda clonclui Rsrs!

ele gera uma especie de tensão media ? entendi meditar sobre isso eu irei :eek: kkkkkkk

Então quer dizer que se o tempo for o mesmo na onda quadrada tanto de pico e vale ou nivel logico 1 e nivel logico 0

teremos uma tensão media , mais isto confunde um pouco o que você disse sobre o ccp ou é parecido ,confuso estou meditar sobre isso irei :):confused: kkkkkkkkkk !!

Link para o comentário
Compartilhar em outros sites

@YODA.,

É muito mais simples !

Quando fazemos o PWM por software, precisamos apenas de algo que faça um bom número de interrupçōes em um segundo, e que essas interrupções ocorram sempre com o mesmo intervalo de tempo. Portanto, podemos usar um Timer, qualquer um deles para isso !

Não é ele que determina o brilho dos leds, o brilho é determinado pelo numero de vezes que o pino ligado ao Led forneçe corrente para ele !

Não pense em tensão média, pense em CORRENTE média, porque é exatamente isso !

Vou te dar um exemplo : imagine que o seu Led consuma 40 mA . Imagine que vamos fazer uma experiência com um tempo determinado de 1 segundo.

então, se voce deixar passar a corrente durante todo o 1 segundo, teremos uma corrente média de 40 mA, ok ?

Agora, imagine que durante metade desse tempo, voce não vai fornecer nenhuma corrente. Qual é a sua corrente média ?

40 x 1/2 = 20 mA !

Vamos piorar : durante apenas 100 milisegundos voce vai fornecer corrente ao Led, e 900 milisegundos não vai fornecer nenhuma corrente . Qual a sua corrente média ?

40 x 1/10 = 4 mA !

Ou seja, voce vai perceber um brilho bem fraquinho no Led ....

O brilho de um Led depende da corrente que o atravessa, então quanto mais corrente tem, mais ele brilha, e vice-versa !

Este é o princípio do controle do brilho do Led, apenas controlamos o tempo que a corrente passa pelo Led em função de um determinado período de tempo.

Se voce fizer um gráfico da corrente através do Led, vai perceber que é exatamente a mesma forma de onda de um controle PWM.

Na prática, se fizermos essas mudanças de corrente em um período grande, vamos perceber que o Led está piscando.

Para iludirmos nossos olhos, usamos o mesmo princípio do cinema : se fizermos esse liga/desliga mais de 30 vezes em um segundo, nosso olho irá "integrar" esse sinal luminoso, e perceberemos apenas uma mudança no brilho como se o Led estivesse sempre aceso !

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Yoda,

Te reconheçi assim que lí você assumindo o Yoda kkkkkkkk ! O jeito de escrever te entrega kkkk !

Só espero que voce aproveite esta segunda chance, ok ?

No mais, sempre disse que todos aqui querem ajudar para que voce e todos os que nos procuram consigam de fato aprender !

Conhecimento é um dom inútil se não for utilizado para ensinar a quem pede, certo ? Use a cabeça, sem brincadeiras, porque vontade voce tem, e isso pode te levar muito mais longe do que voce imagina, meu pequeno amigo kkkkkkk !

Paulo

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...