Página 1 de 1
Ajuda 12f675 PWM

Enviado:
18 Fev 2007 09:39
por alex_david_lima
Ola é todos, é possivel gerar pwm com 12f675, estou utilizando Assembly
Obrigado , deis de já

Enviado:
18 Fev 2007 10:04
por Mersin
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é!

Enviado:
18 Fev 2007 15:26
por alex_david_lima
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 ?

Enviado:
23 Fev 2007 19:57
por Pask
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.

Enviado:
23 Fev 2007 21:17
por Renie
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.

Enviado:
11 Nov 2008 12:50
por _blackmore_
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!

Enviado:
14 Nov 2008 10:54
por fabio_
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