Ir ao conteúdo
  • Cadastre-se

Interfaceando Matriz de Led 8x8 RGB com 18F


Axiss

Posts recomendados

Boa tarde!

Bom pessoal, como o próprio título já sugere, estou tentando interfacear uma matriz de LEDs RGB 8x8 usando um PIC 18F4550 a 48 MHz + 4 Shift Registers (1 para cada cor + um par as colunas) 74HC595 e de quebra 4 buffers de corrente pra cada S.R. pra pode acender os LEDs de forma correta.

Estou encontrando problema na hora de implementar o PWM no sistema, consegui simula-lo por software de forma satisfatória, porém, acendendo uma intensidade de cor por coluna, ou seja, consigo setar da forma que eu achar melhor cada uma das cores de cada coluna, além de enxergar ainda um leve "piscar" dos LEDs, apesar da frequência de atualização de 100 Hz. Gostaria de expandir isso para que eu possa setar cores individualmente em cada LED, ou seja, perder a limitação de 1 coluna = 1 cor RGB e , se o hardware permitir, futuramente implementar uma matriz 16x16.

Seguem meus códigos:

obs.: Todos desenvolvidos com o c18 + mplab

PWM:

#pragma interrupt Tratamento_High_Interrupt
void Tratamento_High_Interrupt(void)
{
//periodo = acende os LEDs a cada 1,25 ms
if(PIR1bits.TMR1IF){

if(vermelho != 0){
linhasR(r);
}
if(verde != 0){
linhasG(g);
}
if(azul != 0){
linhasB(;
}

vermelho = verde = azul = 0; //zera os contadores, reiniciando o
//ciclo de largura de pulso

PIR1bits.TMR1IF = 0;
WriteTimer1(58036);

WriteTimer0(64786);

}

//largura de pulso = realiza o acressimo dos contadores a cada 0,125 //ms, caso o valor setado seja atingido, apaga o led
if(INTCONbits.TMR0IF){

if(azul < lp_azul)
azul++;
else
linhasB(0);


if(verde < lp_verde)
verde++;
else
linhasG(0);



if(vermelho < lp_vermelho)
vermelho++;
else
linhasR(0);


INTCONbits.TMR0IF = 0;
WriteTimer0(64786);

}

}

Acho que através das configurações ficou claro como configurei cada Timer...

o meu Duty Cicle ficou com 1,25 ms porque, para ver a matriz toda sem piscar, setei 10ms/8 pra poder fazer a varredura... não sei se foi uma grande ideia. O período (largura de pulso) ficou 0,125 para que eu possa ter 10 valores de intensidade diferentes pra cada Led.

Essa é uma das funções que enviam os dados para o S.R., para as outras cores e para as colunas a lógica é a mesma:

void linhasR(long int dado){
int i;

//simula saída serial, evia dados ao Registrador de Deslocamento
for(i = 0; i< 8; i ++){

DDR = dado & 1;
dado>>=1;
CLKR = 1;
CLKR = 0;

}
LTR = 1;
LTR = 0;

}

LTR = Latch
CLKR = Clock
DDR = dado

cada um devidamente ligado nos pinos de cada Latch

e aqui parte da Main:

while(1)
{
Delay1KTCYx(15);

lp_vermelho = 10;
lp_azul = 10;
lp_verde= 10;
r = 0x80;
b = 0x80;
g = 0x80;
colunas(0x80);
Delay1KTCYx(15);

lp_vermelho = 10;
lp_azul = 10;
lp_verde = 0;
r = 0x40;
g = 0x40;
b = 0x40;
colunas(0x80);
Delay1KTCYx(15);

lp_vermelho = 10;
lp_verde = 10;
lp_azul = 0;
r = 0x20;
g = 0x20;
b = 0x20;
colunas(0x80);
Delay1KTCYx(15);

lp_vermelho = 0;
lp_azul = 10;
lp_verde = 10;
r = 0x10;
g = 0x10;
b = 0x10;
colunas(0x80);
Delay1KTCYx(15);

lp_vermelho = 10;
lp_azul = 0;
lp_verde = 0;
r = 0x08;
g = 0x08;
b = 0x08;
colunas(0x80);
Delay1KTCYx(15);

lp_vermelho = 0;
lp_azul = 10;
lp_verde = 0;
r = 0x04;
g = 0x04;
b = 0x04;
colunas(0x80);
Delay1KTCYx(15);

lp_vermelho = 0;
lp_azul = 0;
lp_verde = 10;
r = 0x02;
g = 0x02;
b = 0x02;
colunas(0x80);
Delay1KTCYx(15);

onde r, g e b correspondem a qual led quero manipular(valor em hexa enviado para a função de comunicação com o Latch)

lp_vermelho,lp_verde,lp_azul correspondem as larguras de pulso(intensidade dos leds) que variam de 0 a 10.

A minha dúvida é se eu implementei o PWM de forma correta, ou se ainda da pra fazer ajustes de tempo e afins ou se meu software é inconsistente e também se um MC desse com um PWM dessa forma conseguiria interfacear uma matriz 16x16 RGB.

Link para o comentário
Compartilhar em outros sites

A princípio,usando uma varredura convencional (da esquerda para a direita),seria mais fácil utilizar um 74HC164 para economizar um pino.

Creio que voce não precisa do buffer pois se não me engano, uma matriz convencional de 5 m não chega a 5 v por led.

O controle da intensidade do led (R.G.B) por PWM é interessante,assim pode fazer uma gama enorme de cores.

A melhor maneira de se implementar o que voce quer,depende exclusivamente de voce pois na 'teoria' parce funcionar.

voce disse que está percebendo 'flicker' a 100 HZ.

Suponho que voce não testou numa placa de verdade pois a 100 HZ não deveria apresentar este efeito a menos que está usando o Proteus e o Proteus não vai conseguir emular isso tudo realmente.

Eu tenho projetos no Proteus usando um 16F628 e 10 Matrizes de uma só cor a 4 MHz e não ha flicker,mas a 48 Mhz acho que não emula como deve ser.

Link para o comentário
Compartilhar em outros sites

Eu já tenho todo o hardware implementado e é nele que faço meus testes, o Buffer utilizo caso eu queira acender, por exemplo, uma coluna inteira de LEDs com um só comando, com uma corrente média de 30 mA por LED (de acordo com as especificações do mesmo), daria 240 mA... Daí o porque do buffer, que aguenta até 400 mA em uma porta, se não me engano.

Não sei dizer o porque do flicker a 100 Hz, talvez algum atraso é gerado pelo hardware e é refletido nos LEDs, ou então algo no meu software... mas ainda não encontrei o problema !

Você disse que emulou 10 matrizes com um 16f628. Essas matrizes todas são 8x8? O pic faz o controle de todas elas ao mesmo tempo? se sim, chega a um valor bem próximo de Leds de uma matriz 16x16 ! ( 10 de 8x8 = 640, 16x16x3 = 768) se a 4 MHz você consegue fazer o controle, teria de ser possível eu conseguir com 48 Mhz...

Será que o envio das informações pelo PIC para os shift registers e dos shift registers para o buffer e enfim para os LEDs pode gerar algum Jitter? Se fosse esse o caso isso faria com que o atraso gerado distorcesse a configuração do PWM... Fui aumentando a frequencia do PWM, fiz com 100 HZ, 200 Hz, 400 Hz e continuo tendo o problema dos LEDs piscando.... tem algo passando despercebido por mim =/

Link para o comentário
Compartilhar em outros sites

Pode ser que voce não implementou direito a varredura.

Vou te passar o link do projeto no proteus do 16F628.

Ele foi programado em ASM,não tem código fonte ainda pois não montei o Hardware.

Tenho tambem um projeto com o 18F2550(C18) mas tambem não terminei ainda pois tive que fazer outros projetos mais urgente.

Você disse que emulou 10 matrizes com um 16f628. Essas matrizes todas são 8x8?

Sim,8X8.

Para 'ver' a varredura,altere a propriedade do cristal do PIC para 0.02 MHZ ou 0.05 MHz.

-> projeto 16F628 -<

Eu já tenho todo o hardware implementado e é nele que faço meus testes, o Buffer utilizo caso eu queira acender, por exemplo, uma coluna inteira de LEDs com um só comando, com uma corrente média de 30 mA por LED (de acordo com as especificações do mesmo), daria 240 mA... Daí o porque do buffer, que aguenta até 400 mA em uma porta, se não me engano.

Lembre-se que usando varredura,apenas 8 leds estarão acesos por vez(um em cada pino do PORT independente).

Mesmo usando Led RGB,voce terá que setar um PORT(1 pino) para cada cor(led),logo sempre terá o consumo por pino em +- 15 ma,pois existe a varredura.

Link para o comentário
Compartilhar em outros sites

Pode ser que voce não implementou direito a varredura.

Vou te passar o link do projeto no proteus do 16F628.

Ele foi programado em ASM,não tem código fonte ainda pois não montei o Hardware.

Tenho tambem um projeto com o 18F2550(C18) mas tambem não terminei ainda pois tive que fazer outros projetos mais urgente.

Sim,8X8.

Para 'ver' a varredura,altere a propriedade do cristal do PIC para 0.02 MHZ ou 0.05 MHz.

-> projeto 16F628 -<

Lembre-se que usando varredura,apenas 8 leds estarão acesos por vez.

Mesmo usando Led RGB,voce terá que setar um PORT para cada cor(led).

acho que me expressei mal, quando digo um comando é só uma chamada de função de comunicação com o Latch... na conf do meu Hardware, ficaram 3 portas do PIC por S.R, sendo um S.R. pra cada cor + um pras colunas... Eu não uso exatamente varredura, na verdade eu seto valor de linha e coluna que correspondem ao LED (ou LEDs) que quero acender. Será que fixar, por exemplo, uma varredura de coluna e eu manipular somente as Linhas diretamente eu teria uma melhora?

Obs.: meu hardware da possibilidade de eu manipular uma matriz 8x8 ou uma 16x16, ou ainda uma 16x8, fiz um esquema de jumpers aqui e tenho acesso a cada Latch individualmente, ou seja, se eu quiser simular uma matriz de uma cor, seja verde, vermelha ou azul, é possivel tambem e ainda posso colocar os latchs em série (vermelho> vermelho, verde>verde,azul>azul ou ainda vermelho>verde>azul vermelho>verde>azul e coluna>coluna) ... fico bem legal hehehe. Claro que tive ajuda nesse desenvolvimento.

Pra ficar mais claro, eu faço estágio na empresa da minha família e meu pai ficou como meu instrutor... ele tem grande conhecimento de hardware, só que nenhum em software, então a gente se ajuda aqui.

Link para o comentário
Compartilhar em outros sites

Da uma verificada no exemplo do link.

A varredura é o único meio de se fazer um hardware pequeno e limpo,alé do mais,a programação dos desenhos ou menssagens fica simples.

O Scroll do link que postei,é feito apenas mudando o endereço inicial de leitura da sequencia de caracteres.

Eu uso apenas CIs 74HS164,que é muito barato,esse CI,no meu esquema,faz apenas a varredura dos displays(que é fixa) o resto é feito por Software.

Link para o comentário
Compartilhar em outros sites

Aqui na empresa já temos uma barra de LEDs desenvolvida de forma parecida, só que usamos o 74HCT574, se não me engano, que fica responsável por "carregar" a imagem pela matriz... A que tento desenvolver agora teria que ter o diferencial de exibir imagens com liberdade total e com diversas cores. Na realidade, já temos desenvolvido um protótipo que opera cada cor separadamente, sem mistura-las e sem uso de PWM, sendo a matriz 16x16 RGB. O problema começo com o PWM...

Link para o comentário
Compartilhar em outros sites

Como disse,é uma questão de escolha que depende de vocês mesmos.

Eu programo o software do PC tanto na que usa o 16F628,pela serial,como o que vai usar o 18F2250,pela USB.

Geralmente minhas interfaces são bastante dependentes do soft no PC,tem pessoas que fazem o Hardware mais 'stand-alone',é uma escolha pessoal.

Sobre o PWM,voce teria que ser mais específico e postar o seu Hardware para sabermos como esse PWM esta sendo usado.

Link para o comentário
Compartilhar em outros sites

Quanto a ser Stand Alone ou não... depende do nível que esse projeto vai chegar, se for pra representar imagens mais complexas o PIC vai passar a ser só um interfaceador pra setar a imagem que vai vim do PC ou e uma memória externa ao PIC. Quanto ao PWM, fico te devendo o esquema do hardware =/, eu não tenho em mãos, fica com o meu responsável que não está presente agora... mas o Duty Cicle do PWM, quando estoura (bate 10ms) envia pra porta do PIC responsável pelo S.R. correspondente a sequencia de leds que é para ser acesa, e quando a largura de pulso estoura, de acordo com o que foi setado, o PIC envia 0 para a porta correspondente ao S.R. daquela cor.

Essa imagem aqui é beeeem arcaica em relação ao sistema real, mas quem sabe não esclarece algo... é só entender que ela representa uma matriz 8x8 correspondente a uma cor, então mais 2 dessas sem o latch da coluna, configurariam o meu sistema completo 8x8 (sem os buffers) e, obviamente, tudo em um mesmo PIC... pra ficar mais claro, PIC + S.R. ta assim:

PORTA A:

p0,p1,p2 = S.R. cor vermelha

p3,p4,p5 = S.R cor verde

PORTA B:

p0,p1,p2 = S.R. cor azul

PORTA C:

p0,p1,p2 = S.R colunas

http://www.4shared.com/file/4FhA9_7R/8x8.html

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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!