Página 1 de 3

Problemas com a implementação de PWM

MensagemEnviado: 18 Dez 2008 20:21
por fredtg
Pessoal, preciso da ajuda de vc´s. Estou querendo gerar um sinal pwm usando um sinal analógico externo para determinar a razão cíclica. Estou usando o MikroC 8.2 Quando simulo com o PIC Simulator ou o próprio MikroC funciona blz, mas quando coloco na proto, hummm. O pwm resultante não tem sincronismo.
Estou desconfiando do pic, mas vale a pena dar uma revisada no código:

//testa PWM

unsigned int leitura;
char vref;

void main(){

trisa = 0xff;
trisb = 0x00;
trisc = 0x00;
adcon1 = 0x82;
pwm1_init(19530);
pwm1_start();
razao = 0;

while(1){
leitura = adc_read(0);
vref = leitura>>2; //converte o valor lido para 8bits
pwm1_change_duty(vref);
delay_us(250);
}
}

Na gravação, para um cristal de 20MHz uso HS.

MensagemEnviado: 18 Dez 2008 20:56
por Wagner de Queiroz
nao é a protoboard?

Ja vi problemas terriveis com protoboard nova. dai fizeram na placa padrao ou corroer numa placa a caneta e resolve. tente ver isso.

MensagemEnviado: 18 Dez 2008 21:10
por fredtg
Não é a proto não. Sei dos problemas que acontecem, mas nesse caso só tem alimentação, sinal de entrada e medição. Praticamente liguei os fios nos locais onde os pinos se encaixam. Estou desconfiado do pic mesmo, mas como não tenho outro para testar estou pedindo ajuda para conferir o código

MensagemEnviado: 18 Dez 2008 21:39
por ffcprog
você está setando o duty do pwm em função da tensão //?

explique o que está errado.

Lembrando que !! no proteus quando você seta VREF para os 5V da fonte, são 5V mesmo..
Ja com regulador pode ser 4.3 5.2.....

ffcprog

MensagemEnviado: 19 Dez 2008 00:19
por fredtg
ffcprog escreveu:você está setando o duty do pwm em função da tensão //?

explique o que está errado.

Lembrando que !! no proteus quando você seta VREF para os 5V da fonte, são 5V mesmo..
Ja com regulador pode ser 4.3 5.2.....

ffcprog


o duty do pwm é um valor que pode variar de 0 a 255. Como o AD é de 10bits, estou pegando os 8 bits mais significativos e guardando na variável vref. Portanto, após a exclusão dos 2 bits menos significativos, a variável vref guardará valores entre 0 e 255.

Quando ligo a saída CCP1 no osciloscópio, o pwm ora mostra os pulsos com o duty ajustado ora não.

Para verificar se o programa estava correto, peguei um pic 16F628, que não tem AD, e fixei o duty. O pwm mostrado ficou 10! Fiz o mesmo com o pic em questão (16F873A), tirei o AD fora e ajustei o duty com um valor fixo. O problema persistiu.

Detalhe, não estou usando o Proteus não. Usei o Pic Simulator IDE

MensagemEnviado: 19 Dez 2008 10:11
por Peters
unsigned int no mikroC não é 8 bits???
Vc não está truncando os valores?

MensagemEnviado: 19 Dez 2008 10:37
por fredtg
Peters escreveu:unsigned int no mikroC não é 8 bits???
Vc não está truncando os valores?


unsigned int no mikroC são 2 bytes, ou seja, de 0 a 65535.

MensagemEnviado: 19 Dez 2008 11:30
por ffcprog
humm, quer dizer que.
Se setar a frequencia do pwm, para 5khz, e duty para 127.
Tanto a frequencia quanto o duty, ficam variando sozinhos ?

Com certeza o problema esta no uControlador mesmo.

Porque se for problema de variação de fonte sem o bor estar ligado, a unica coisa que pode acontecer é tensão de pico do pwm variar, pois o pwm do pic é totalmente digital...

Sendo assim, tanto F quanto Dtcy deveriam estar estaveis....

ffcprog

MensagemEnviado: 03 Fev 2009 17:43
por fredtg
Para ilustrar oq está acontecendo

Imagem

Imagem

MensagemEnviado: 04 Fev 2009 07:05
por ffcprog
primo, faça o seguinte.

Coloque a parte basica do seu SC aqui pra "NÒIZ" darmos uma olhadinha, pode ser algum erro "ilógico!?" que esta passando batido.

ffcprog

MensagemEnviado: 04 Fev 2009 07:56
por otavio luiz
Bom, C não é minha área mas vou te dar uma dica, configura o conversor AD do pic pra justificar o valor lido à esqueda, depois leia somente o registrador da parte alta do valor que ele já estara em 8 bits, eu não sei como funciona esta instrução adc_read mas voce pode fazer isso não mão mesmo, seta o bit de inicio de conversão depois fica monitorando o flag de fim de conversão depois continua com o resto do prog. Se quiser voce pode utilizar a interrupção pra isso, basta setar o inico de conversão e aguardar a interrupção, após ela ocorrer basta tratar a interrupção.

MensagemEnviado: 04 Fev 2009 08:43
por fredtg
ffcprog escreveu:primo, faça o seguinte.

Coloque a parte basica do seu SC aqui pra "NÒIZ" darmos uma olhadinha, pode ser algum erro "ilógico!?" que esta passando batido.

ffcprog


Ok, mas oq é SC?

MensagemEnviado: 04 Fev 2009 08:50
por joao
Eu chutaria que é:
SC = Source code(Código Fonte)


[]'s

MensagemEnviado: 04 Fev 2009 10:31
por fredtg
otavio luiz escreveu:Bom, C não é minha área mas vou te dar uma dica, configura o conversor AD do pic pra justificar o valor lido à esqueda, depois leia somente o registrador da parte alta do valor que ele já estara em 8 bits, eu não sei como funciona esta instrução adc_read mas voce pode fazer isso não mão mesmo, seta o bit de inicio de conversão depois fica monitorando o flag de fim de conversão depois continua com o resto do prog. Se quiser voce pode utilizar a interrupção pra isso, basta setar o inico de conversão e aguardar a interrupção, após ela ocorrer basta tratar a interrupção.


Otavio, mesmo só usando a rotina de pwm do compilador MikroC o problema continua. Pelas formas de ondas capturadas com o osciloscópio da para perceber que o tempo de falha e o tempo em que o pwm funciona é o mesmo. Portanto, o problema não e aleatório.

Fiz os testes com os pic 16F628(funcionou), 16F690(funcionou), 16F873A(apresentou o problema) e 16F877(apresentou o problema). Basicamente o código fonte é o mesmo que foi postado anteriormente, ou seja:

void main(){
PWM_Init(5000);
PWM_Start();
while(1){
PWM_Change_Duty(160);}}

fusíveis ligados: HS(estou usando cristal de 20MHz) e Power Up time

MensagemEnviado: 04 Fev 2009 10:39
por ffcprog
void main(){
PWM1_Init(5000);
PWM1_Start();
PWM1_Change_Duty(160);
while(1){
//tenta assim, e veja se o problema acaba.

}
}

ffcprog