Ajuda com outro programa  

Página 1 / 3 Próximo
  RSS
(@sergioluiz)
Membro Estimado

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

ResponderCitar (Quote)
Postado : 24 de janeiro de 2018 18:39
(@clarios)
Membro de Reputação Moderator

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

ResponderCitar (Quote)
Postado : 25 de janeiro de 2018 13:44
(@sergioluiz)
Membro Estimado

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?

 

ResponderCitar (Quote)
Postado : 25 de janeiro de 2018 14:38
(@clarios)
Membro de Reputação Moderator

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?

ResponderCitar (Quote)
Postado : 26 de janeiro de 2018 14:22
(@sergioluiz)
Membro Estimado

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

 

ResponderCitar (Quote)
Postado : 26 de janeiro de 2018 19:15
(@sergioluiz)
Membro Estimado

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

ResponderCitar (Quote)
Postado : 26 de janeiro de 2018 19:20
(@sergioluiz)
Membro Estimado

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);

}

}
}

ResponderCitar (Quote)
Postado : 31 de janeiro de 2018 19:11
(@sergioluiz)
Membro Estimado

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);

}
}

}
}

ResponderCitar (Quote)
Postado : 2 de fevereiro de 2018 11:14
(@clarios)
Membro de Reputação Moderator

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);

*/

ResponderCitar (Quote)
Postado : 2 de fevereiro de 2018 12:37
(@sergioluiz)
Membro Estimado

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é.

ResponderCitar (Quote)
Postado : 2 de fevereiro de 2018 16:30
(@sergioluiz)
Membro Estimado

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

 

ResponderCitar (Quote)
Postado : 2 de fevereiro de 2018 19:25
(@sergioluiz)
Membro Estimado

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.

ResponderCitar (Quote)
Postado : 2 de fevereiro de 2018 21:13
(@clarios)
Membro de Reputação Moderator

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).

 

ResponderCitar (Quote)
Postado : 2 de fevereiro de 2018 21:13
(@sergioluiz)
Membro Estimado

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!!!

 

ResponderCitar (Quote)
Postado : 2 de fevereiro de 2018 21:34
(@sergioluiz)
Membro Estimado

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

ResponderCitar (Quote)
Postado : 16 de fevereiro de 2018 18:06
Página 1 / 3 Próximo
Share: