Ajuda 12f675 PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Ajuda 12f675 PWM

Mensagempor alex_david_lima » 18 Fev 2007 09:39

Ola é todos, é possivel gerar pwm com 12f675, estou utilizando Assembly


Obrigado , deis de já
alex_david_lima
Bit
 
Mensagens: 35
Registrado em: 04 Nov 2006 07:46

Mensagempor Mersin » 18 Fev 2007 10:04

Olá Alex,

É possível sim, é o PWM por software, o princípio é o mesmo, porêm bem mais pobre que o PWM de Hardware.

Quando eu faço PWM por software geralmente coloco um Timer para gerar interrupções em períodos de tempo pré-determinado para que seja capaz de controlar o controle de DuTTy.

Tenha sempre em mente que TODO recurso a desenvolvermos em mC não necessariamente deve ser o "tão bom possível" e sim, basta ser o "tão bom o bastante" para nossa aplicação.

Por exemplo, no PWM de hardware vc tem 1023 níveis de dutty cada um com 1us (com clock de 4MHz) o que é muito bom mesmo para a maioria das aplicações, mas por exemplo, certas aplicações de controle de brilho em LEDs, um PWM de software que possa controlar 10 níveis de dutty para o brilho de um LED já tá muito bom também (já engana nosso olho), daí vc deve saber o quanto seu recurso deverá ser "bom o suficiente" para tornar possível sua aplicação, que no caso desse exemplo de 10 níveis de brilho para o LED, basta fazer o seguinte:

1) Para enganar bem nosso olho, bastariam uma multiplexação On/Off do LED a 60Hz, ou seja, se o LED piscar 60 vezes por segundo, para nós ele já estaria como que aceso direto.
2) Como queremos ter 10 níveis de brilho, basta multiplicarmos 10 x 60 = 600 vezes por segundo.
3) Para tal, devemos controlar o PWM apenas 10 níveis de dutty num ciclo total de 1/600 = 1,66ms, para tal, programe qualquer Timer para te dar uma frequencia assim ou um pouquinho melhor que esta (caso isso facilite o Setup do Timer) e faça um algorítimo para controle do Dutty e já tá excelente! Funciona bem mesmo.

Espero ter ajudado.

Inté!
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor alex_david_lima » 18 Fev 2007 15:26

Mersin escreveu:Olá Alex,

É possível sim, é o PWM por software, o princípio é o mesmo, porêm bem mais pobre que o PWM de Hardware.

Quando eu faço PWM por software geralmente coloco um Timer para gerar interrupções em períodos de tempo pré-determinado para que seja capaz de controlar o controle de DuTTy.

Tenha sempre em mente que TODO recurso a desenvolvermos em mC não necessariamente deve ser o "tão bom possível" e sim, basta ser o "tão bom o bastante" para nossa aplicação.

Por exemplo, no PWM de hardware vc tem 1023 níveis de dutty cada um com 1us (com clock de 4MHz) o que é muito bom mesmo para a maioria das aplicações, mas por exemplo, certas aplicações de controle de brilho em LEDs, um PWM de software que possa controlar 10 níveis de dutty para o brilho de um LED já tá muito bom também (já engana nosso olho), daí vc deve saber o quanto seu recurso deverá ser "bom o suficiente" para tornar possível sua aplicação, que no caso desse exemplo de 10 níveis de brilho para o LED, basta fazer o seguinte:

1) Para enganar bem nosso olho, bastariam uma multiplexação On/Off do LED a 60Hz, ou seja, se o LED piscar 60 vezes por segundo, para nós ele já estaria como que aceso direto.
2) Como queremos ter 10 níveis de brilho, basta multiplicarmos 10 x 60 = 600 vezes por segundo.
3) Para tal, devemos controlar o PWM apenas 10 níveis de dutty num ciclo total de 1/600 = 1,66ms, para tal, programe qualquer Timer para te dar uma frequencia assim ou um pouquinho melhor que esta (caso isso facilite o Setup do Timer) e faça um algorítimo para controle do Dutty e já tá excelente! Funciona bem mesmo.

Espero ter ajudado.

Inté!





Ola, vc teri algum exemplo pra me ajudar ?
alex_david_lima
Bit
 
Mensagens: 35
Registrado em: 04 Nov 2006 07:46

Mensagempor Pask » 23 Fev 2007 19:57

Caro amigo, existe uma forma bem "simplória" de gerar um sinal PWM sem o uso de interrupção dos timers. Eu já implementei e funcionou bem. Se vc quiser experimentar, estou lhe enviando o fragmento do código em assembly e C como exemplos:

EM ASSEMBLY:

BSF PORTB,0 ;o pino RB0 do PORTB vai a nível lógico alto
CALL DELAY_1 ;chama-se a sub-rotina de atraso de tempo que vc já criou e que deverá manter este pino em H por um tempo determinado por você
BCF PORTB,0 ;o pino RB0 do PORTB vai a nível lógico baixo
CALL DELAY_2 ;novo atraso de tempo com duração diferente do primeiro comando de delay (vc também já criou esta outra sub-rotina)
...e assim por diante.

Então, usando esta técnica simples, você conseguirá gerar uma forma de onda quadrada que fica X tempo em nível lógico alto e Y tempo em nível lógico baixo. Por exemplo: vc pode gerar uma forma de onda que fica 22ms em H e 8ms em L. Depois, caso vc queira ir alterando ou variando o seu duty cicle, basta criar outras sub-rotinas de delay que causem atrasos de tempo diferentes para H e L e chamá-las no momento certo ou mesmo usar alguma variável dentro de uma única sub-rotina de delay e alterar seu valor de acordo com o duty-cicle desejado para que o tempo de delay se altere a cada chamada da sub-rotina.

Se vc estiver programando em C, fica ainda mais fácil:

WHILE(TRUE) {
OUTPUT_HIGH(PIN_B0); //coloca o pino RB0 em H
DELAY_MS(22); //aguarda 22ms
OUTPUT_LOW(PIN_B0); //coloca o pino RB0 em L
DELAY_MS(8); //aguarda 8ms
} //repete este laço indefinidamente

Então, no exemplo acima, 22+8=30ms, este é o período total da sua forma de onda que corresponderá a uma freqüência de 33,33 Hz e a onda ficará 22ms em H e 8ms em L, tendo então, um duty-cicle de 73,33% neste exemplo!

Vc ainda pode criar um comando via dois botões externos de tal forma que, quando um for pressionado o duty-cicle vá aumentando e quando o outro for pressionado, o duty-cicle vá diminuindo, exatamente como aconteceria se vc utilizasse o módulo PWM embutido no PIC.

Será que te ajudei? Espero que sim. Até...

Pask.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor Renie » 23 Fev 2007 21:17

Olá Alex,

No meu site tem um tutorial que fiz em 2005 de como implementar PWM
por soft.

Ele mostra as opções de fazer por interrupção e por código discreto
sequencial (sem interrupção).

Os exemplos das implementações foram descritas em pseudo código,
servindo como base para ser implementadas em qualquer linguagem.
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor _blackmore_ » 11 Nov 2008 12:50

pergunto ...

se eu usar um conversor AD para determinar o duty cicle e quiser usar neste exemplo dado acima pelo Pask na PWM, basta eu trocas as variáveis de ton e toff pelo valor lido no AD? logicamente fazendo a conversão deste resultado para ms e subtraindo da freq do ciclo, certo?
mas ae penso que para usar um motor o mesmo não irá funcionar continuamente ... mas talvez em pequenos saltos ... será?

abrax!
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor fabio_ » 14 Nov 2008 10:54

alex,

de uma olhada no post abaixo, acho que pode te ajudar também

http://asm51.eng.br/phpBB/viewtopic.php?t=6168&start=15

_blackmore_

na rotina que fiz basta vc definir o valor do ciclo ativo na tabela e relacionar com quantos pontos vc quiser e defini-los pela leitura do conversor AD.

falow
fabio_
Byte
 
Mensagens: 177
Registrado em: 13 Jun 2007 12:08


Voltar para PIC

Quem está online

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

x