Ir ao conteúdo
  • Cadastre-se

marcmec

Membro Júnior
  • Posts

    11
  • Cadastrado em

  • Última visita

posts postados por marcmec

  1. @Isadora Ferraz

     

    consegui!!!!! lembrei que  Unsigned char  varia de  0-255. coloquei uma variável de tempo e ficou assim o código.

    
    
    //----------------------------função do sensor seguidor de linha------------------------------------------------------------------
    
    //----------------------------------main--------------------------------------
    
    
    
    
    #pragma orgall 0x1000
    unsigned char tempo=50;
    void main  ()org 0x1000
    {
    //intcon=0b11100100;
    
    //setup_vref (false);
    trisd= 0; //metade das portas como entrada
    portd=0;
    
    CMCON=0x07;
    portb.f0=1;
    while (tempo<100)
    {
    if(!portb.f1){
    tempo++;
    delay_ms(100);
    portd.f0 = 1;
    portd.f1 = 1;
    portd.f2 = 0;
    portd.f3 = 0;
    delay_ms(100);
    portd.f0=0;
    portd.f1=1;
    portd.f2=1;
    portd.f3=0;
    delay_ms(100);
    portd.f0 = 0;
    portd.f1 = 0;
    portd.f2 = 1;
    portd.f3 = 1;
    delay_ms(100);
    portd.f0 = 1;
    portd.f1 = 0;
    portd.f2 = 0;
    portd.f3 = 1;
    delay_ms(100);
    }
    }//fim if
    }

    assim ele vai funcionar até atingir a variável tempo. obrigado.

  2. Em 2017-5-25 às 08:03, Isadora Ferraz disse:

    Desistir de algo fácil??! Difícil viu!! Seus limites estão pequenos. Trate de pensar grande.

    Achar algo prontinho e personalizado para @marcmec deve ser 1 pouco difícil mas com quase menos de 1 clique no google e  achei isso

    E lá dentro, isso

     

    Bem, mas isso...

    ...é exatamente o que você programou uai.

    são suas próprias "palavras"

    pra o que você quer seria algo como:

    
    for(;;){rodar_esquerda(); while(!S_1);while(S_1);}

    Hás de ser apresentado ao debouncing (google it)

     

    Me lembrei do site rogercom que falava sobre motor de passo. Nem sei se existe mais. Era bem legal. O google me retornou isso

    https://sites.google.com/site/suportearhte/controle-motor-de-passo

     

    Eu já tinha visto e estudado todos esses links que voce passou, não é algo personalizado, estou tentando programar com o que aprendi, e quando fui pesquisar sobre funções de botão ou varredura de botão, foi indicado o estudo de interrupção, e por isso desisti dos outros métodos, e comecei a estudar interrupção, quando tiro o (while(!s_1); ou mudo para while(S_1);) não faz nenhuma ação. Pra mim é difícil, comecei a ver pic esse ano...então...consegui configurar os registradores, mas ainda assim não atende o que quero, vou tentar fazer o que voce disse, mas até domingo vou fechar o tópico, esse projeto é pra hoje, ou era pra ser apresentado hoje, enfim. obg.

  3. estou pra desistir, eu não aguento mais namoral, eu tô tentando funcionar pela terceira forma, não sei se estou saturado, ou estou deixando passar algo, mas não funciona nada que tento, nem no proteus roda. e sim, eu já entendi que se eu colocar o bit pra rodar [1,0,0,0] caracteriza 1/4 de volta, e se eu colocar [1,1,0,0] caracteriza 1/2 volta.  mas nem com essa dica que você deu, eu consigo fazer isso. Algo que esqueci de mencionar, não sei se muda muita coisa, eu tô utilizando o driver l293d para este motor, que é bipolar de 4 fios. enquanto você não responde vou tentando aqui.

    #define S_1 rb0_bit
    
    #pragma orgall 0x1000
    void main() org 0x1000 {
      unsigned char d=1;
    cmcon=7;
    
    
    TRISB=0;
    
    portd=d;
     while (1){
    
    
    if(!S_1){
    
    d<<=1;
    delay_ms(50);
    if(d>8) d=1;
    
    }
    
    }//while
    
    }//void

     o codigo que consegui fazer com que ao menos quando aperto o botão o motor funciona é este.

    #pragma orgall 0x1000
    #define S_1 Rb1_bit
    #define S_2 Rb2_bit
    //--------------------------------rodar direita---------------------------
    void rodar_direita()
    {
    portd.f1 = 1;
    portd.f2 = 1;
    portd.f3 = 0;
    portd.f4 = 0;
    delay_ms(100);
    portd.f1 = 0;
    portd.f2 = 1;
    portd.f3 = 1;
    portd.f4 = 0;
    delay_ms(100);
    }
    void rodar_esquerda(){
    portd.f1 = 0;
    portd.f2 = 0;
    portd.f3 = 1;
    portd.f4 = 1;
    delay_ms(100);
    portd.f1=0;
    portd.f2=1;
    portd.f3=0;
    portd.f4=1;
    delay_ms(100);
    }
    
    //----------------------------------main--------------------------------------
    void main  ()org 0x1000
    {
    trisd= (0xf0); //metade das portas como entrada
    CMCON=0x07;
    while (1)
    {
       if (S_1)
       {
    
       do{
    rodar_direita();
    
       delay_ms(50);}
       while(S_1);
    
    if (!S_1)
       {
    
       do{
       rodar_esquerda();}
       while(!S_1);
    
       }
               }
    }
    }

    e mesmo assim ele gira quando aperto o botão, mas ele não executa o passo por cada aperto no botão, fica girando e girando, até soltar o botão. obrigado desde já, mas estou muito cansado a parte de programar o projeto ficou comigo, e não consigo fazer ao menos isso.

  4. #define S_1 RB0_bit
    void interrupt(){
    
     // houve interrupção externa
    TMR0IF=0; // reinicia a flag
    
    
    
    if(!S_1) {
    delay_ms(50);
    parar();
    }
    
    
    
    
    }        //fim interrupt
    void parar(){ // 1 passo do motor de passo
    
    portd.f0=1;
    portd.f1=0;
    portd.f2=0;
    portd.f3=0;
    
    }//fim função parar
    
    void main() {
    
    cmcon=7;
    
    GIE_bit=1;
    PEIE_bit=1;
    T0PS0:0x6;   // ciclo de instrução 1:128 8bits
    TMR0IE=1;		//habilita a interrupção no tmr0
    TMR0IF=0x06; // inicia tmr0 ciclo de 250
    
    TRISB=1;
    PORTB=1;
    
     while (1){
    
    
    
    }//fim se
    
    
    
    }//fim while
    
    }//fim void

    Galera, esse é o código que estou testando, quero saber se há algo de errado com ele, pois segui passo a passo uma aula, e sim, já tentei os codigos pra led e tudo mais, estou tentando acionar um motor de passo há mais de 1 mês, e não consigo aciona-lo apenas por um momento,( dar um passo e parar a execução mesmo com o botão estando pressionado, o botão simula um sensor)- e estudei interrupções pra isso, segue em anexo o erro que está dando no mikroc, estou criando o tópico, porque cansei de tentar resolver sozinho, e visto que, já assisti varias aulas, li muitos artigos, até aqui vi alguns artigos, mas não responderam minha dúvida. enfim é isso.

    erro no código.png

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

     

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

     

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

     

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!