Página 1 de 1

PWM

MensagemEnviado: 19 Out 2008 09:34
por antonio
Pessoal tudo bem!

Ultimamente tenho vindo a tentar compreender como funciona o PWM,para isso montei o circuito que vem no libro do Fabio pagina 236-237 com o mesmo codigo proposto pelo autor mas com algumas alterações !o codigo exemplo segue em baixo!
O que tento fazendo é cada vez que a tecla no pino-a0 seja levado a 1 a variaveil x vai incrementando e o switch vai alterando o valor do PWM no pino RC2->ccp1( espero que não estja errado?) e tenho um LED ligado ao pino 17 do 16F877A
O circuito foi montado de acordo com o livro,claro sem o uso da rs232
Estou fazendo teste a uma semana sem qualquer resultado ,onde serà o erro? : :shock:

Desde jà agradeço a galera!! :D

aqui vai o codigo;
#include <16f877a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,PUT
#include <lcd.c>
#use standard_io(a)


void main()
{
int x=0;
long int ciclo=0;
//lcd_init();

//lcd_putc("\r\nTeste do PWM\r\n");

setup_timer_2 (T2_DIV_BY_16, 61, 1); // timer 2 = 1,008 khz
setup_ccp1 (ccp_pwm); // configura CCP1 para modo PWM
set_pwm1_duty ( 0 ); // configura o ciclo ativo em 0 (desligado)
while (true)
{
x=input(pin_a0); // se uma tecla for pressionada
{
x=x+1;
if (x>9)
x=0;
switch (x) // verifica a tecla
{
case '1' : ciclo = 50;
break;
case '2' : ciclo = 100;
break;
case '3' : ciclo = 255;
break;
case '4' : ciclo = 350;
break;
case '5' : ciclo = 500;
break;
case '6' : ciclo = 700;
break;
case '7' : ciclo = 900;
break;
case '0' : ciclo = 1023;
break;
// case '0' : ciclo = 0;

}
if (ciclo>1023) ciclo = 1023;
// printf (lcd_putc,"Ciclo ativo = %lu\r\n",ciclo);
set_pwm1_duty (ciclo); // configura o ciclo ativo
}
}
}

MensagemEnviado: 20 Out 2008 08:09
por ze
exemplo prático de como opera o pwn nos pics
http://www2.eletronica.org/forum-de-dis ... /605518997
abs

MensagemEnviado: 07 Out 2009 10:20
por Nitron
Acredito que a dúvida do colega acima seja a mesma minha. Estou iniciando com PIC e surgiram algumas dúvidas ao implementar o código abaixo. Pelo que entendi, preciso fazer uma conversão do valor lido do ADC (10 bits) para o valor que será usado para setar o PWM (16 bits). No entanto, não acertei ainda na simulação.

Ficaria grato se alguém puder me ajudar. Desde já agradeço.

Wesley

PS: Estou utilizando o CCS e o Proteus.

#include <16F877.h>
#device adc=10 // AD em 10 bits
#use delay(clock=4000000)
#fuses NOWDT,PUT

main()
{
unsigned int16 value;

setup_adc_ports (RA0_analog);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel (0);
delay_us(20);

setup_ccp1(ccp_pwm); // Configura CCP1 para o modo PWM
set_pwm1_duty(0); // Configura o clico ativo em 0 (desligado)

while(true)
{
value = read_adc(); // Atribui valor do AD para a variavel "value".

if (value>1023) value = 1023;

set_pwm1_duty (value); // configura o ciclo ativo
}
}

MensagemEnviado: 07 Out 2009 12:05
por proex
Ao ler o código acima nao pude deixar de notar uma coisa estranha , uma forma de escrever uma função que não produzirá qualquer efeito a não ser consumir processamento e memoria de programa.

No inicio achava isso um absurdo mas ao ver exemplos escritos por "feras" cheguei a conclusão de se trata mesmo de aberração.

Não entendo como os professores não alertam sobre esse tipo de erro.

Exemplos:

if (value=0) value = 0; (Esse é classico).

Testa-se uma variavel e se ela for Zero, atribui-se a essa mesma variavel o valor Zero.

Tenho visto esse tipo de coisa em muitos codigos por ai.

Outro exemplo é o de testar o valor máximo de uma variavel de 8 bits para prevenir possivel estouro. É usado tambem para variaveis de qualquer tamanho:

if (value=>255) value =255;

Ora, se a variavel é de 8 bits, ela nunca assumirá um valor maior que 255 então, esse tipo de código nao tem nenhuma utilidade.

No exemplo lá acima temos:

value = read_adc(); // Atribui valor do AD para a variavel "value".
if (value>1023) value = 1023;

Ora, o conversor A/D do PIC é de 10 bits, logo o valor maxino que "value" poderá chegar será 1023.

logo a linha < if (value>1023) value = 1023; > não tem utilidade alguma, mesmo se a variavel "value" for de 16 bits.

É isso.

.

MensagemEnviado: 07 Out 2009 15:16
por ze
veja aqui um "exemplo prático de como opera o pwn nos pics"
http://www.asm51.eng.br/phpbb/viewtopic.php?t=6364
entender o pwm a partir de funções mastigadas é 1/2 menos fácil do que entender a nível de hw do uC.
mas setar o pwm através da entrada ad num é dificil não, uai. Aquele ex. deve dar pra simular. O se quiser só dar sem simular. Ou simula e dá depois... você decide.

E por gentileza, diz que tentou ler o datasheet mas não entendeu direito. O quê?? vai programar o uC sem ler nenhum datashit?? Oh... shit! Bem, neste caso infelizmente não lhe posso alcançar...

Começou certo, mas tinha que Começar Com Sucata?

abç & boa sorte!

MensagemEnviado: 07 Out 2009 16:28
por Andre_Cruz
antonio,

A cada vez que é pressionado o botão, incrementa a variavel "x" que atribui diferentes valores a variavel "ciclo".

O que pode estar acontecendo é que. esse incremento esta acontecendo muito rapido. Para teste coloque um delay de uns 10mS pra ver se funciona, e outro teste para se certificar que o código esta funcionando, atribua um valor fixo a variavél "ciclo" dessa maneira o PWM deverá funcionar.

Abraço

MensagemEnviado: 07 Out 2009 20:37
por leoabubauru
Apenas comentando o post do Proex...

Concordo plenamente que o código citado seja desnecessário, Proex. Mas apenas do ponto de vista lógico, pois no mundo real as aberrações podem acontecer. Digo isto pois um campo de 300V/m polarizado verticalmente ou horizontalmente (como exigem alguma das normas mais rigorosas), pode não só produzir um valor maior para a tal variável, como também corromper dados em EEPROM! É comum em aplicações críticas fazer refresh, por exemplo, dos bits de direção de porta para garantir que uma entrada será sempre uma entrada. Eu já vi entrada que virou saída depois de um teste destes... Portanto, ainda que contra a lógica, acredito, eu, seja uma boa prática.


Como disse, concordo com você. É estranho a bessa! Quando entrei no mundo da eletrônica automotiva deparei-me com códigos estranhíssimos. E na primeira tentativa de "corrigí-los", levei ferro no INPE. Demorei a acostumar com alguns códigos. Mais ainda para começar a escrevê-los também! Hoje tenho pequenos calafrios, mas tenho me tornado mais receptivo a eles. Hehehe



Abraços

MensagemEnviado: 08 Out 2009 08:37
por ze
Apenas comentando o post do leobauru...

corroborando tua sábia intervenção prática (também vivida por mim no lit do inpe), os professores têm dificuldade em expor tais condições devido à óbvios motivos: falta de 'calos' nas mãos
Mas pra isso temos as nossas. Quem sabe tem algum prof. lendo isto. Aqui se encaixa a frase: na prática a teoria é outra.
abç

MensagemEnviado: 08 Out 2009 09:49
por proex
Não me referi a cuidados que se deve tomar no soft quando se trabalha em ambientes ruins. Me referi a codigos que na pratica não terão efeito algum.

MensagemEnviado: 08 Out 2009 19:58
por fabio_pic
Só pra não perder o gancho .....

Como se faz para alterar a freq do PWM? Com ose determina isso? ... Em C.
Abraços a todos.

Fábio.