Ir ao conteúdo
  • Cadastre-se

PIC pwm com pic 18f4550


Posts recomendados

Boa tarde pessoal,

 

sou novo aqui, é meu primeiro post, e como iniciante na área de programação, principalmente por microcontroladores preciso de ajuda, espero que me ajudem o mais rápido que puder, tenho menos de um mês pra entregar esse projeto. O projeto tem como ideal um carro que segue linha através da variação da resistencia de um LDR, e esse acionamento só só será possivel se o outro sensor estiver acionado, ou seja, o carro só irá andar quando o outro sensor localizado no atuador hidráulico estiver acionado (estabilizado para certificar de que há algo no atuador), e o atuador só irá funcionar depois que esse sensor for acionado, acionando a válvula solenoide.

Primeiramente para iniciar a programação, como nunca tinha programado pic antes, resolvi fazer por partes, e comecei primeiro pelo acionamento dos motores do carro, e já estou preso nessa situação, eu não sei se minha lógica está errada, ou se minha lógica de eletrônica está errada, já vi vários vídeos, estudei muito sobre controle de motores, por ponte h, ou por transistores, enfim. estou postando, mas continuo a estudar eletrônica analógica principalmente, já que identifiquei uma deficiência minha. Segue imagem do proteus onde simulo o código e segue também o código que até agora desenvolvi. Obrigado desde já

/*
   POR MARCOS VINICIUS SILVA BENTO    6º ENGENHARIA MECATRÔNICA- UNIVERSIDADE TIRADENTES
   PROJETO DO CARRO COM ATUADOR HIDRÁULICO
*/
unsigned duty=10;  // variável de velocidade de pwm inicada em 10
unsigned adc=0;   // variável para taxa de variação sensor1
unsigned adc1=0; //variável para taxa de variação do sensor2
void main() {

CMCON=0x07;    //desativa comparador analógico
ADCON0=0X01;   // ativa conversor AD e entrada analógica
ADCON1=0X0E;   // configura entrada analógica
pwm1_start();     // habilita pwm
pwm1_init(1000); // configuranção frequencia 1MHhz
pwm1_set_duty((duty*255)/100); //configuração pwm

pwm2_start();
pwm2_init(1000);
pwm2_set_duty((duty*255)/100);

while (1) {

adc=ADC_READ(0);//lê o conversor AD
adc1=ADC_READ(0);
pwm1_set_duty((duty*255)/100);//Lê a percentagame da velocidade do pwm
pwm2_set_duty((duty*255)/100);

if ((adc && adc1)<200) {

duty++;
delay_us(20);

if (duty>40) duty==40;
}//fim se
if ((adc && adc1)>200) {

duty--;
delay_us(20);

if (duty==0) duty ==0;

}//fim se 2
}//fim while

}//fim void main

pic.png

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1Mhz é meio muito. De 1K a 10Khz tá bão. você quer variar o pwm em função do valor anaĺogico?

Configure o pwm para 10 bits e alimente diretamente a função.

Facilite a vida com algo como...
 

for (;;)
{
adc=read_adc(0);
pwm1_set_duty(adc);
adc=read_adc(1);
pwm2_set_duty(adc);
...
...
}

...só pra você ver o trem andando

Link para o comentário
Compartilhar em outros sites

Em 19/03/2017 às 18:14, Isadora Ferraz disse:

1Mhz é meio muito. De 1K a 10Khz tá bão. você quer variar o pwm em função do valor anaĺogico?

Configure o pwm para 10 bits e alimente diretamente a função.

Facilite a vida com algo como...
 


for (;;)
{
adc=read_adc(0);
pwm1_set_duty(adc);
adc=read_adc(1);
pwm2_set_duty(adc);
...
...
}

...só pra você ver o trem andando

beleza, alterei o programa, já que não preciso controlar realmente a velocidade, só preciso dizer quanto eu quero que seja a velocidade e parar ela quando os sensores não corresponderem, eu não sei se o proteus está dando bug, mas quando eu alterei com a nova lógica, ele funciona, mas, não consigo ficar alterando tipo (ativar o sensor os motores funcionam, altero o estado do sensor os motores param), mas quando tento voltar e ativar o sensor de novo, os motores não rodam.

/*
   POR MARCOS VINICIUS SILVA BENTO    6º ENGENHARIA MECATRÔNICA- UNIVERSIDADE TIRADENTES
   PROJETO DO CARRO COM ATUADOR HIDRÁULICO
*/
unsigned duty=50;  // variável de velocidade de pwm iniciada em 50
unsigned adc=0;   // variável para taxa de variação sensor1
unsigned adc1=0; //variável para taxa de variação do sensor2
void main() {

CMCON=0x07;    //desativa comparador analógico
ADCON0=0X01;   // ativa conversor AD e entrada analógica
ADCON1=0X0E;   // configura entrada analógica
pwm1_start();     // habilita pwm
pwm1_init(10000); // configuranção frequência 10kHhz
pwm1_set_duty((duty*255)/100); //configuração pwm


pwm2_start();
pwm2_init(10000);
pwm2_set_duty((duty*255)/100);


while (1) {

adc=ADC_READ(0);//lê o conversor AD
adc1=ADC_READ(0);
pwm1_set_duty(duty);//Lê a percentagame da velocidade do pwm
pwm2_set_duty(duty);

if ((adc && adc1)<200) {
adc=ADC_READ(0);
pwm1_set_duty(adc);
adc1=ADC_READ(1);
pwm2_set_duty(adc1);

} // fim se1

if ((adc && adc1)>250) {
pwm1_stop();
pwm2_stop();

}// fim se2
}// fim while
}//fim void main

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Neste caso deixe fixo o pwm uai. Nem precisa e nem deve estar no loop. Inicialize na inicialização e altere só quando desejar alterar

E faça tipo isso

3 horas atrás, marcmec disse:

if ((adc && adc1)>250) {
pwm1_stop();
pwm2_stop();

que está errado. O correto:

if ((adc>250) && (adc1>250) {

Por gentileza dê uma olhadela nos conceitos dos operadores lógicos do C

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom dia galera, 

 

resolvi compartilhar a solução do problema, e a solução foi dada pela dica da Isadora, consiste em aplicar uma frequência coerente ao microcontrolador, e também vai depender da diferença da taxa de variação da variável ligada ao pino do conversor AD. Segue o código, e o circuito do seguidor de linha está logo acima no primeiro post. valeu.

/*
   POR MARCOS VINICIUS SILVA BENTO    6º ENGENHARIA MECATRÔNICA- UNIVERSIDADE TIRADENTES
   PROJETO DO CARRO COM ATUADOR HIDRÁULICO
*/
unsigned duty=50, duty1=50;  // variável de velocidade de pwm inicada em 10
unsigned adc=0;   // variável para taxa de variação sensor1
unsigned adc1=0; //variável para taxa de variação do sensor2
void main() {

CMCON=0x07;    //desativa comparador analógico
ADCON0=0X01;   // ativa conversor AD e entrada analógica
ADCON1=0X0E;   // configura entrada analógica
pwm1_start();     // habilita pwm
pwm1_init(5000); // configuranção frequência 10kHhz
pwm1_set_duty((duty*255)/100); //configuração pwm

pwm2_start();
pwm2_init(5000);
pwm2_set_duty((duty1*255)/100);

while (1) {

adc=ADC_READ(0);//lê o conversor AD
adc1=ADC_READ(0);
pwm1_set_duty((duty*255)/100);//Lê a percentagame da velocidade do pwm
pwm2_set_duty((duty1*255)/100);

if ((adc<100) && (adc1<100)) {
adc=ADC_READ(0);
adc1=ADC_READ(0);

pwm1_set_duty((duty*255)/100);
pwm2_set_duty((duty1*255)/100);

} // fim se1

if ((adc>500) && (adc1>500)) {
pwm1_stop();
pwm2_stop();

}// fim se2
}// fim while
}//fim void main

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!