PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PWM

Mensagempor antonio » 19 Out 2008 09:34

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
}
}
}
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor ze » 20 Out 2008 08:09

exemplo prático de como opera o pwn nos pics
http://www2.eletronica.org/forum-de-dis ... /605518997
abs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Nitron » 07 Out 2009 10:20

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
}
}
Nitron
Bit
 
Mensagens: 23
Registrado em: 03 Mar 2007 02:41

Mensagempor proex » 07 Out 2009 12:05

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.

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor ze » 07 Out 2009 15:16

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!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Andre_Cruz » 07 Out 2009 16:28

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
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor leoabubauru » 07 Out 2009 20:37

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
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Mensagempor ze » 08 Out 2009 08:37

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor proex » 08 Out 2009 09:49

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.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor fabio_pic » 08 Out 2009 19:58

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.
fabio_pic
Nibble
 
Mensagens: 81
Registrado em: 03 Set 2007 09:04
Localização: Rio de Janeiro


Voltar para PIC

Quem está online

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

cron

x