Fórum

Ajuda com outro pro...
 
Notifications
Clear all

Ajuda com outro programa

41 Posts
2 Users
0 Likes
75.3 K Leituras
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Boa noite Claudio, olha eu incomodando novamente. Gostaria de saber se tem como fazer um pwm com  com 60hz,  tentei configurar no wizard do CCS mas, mas quando testo fica na frequencia mínima de 244hz, preciso implementar duas chaves para aumentar e diminuir o pwm e um display que mostrasse o passo de 10 em 10 %, e um temporizador que pudesse ajustar de 0 à 60 min, e se possível guardasse as informações na eeprom. Pode me ajudar?

Sérgio


   
Quote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Parece um projeto meio complexo. Poderia  explicar a aplicação deste equipamento? Como seria usado?


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Boa tarde Claudio, ideia é gerar alta tensão através de uma bobina automotiva para fins de pintura eletrostática e controlar o tempo em que ela fica ligada. Para isso preciso regular a largura do pulso e com isso a tesão de mat  e um temporizador para marcar o tempo. Seria possível usar um display de ldc ou 7 seg?

 


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Vai usar algum retificador  + capacitor HV na saída da bobina? Eu não entendo muito de pintura eletrostática mas sei que necessita de polaridade correta para funcionar. E capacitores carregados com High Voltage podem dar choques mortais!!! Vai ter controle de corrente para evitar isto?


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Boa noite meu caro amigo, Isso  é para um amigo que ta inventando isso! vamos torcer pra ele não morrer!! kkkk

ele  me pediu pra fazer só o controle pwm e vai usar uma bobina automotiva pra isso!

dei ideia de usar o pwm para controlar a voltagem.

por isso preciso de uma frequencia  de 60 à 100hz

 


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

O pic se configurado para 4mhz gera um pwm  minimo de 244hz, então configurei para 1mhz e ai ele baixou pra 61hz . Estou tentando escrever o código e posto pra você dar um analisada depois ok?

Sérgio


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Boa noite Claudio, estou postando o que consegui fazer e simular no proteus até agora, ajustei a frequência do pic para 2mhz e consegui um pwm de 125hz,

coloquei as chaves e consegui variar o pwm em passo de 10 em 10, o display até consegui de certa forma marcar os incremento das chaves, mas não consigo parar a contagem quando chega no maximo aí ele fica contando e mostrando no display, exemplo: 70, 80,90, 100 teria que parar não contar mais  e só decrementar quando apertasse a tecla de decremento do pwm acho que é isso. E tem como colocar um temporizador  não precisa ser preciso de 10, 20, 30, 40, 50 e 60 min?

 

segue o codigo:

#include <main.h>

#include <lcd.c>
int x=0;

signed int16 dutyPwm=0;

void main()
{
setup_timer_2(T2_DIV_BY_16,249,1); //8,0 ms overflow, 8,0 ms interrupt

setup_ccp1(CCP_PWM);
set_pwm1_duty((int16)0);

lcd_init();

printf(lcd_putc," GERADOR DE MAT \n VERSAO 1.0 ");// mensagem de apresentação
delay_ms(2000);
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u",x);
printf(lcd_putc,"\nTEMPO:0");

while(TRUE)
{

if(input(pin_a0)==0) { // aumenta duty pmw
dutyPwm = dutyPwm + 100;
if(dutyPwm>900){dutyPwm=900;}
set_pwm1_duty((int16)dutyPwm);
delay_ms(300);
x=x+10;
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u",x);
delay_ms(20);

}

if(input(pin_a1)==0){ // diminui o duty pwm
dutyPwm = dutyPwm - 100;
if (dutyPwm<0){dutyPwm=0;}
set_pwm1_duty((int16)dutyPwm);
delay_ms(300);
x=x-10;
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u",x);
delay_ms(20);

}

}
}


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Bom dia Claudio, consegui limitar a contagem onde eu precisava! até agora no simulador tudo certo! vou postar o código pra você dar uma olhada:

#include <main.h>

#include <lcd.c>
signed int conta=0;
signed int tempo=0;

signed int16 dutyPwm=0;

void main()
{
setup_timer_2(T2_DIV_BY_16,249,1); //8,0 ms overflow, 8,0 ms interrupt

setup_ccp1(CCP_PWM);
set_pwm1_duty((int16)0);

lcd_init();

printf(lcd_putc," GERADOR DE MAT \n VERSAO 1.0 ");// mensagem de apresentação
delay_ms(2000);
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u",conta);
printf(lcd_putc,"\nTEMPO:%u",tempo);

while(TRUE)
{

if(input(pin_a0)==0) { // aumenta duty pmw
dutyPwm = dutyPwm + 100;
if(dutyPwm>900){dutyPwm=900;}
set_pwm1_duty((int16)dutyPwm);
delay_ms(300);
conta=conta+10;
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);

if(conta>100){conta=100;// limita contador em 100
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);

}

}

if(input(pin_a1)==0){ // diminui o duty pwm
dutyPwm = dutyPwm - 100;
if (dutyPwm<0){dutyPwm=0;}
set_pwm1_duty((int16)dutyPwm);
delay_ms(300);
conta=conta-10;
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);
if(conta<0){conta=0;// limita contador em 0
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);

}
}

}
}


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Olá Sergio Luiz!

Você está indo bem. Apenas para reduzir o código poderá fazer o teste de limitação logo após o incremento ou decremento da variável 'conta'.

 

Por ex.

Código atual>

delay_ms(300);
conta=conta+10;
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);

if(conta>100){conta=100;// limita contador em 100
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);

 

modificado>

delay_ms(300);
conta=conta+10;

if(conta>100){conta=100;// limita contador em 100   //>>>>>>>>>>>>>>>>>>>>
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);

/* Eliminando abaixo pois está em duplicação

if(conta>100){conta=100;// limita contador em 100
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);

*/

Faça o mesmo no decremento>

Atual>

delay_ms(300);
conta=conta-10;
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);
if(conta<0){conta=0;// limita contador em 0
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);

modificado>

delay_ms(300);
conta=conta-10;

if(conta<0){conta=0;// limita contador em 0
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);

/* elimine o abaixo
if(conta<0){conta=0;// limita contador em 0
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);

*/


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Ola Claudio, alguma sugestão agora para colocar o temporizador? poderia ser sem precisão mesmo, aproximado ja que estou usando o oscilador interno do pic à 2Mhz , pode ser uma chave para incremento outra para decremento e uma saída para relé.


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Boa noite Claudio, fiz a alteração que vc sugeriu no codigo para testar a variável mas ele só atualiza o display quando chegar em 100!

alguma sugestão??

Do jeito que eu tinha feito a cada passo do pwm ele atualizava de 10 em 10.

Sérgio

 


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Ola Claudio, consegui fazer a contagem agora segue a mudança que fiz:

while(TRUE)
{

if(input(pin_a0)==0) { // aumenta duty pmw
dutyPwm = dutyPwm + 100;
if(dutyPwm>900){dutyPwm=900;}
set_pwm1_duty((int16)dutyPwm);
delay_ms(300);
conta=conta+10;
if(conta>100){conta=100;}//limita contador em 100
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);

}

if(input(pin_a1)==0){ // diminui o duty pwm
dutyPwm = dutyPwm - 100;
if (dutyPwm<0){dutyPwm=0;}
set_pwm1_duty((int16)dutyPwm);
delay_ms(300);
conta=conta-10;
if(conta<0){conta=0;}// limita contador em 0
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);

}

}
}

Vi uma método em um forum que alguém postou para um temporizar bem simples vou ver se funciona, se funcionar vou tentar usar a ideia.


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Opsss!!! Esse negócio de copiar e colar trás confusão de vez em quando, principalmente quando a gente não testa na prática.

Bem, foi uma  { (chave) a  mais no código:

if(conta>100){conta=100;// limita contador em 100 // erro pois tem " { " a mais

para:

if(conta>100)conta=100;// limita contador em 100 //>>>>>>>>>>>>>>>>>>>> sem a chave

 

e também:

if(conta<0){conta=0;// limita contador em 0   erro pois tem uma { a mais

para:

if(conta<0)conta=0;// limita contador em 0 ....sem {

 

(Obs.  Se conseguiu compilar, então obviamente vai sobrar uma " }" (chave fechando) em cada rotina.  Elimine-as).

 


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Sim verdade!! analisei isso ! ele compilou mas só atualizava quando chegava em 100! tirei a chave e coloquei somente {conta=100} e resolveu!!!

vou tentar implementar agora o temporizador, se não conseguir me da um help como sempre!!!

E obrigado pela ajuda!!!

 


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Boa noite Claudio, veja se consegue me ajudar, não consegui fazer o temporizador, pode me ajudar? o que fiz não funciona, não entendi direito, cachorro velho não aprende truques novos rsrs, segue o abaixo o que consegui, 

#include <main.h>

 

signed int conta=0;
signed int tempo=0;
signed int16 dutyPwm=0;
int cnt = 0;
int16 segundos=10;

 

 

#INT_TIMER0
void TIMER0_isr(void)
{

set_timer0(132); //carrega TMR0 com o valor
cnt++;

}

#include <lcd.c>

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16|RTCC_8_BIT); //8,1 ms overflow
setup_timer_2(T2_DIV_BY_16,249,1); //8,0 ms overflow, 8,0 ms interrupt

setup_ccp1(CCP_PWM);
set_pwm1_duty((int16)0);

enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_timer0(132);
output_low(rele);

lcd_init();
printf(lcd_putc," TESTE\n V.1");// mensagem de apresentação
delay_ms(2000);
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u",conta);
printf(lcd_putc,"\nTEMPO:%u",tempo);

while(TRUE)
{
if(input(up)==0) { // aumenta duty pmw
dutyPwm = dutyPwm + 60;
if(dutyPwm>600){dutyPwm=600;}
set_pwm1_duty((int16)dutyPwm);
delay_ms(300);
conta=conta+10;
if(conta>100){conta=100;}//limita contador em 100
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);

}

if(input(dw)==0){ // diminui o duty pwm
dutyPwm = dutyPwm - 60;
if (dutyPwm<0){dutyPwm=0;}
set_pwm1_duty((int16)dutyPwm);
delay_ms(300);
conta=conta-10;
if(conta<0){conta=0;}// limita contador em 0
printf(lcd_putc,"\f");
printf(lcd_putc,"CICLO:%u\nTEMPO:%u",conta,tempo);
delay_ms(20);
}

if(cnt==124){

cnt=0;

segundos=segundos-1;
output_high(rele);
if(segundos==0){
output_low(rele);
}

}

}

}

}

}

 o que preciso é de uma tecla para ajustar os minutos pode ser de 10 em 10 min até 1 hora, e um botão para start do temporizador e atualizar no display, se puder me ajudar ficarei grato.

Sérgio


   
ReplyQuote
Page 1 / 3
Back To Top