Ir ao conteúdo
  • Cadastre-se

PWM ajuda com codigo


Posts recomendados

Ola Pessoal.

Estou querendo fazer um codigo PWM para ligar um led RGB,gostaria de saber se precisa de resistor em serie com esse led,uma vez que o led recebera 5 volts mas com variação da largura de pulso....fiquei na duvida.

Simulei o codigo abaixo no proteus com um potenciometro na entrada (PIC16F877A),o led varia seu brilho como desejado,agora como fazer para variar os 3 leds internos do RGB?

#include <16f877a.h>#device adc=10#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP#use delay (clock=4000000)void main(){   int16 leitura;      setup_ccp1(ccp_pwm);                            setup_timer_2(T2_DIV_BY_16,248, 1);      setup_adc_ports(ALL_ANALOG);                      setup_adc(ADC_CLOCK_INTERNAL);    set_adc_channel(0);   delay_us (20);      while(TRUE)   {                  leitura = read_adc();       set_pwm1_duty(leitura);                           }      }
Link para o comentário
Compartilhar em outros sites

Isso voce pode verificar lendo o datasheet do fabricante, mais precisamente o parametro DC-Pulsed Current, ela ajudar a determinar um duty-cicle máximo seguro para que você acione o LED-RGB, dispensando assim o resistor limitador, mas veja que tal parametro é dependente da largura do pulso de corrente, o que vai influir na hora de selecionar uma frequência de portdadora adequada para o PWM operar.

Veja esse part number de exemplo, um Cree X Lamp:
http://www.cree.com/~/media/Files/Cree/LED%20Components%20and%20Modules/XLamp/Data%20and%20Binning/XLampXML_Color.pdf

 

para usar 3 leds, a coisa ja complica um pouco, o modulo ccp do PIC, nao é nada flexivel e oferece, na maioria dos casos apenas 1 canal PWM por modulo, assim voce precisaria de 3 ccps, porém o 877A so tem 2, uma solução seria o uso de um software PWM baseado no estouro de um timer, porém a resolução será baixa, além da frequênia de operação que seja bem limitada. Nao existe uma possibilidade de usar um led driver controlado por I2C que nem esses caras ( a fabricante ainda fornece amostras):

 

http://www.nxp.com/documents/data_sheet/PCA9633.pdf

Espero que o ajude.

Abs, 

Link para o comentário
Compartilhar em outros sites

@ e @joseca

 

Se conseguir ( e claro que consegue né ! ) PWM com 100 Hz já estará visualmente bem definido. Isto por software dá para fazer tranquilamente até mesmo com esse Pic, com 256 níveis diferentes. Nãp precisa ser mais alto que isso, e irá permitir uma mudança bem suave de cores.

 

Mas tem de limitar a corrente de pico de qualquer maneira, ou adeus Led. A menos, claro, que seja um Led RGB de potência alta, que pode trabalhar com correntes acima de 50 mA.

 

Se for um led RGB desses de baixa potência, eu ligaria direto nos terminais do Pic, com resistor de 100 ohms pro Red, 82 ohms pro Green, e 39 ohms pro Blue, que vai funcionar direitinho.

 

Paulo


@ e @joseca

 

Se conseguir ( e claro que consegue né ! ) PWM com 100 Hz já estará visualmente bem definido. Isto por software dá para fazer tranquilamente até mesmo com esse Pic, com 256 níveis diferentes. Nãp precisa ser mais alto que isso, e irá permitir uma mudança bem suave de cores.

 

Mas tem de limitar a corrente de pico de qualquer maneira, ou adeus Led. A menos, claro, que seja um Led RGB de potência alta, que pode trabalhar com correntes acima de 50 mA.

 

Se for um led RGB desses de baixa potência, eu ligaria direto nos terminais do Pic, com resistor de 100 ohms pro Red, 82 ohms pro Green, e 39 ohms pro Blue, que vai funcionar direitinho.

 

Paulo

Link para o comentário
Compartilhar em outros sites

Então, a pergunta não foi por este motivo....

 

Perguntei pois fiquei imaginando a dificuldade de gerenciar 8 PWM's por software, que código pesado e dedicado não deve ser, acabamos de ver em um outro tópico que fazer apenas 1 PWM de 24KHz já é praticamente impossível com um pic 12F629 oscilando a 4MHz, ai esta foi minha pergunta, qual a frequência máxima que chega este projeto ai....

 

flowww

Link para o comentário
Compartilhar em outros sites

@mister nintendo,

Concordo com o Vtrx . Não tem dificuldade nenhuma, basta repetir o código simples que trata 1 canal mais 7 vezes, trocando uma variável e mudando o pino de saída apenas ! Pode até otimizar o código, mas não vai ganhar muita coisa de tempo.

São só 255 níveis, e como a frequência é baixa tem tempo de sobra prá fazer isso dentro de uma interrupção de timer .

Paulo

Link para o comentário
Compartilhar em outros sites

Li certa vez no fórum do CCS a respeito da "polêmica" do PWM via software. Eles estavam discutindo até que ponto seria viável o PWM feito via código. Qual a freqüência máxima? 

 

Alguns chegaram a dizer algo em torno de 5 ou 6 Khz seria o limite. Além disso, seria mais viável usar o hardware dedicado ao PWM. Até porque esse era o intuito desse módulo. Deixar o PIC livre para fazer outras coisas enquanto o sinal seria gerado a parte.

 

Esse tópico explica de forma geral algumas coisas:

 

https://www.ccsinfo.com/forum/viewtopic.php?p=177578

 

Falou

Link para o comentário
Compartilhar em outros sites

@MatheusLPS,

 

Pergunta complicada de responder .... Porque limitar a 5, 6, ou a 10, 20 Khz ???  Se ainda sobrar tempo de processamento do microcontrolador para fazer as outras funções do projeto, não existe esse limite ! O único limite é conseguir gerar tudo na interrupção e ainda sobrar um pouco de processamento !

 

Se o objetivo é PWM em apenas alguns canais, claro que é melhor fazer por hardware, simplifica demais todo o processo. Mas se precisar de mais canais, e aí ???? Só sobra por software mesmo.

 

Posso falar mais dos Avrs. Usando por hardware, já ví acima de 70 Khz nos Atmegas comuns, mas sei que existem alguns Attinys que podem atingir 300 Khz.

Mas mesmo assim temos em geral 6 saídas de PWM com os Atmegas comuns, pois cada um dos Timers/Counters possui duas saídas independentes. Já esses Attinys especiais tem apenas duas saídas.

 

Já por software eu ví um cara que fez um controle de 8 servos de rádiocontrole com um Attiny2313 comum rodando a 8 Mhz, cada servo tem resolução de 1 uSeg , e pode variar entre 750 e 2100 uSeg. E isso em Basic !  O mesmo cara conseguiu recentemente 16 canais mas com clock de 16 Mhz. O que quero dizer com isso é que não vejo nada que limite o PWM por software, exceto a velocidade de processamento !  A 1 Mhz é uma situação, e a 20 Mhz é totalmente outra coisa, poderia arriscar que multiplicando a velocidade por 20 eu multiplico também a frequência possível do PWM ou o número de canais por 20 também !

 

Creio que o limite de se fazer isto por software é dado apenas pela velocidade de processamento. Quanto mais rápido seu clock, maior a frequência e o numero de canais de PWMs.

 

Paulo

Link para o comentário
Compartilhar em outros sites

Só gostaria de deixar uma observação: por favor, evite usar PWM com frequência baixa em LEDs. Eu me irrito muito quando mexo a cabeça e vejo um rastro de pontos deixado pelo LED piscando a uma frequência relativamente baixa, especialmente quando vejo esse rastro na minha visão periférica na rua (alguns carros com lanternas de LED usam PWM com uma frequência baixa), pois eu tenho a impressão de que algo está se movendo.

Se possível use o periférico de PWM, com uma frequência de uns 10 KHz, o que é muito melhor, pois não deixa um rastro de pontos quando o usuário move a cabeça com os LEDs em seu campo de visão. Na minha opinião, a experiência fica muito mais agradável.

Link para o comentário
Compartilhar em outros sites

@aphawk

 

No caso dos servos é tranquilo pois os mesmos usa uma frequência baixa que é de 50Hz com um tempo ON entre 1ms e 2ms em geral. Aí tudo fica tranquilo via software. Até por que via hardware, vai ser difícil uma frequência tão baixa.

 

Essas considerações que foram feitas no forum do CCS, tem o PIC como uC em mente e que possui uma arquitetura diferente dos atmega. 

 

Mas concordo que é uma pergunta complicada. Se você tem uma aplicação onde precisa de ter vários canais PWM, hoje temos uC e CIs próprios para isso. A não ser que você já esteja no desenvolvimento de uma aplicação e precisa de 1 canal extra de PWM. Mas tem que ver até que ponto vale a pena comprometer seu código principal e executar um PWM de 20Khz via software. 

 

Agora, para PWMs de baixa frequencia e vários canais, acho de boa ia via software mesmo.

 

Falou

Link para o comentário
Compartilhar em outros sites

@joseca

A fórmula para cálculo da frequência é:

T=(1/clock)*4*Prescaler*(carga Timer2+1)*Postcaler

De acordo com seu código fica:

T=1/4000000*4*16*(248+1)*1

T=0.003984

Então freq=1/t= 251hz

O frequencímetro do proteus precisa ser configurado para se comportar como tal.

Clique duas vezes sobre ele e no lugar de TIME escolha frequency.

Edit

Já vi que você já fez isso. O LED NO PRO TEUS não se comporta como um doido. No help eles comentam que foi feita uma modelagem digital. Por isso acredito que seja difícil você ter o visual dele meio apagado. Se bem q no projeto enviado pelo @vtrx o mesmo tem esse efeito. Bom, sugiro apenas retirar o ler e o osciloscópio e testar sem eles.

Lembrando que seu duty cycle so pode ir de 0 a 248. Se quiser ter resolução de 10 bits, tem que colocar um L depois do número do duty (set_pwm1_duty(124L) ) ou declarar a variável como long.

Falou

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!