Problemas com a implementação de PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor fredtg » 04 Fev 2009 11:29

ffcprog escreveu:void main(){
PWM1_Init(5000);
PWM1_Start();
PWM1_Change_Duty(160);
while(1){
//tenta assim, e veja se o problema acaba.

}
}

ffcprog


Deu na mesma.
fredtg
Bit
 
Mensagens: 19
Registrado em: 29 Mar 2007 10:34

Mensagempor otavio luiz » 04 Fev 2009 14:28

o seu código é só este mesmo???? Por um acaso voce não esta ligando o WDT, ta parecendo que o pic ta ressetando por algum motivo.
Lembre-se, zona de Fresnel não é nenhuma franquia de puteiro.
Avatar do usuário
otavio luiz
Byte
 
Mensagens: 257
Registrado em: 11 Out 2006 13:56
Localização: Barretos - SP, terra de Peão

Mensagempor ffcprog » 04 Fev 2009 15:32

otavio luiz escreveu:o seu código é só este mesmo???? Por um acaso voce não esta ligando o WDT, ta parecendo que o pic ta ressetando por algum motivo.


chato, falou primeiro que eu, aí é sacanagem...
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor fredtg » 04 Fev 2009 16:35

otavio luiz escreveu:o seu código é só este mesmo???? Por um acaso voce não esta ligando o WDT, ta parecendo que o pic ta ressetando por algum motivo.


Pois é, não estou ligando o wdt não. Até setei alguns bits do registrador intcon desabilitando algumas interrupções(que tb não poderiam afetar o pwm de qualquer forma).
fredtg
Bit
 
Mensagens: 19
Registrado em: 29 Mar 2007 10:34

Mensagempor fredtg » 04 Fev 2009 16:36

Estou usando o winpic800. Esse gravador é recomendável?
fredtg
Bit
 
Mensagens: 19
Registrado em: 29 Mar 2007 10:34

Mensagempor ffcprog » 04 Fev 2009 16:39

bem meu amigo.
Por muita curiosidade.

Eu espetei um 16f877 aqui na minha placa e fiz um simples teste.

Leio o ADC converto para 8 bits e seto o dc do pwm.

delay de 500mS entre amostragens...

No problem... Funcionou perfeitamente................

IDE MIKROC

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor fredtg » 04 Fev 2009 16:46

Testou como? Com osciloscópio? Por simulação, tanto no pic simulator ide quanto no proteus funcionou corretamente. Vc ajusta algum pino para terra ou em vcc?
fredtg
Bit
 
Mensagens: 19
Registrado em: 29 Mar 2007 10:34

Mensagempor fredtg » 04 Fev 2009 16:48

Também estou usando o MikroC 8.2. No compilador da css nem gera sinal. E olha que eu usei apenas o wizard do programa hein!
fredtg
Bit
 
Mensagens: 19
Registrado em: 29 Mar 2007 10:34

Mensagempor ffcprog » 04 Fev 2009 20:45

meu tu ta fazendo alguma caquinha básica do basico,

coloca seu sc aqui, para nós darmos uma olhadinha básica,,,,

Se não o fizer, fica impossivel de lhe ajudar.

Pois tudo indica que o erro é da pecinha....

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor fredtg » 04 Fev 2009 21:30

O código completo é este aqui:

++++++++++++++++++++++++++++++++++++++++++++++++
unsigned sinal;
signed sinal_180;

void main(){
INTCON.GIE = 0; //desabilitando interrupções globais
INTCON.PEIE = 0; //desabilitando interrupções periféricas
INTCON.T0IE = 0; //desabilitando interrupções do TMR0
INTCON.INTE = 0; //desabilitando interrupções externas do RB0
INTCON.RBIE = 0; //desabilitando interrupções por mudanças em RB

TRISA = 0xFF; //configurando os pinos A como entrada
PORTA = 0x00;
TRISB = 0x00; //configurando os pinos B como saída
PORTB = 0x00;
TRISC = 0x00; //configurando os pinos C como saída
PORTC = 0x00;
TRISD = 0x00; //configurando os pinos D como saída
PORTD = 0x00;
ADCON1 = 0X80; //registrador p justifica a direita, setando portas
//como analógicas e setando Vdd como tensão de ref

CCP1CON.CCP1M3 = 1; //habilitando o PWM em CCP1
CCP1CON.CCP1M2 = 1;
CCP1CON.CCP1M1 = 1;
CCP1CON.CCP1M0 = 1;

CCP2CON.CCP2M3 = 1; //habilitando o PWM em CCP2
CCP2CON.CCP2M2 = 1;
CCP2CON.CCP2M1 = 1;
CCP2CON.CCP2M0 = 1;

PWM1_Init(20000); //setando a freq do pwm em 20khz
PWM2_Init(20000);
PWM1_Start();
PWM2_Start();

while(1){

sinal = Adc_Read(0); // Lê a tensão no pino AN0 e converte em um valor de 0 a 1023
delay_us(30);
sinal >>=2; // descarta os dois bits menos significativos da leitura
sinal_180 = ((signed)sinal*-1)+255; // retira o valor complementar do valor lido
PWM1_Change_Duty(sinal); // pwm padrão
PWM2_Change_Duty(sinal_180); //pwm complementar
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++

É isso aí. Se compilar esse código e rodar no proteus funciona !!! Mas no pic não :cry:
fredtg
Bit
 
Mensagens: 19
Registrado em: 29 Mar 2007 10:34

Mensagempor fredtg » 04 Fev 2009 21:43

O circuito na proto é esse aí:

Imagem
fredtg
Bit
 
Mensagens: 19
Registrado em: 29 Mar 2007 10:34

Mensagempor ffcprog » 04 Fev 2009 22:04

fredtg escreveu:O código completo é este aqui:

++++++++++++++++++++++++++++++++++++++++++++++++
unsigned sinal; //mais eim ??
signed sinal_180; // como ??

void main(){
INTCON.GIE = 0; //desabilitando interrupções globais
INTCON.PEIE = 0; //desabilitando interrupções periféricas
INTCON.T0IE = 0; //desabilitando interrupções do TMR0
INTCON.INTE = 0; //desabilitando interrupções externas do RB0
INTCON.RBIE = 0; //desabilitando interrupções por mudanças em RB

//intcon = 0xXX ??? pode ser ?
TRISA = 0xFF; //configurando os pinos A como entrada
PORTA = 0x00;
TRISB = 0x00; //configurando os pinos B como saída
PORTB = 0x00;
TRISC = 0x00; //configurando os pinos C como saída
PORTC = 0x00;
TRISD = 0x00; //configurando os pinos D como saída
PORTD = 0x00;
ADCON1 = 0X80; //registrador p justifica a direita, setando portas
//como analógicas e setando Vdd como tensão de ref

CCP1CON.CCP1M3 = 1; //habilitando o PWM em CCP1
CCP1CON.CCP1M2 = 1;
CCP1CON.CCP1M1 = 1;
CCP1CON.CCP1M0 = 1;

//ccp1con = 0xXX ?? pode também ?

CCP2CON.CCP2M3 = 1; //habilitando o PWM em CCP2
CCP2CON.CCP2M2 = 1;
CCP2CON.CCP2M1 = 1;
CCP2CON.CCP2M0 = 1;

//ccp2con = 0xXX ?? pode também ?

PWM1_Init(20000); //setando a freq do pwm em 20khz
PWM2_Init(20000);
PWM1_Start();
PWM2_Start();

while(1){

sinal = Adc_Read(0) >>2;
delay_us(30);
sinal_180 = ((signed)sinal*-1)+255; // que ?
PWM1_Change_Duty(sinal); // vocÊ disse unsigned "de uma olhada //como ficou o asm PWM2_Change_Duty(sinal_180); //pwm complementar
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++

É isso aí. Se compilar esse código e rodar no proteus funciona !!! Mas no pic não :cry:


viu, da uma olhada aí no codigo, e explica direitinho que bagunça é essa e o que você esta fazendo com o pwm2_changexxxx...
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor otavio luiz » 05 Fev 2009 08:41

outra coisa, voce não falou qual pic esta usando então acredito que seja o 16f877A, voce deve desligar os comparadores que ele possue internamente senão vira uma bagunça mesmo com as interrupções desligadas.
Lembre-se, zona de Fresnel não é nenhuma franquia de puteiro.
Avatar do usuário
otavio luiz
Byte
 
Mensagens: 257
Registrado em: 11 Out 2006 13:56
Localização: Barretos - SP, terra de Peão

Mensagempor fredtg » 05 Fev 2009 12:15

otavio luiz escreveu:outra coisa, voce não falou qual pic esta usando então acredito que seja o 16f877A, voce deve desligar os comparadores que ele possue internamente senão vira uma bagunça mesmo com as interrupções desligadas.


Isso mesmo, estou usando o 877(não é o 877A). Ele não possui o registrador CMxCONx. Os comparadores são desligados ao ajustar o PWM, no registrador CCPxCON.

ffcprog,
Realmente me esqueci de comentar oq o programa faz, ou melhor oq eu quero que ele faça!!!hehehe
Quero gerar dois pwm, um complementar ao outro. Ou seja, se um possuir a razão cíclica de 80% o outro tem que ter rc de 20%. Além disso, quero defasar de 180° um pwm do outro. Por isso multiplico por -1.

O meu sinal de entrada é uma senóide que varia de 0 a 5V. No pwm1 eu leio com o adc o valor do sinal e esse valor é a própria razão cíclica.

Ex: Vamos supor que o valor lido no adc seja de 4V. O valor lido no adc corresponde ao valor 818(adc de 10bits = 1024). Como a rotina de pwm do mikroc pede para setar a razao ciclica com valor entre 0 e 255, tenho que converter a leitura do adc de 10bits para 8bits(sinal = Adc_Read(0) >>2). Pois bem, assim meu pwm1 já está ajustado.

Para o pwm2, quero usar uma defasagem de 180° mais razão complementar. Pegando a mesma leitura do adc anterior, 4V, multiplico esse valor por -1. Terei -4, depois somo 5(255 = razão de 100%). Terei como resultado 1. Ajusto então meu pwm2 com essa razao, 20%

Não sei se fui claro, mas é isso.
fredtg
Bit
 
Mensagens: 19
Registrado em: 29 Mar 2007 10:34

Mensagempor ffcprog » 05 Fev 2009 13:03

tiozinho. só por idéia mesmo.

faz isso aqui e faça um teste pra ver se vai dar pau no pwm.

PWM1_Init(10000); //setando a freq do pwm em 20khz
PWM2_Init(10000);
PWM1_Start();
PWM2_Start();

while(1){

sinal = Adc_Read(0) >>2;
sinal_180 = (sinal) - 255?
PWM1_Change_Duty(sinal);
PWM2_Change_Duty(sinal_180);
delay_ms(5);
}

observe se desta forma, os pwm´s estão funcionando perfeitamente;;;

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

AnteriorPróximo

Voltar para PIC

Quem está online

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

cron

x