Ir ao conteúdo
  • Cadastre-se

Bobinadeira com PIC - Dúvidas


Posts recomendados

Boa noite galera, estou desenvolvendo uma mini bobinadeira de papel. porém estou com duvidas e gostaria da ajuda do pessoal do forum.

 

Segue a minha lógica que quero fazer. 

 

Quando o sensor esta em nivel 1 liga um motor de passo para o sentido horario, 

 
Quando o sensor esta em nivel 0 liga um motor de passo para o sentido anti -horario,
 
porém este sensor caso detecte o nivel 0 ou 1 por mais de 3 segundos consecutivos, o mesmo deve desligar os motores de passo e acionar um relé. O sistema só volta na condição normal quando o botão reset for pressionado.

 

Qual a melhor maneira de se fazer isso ?

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1° - crie um tabela pro motor

const unsigned char tabela[]={0b0011;0b0110,...etc}

2° - aplique-a inedxadamente sequencialmente num por qualquer

PORTB=tabela[i];delay(velocidade_do_motor);

3° - faça depender de um bit

if (RA0) i++; else i--;

4° - limite o tamanho da do index da tabela

if (i>3) i=0;

Como o sensor só tem 2 estados, o sistema só vai funcionar 3 segundos mesmo caso use o pino como digital. Tente usar o ad pra ver mais estados. 0, meio a meio, 1 e use 2 resistores de 4k7

vcc...[4k7]...[pinoRA0]...[4k7]...[gnd]

Neste caso TEM que aplicar 0 e 1 no pino

abç

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

1° - crie um tabela pro motor

const unsigned char tabela[]={0b0011;0b0110,...etc}

2° - aplique-a inedxadamente sequencialmente num por qualquer

PORTB=tabela[i];delay(velocidade_do_motor);

3° - faça depender de um bit

if (RA0) i++; else i--;

4° - limite o tamanho da do index da tabela

if (i>3) i=0;

Como o sensor só tem 2 estados, o sistema só vai funcionar 3 segundos mesmo caso use o pino como digital. Tente usar o ad pra ver mais estados. 0, meio a meio, 1 e use 2 resistores de 4k7

vcc...[4k7]...[pinoRA0]...[4k7]...[gnd]

Neste caso TEM que aplicar 0 e 1 no pino

abç

Entendi.... porém quando eu uso o delay  ms o programa fica parada aguardando a esse tempo para depois tomar uma ação, correto ? Pois eu preciso de algo que gire o motor e conte o tempo ao mesmo tempo. Não sei se deu para entender muito bem......

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

o delay é pra controlar a velocidade do motor. Bom, pra dar um tempo e girar você vai ter que ter algum conhecimento dos timers do mc. Mais especificamente nas interrupções por timer. Dê uma olhadela nos conceitos de interrupt e depois no datasheet do seu mc. Né difícil não. As interrupções são uma mão na roda (no seu caso quase que literalmente). A grosso modo, é como se fosse um coprocessador. Uma segunda interrupt é um cocôprocessador... (fraquinha esta...)

abç

Link para o comentário
Compartilhar em outros sites

1° - crie um tabela pro motor

const unsigned char tabela[]={0b0011;0b0110,...etc}

2° - aplique-a inedxadamente sequencialmente num por qualquer

PORTB=tabela[i];delay(velocidade_do_motor);

3° - faça depender de um bit

if (RA0) i++; else i--;

4° - limite o tamanho da do index da tabela

if (i>3) i=0;

Como o sensor só tem 2 estados, o sistema só vai funcionar 3 segundos mesmo caso use o pino como digital. Tente usar o ad pra ver mais estados. 0, meio a meio, 1 e use 2 resistores de 4k7

vcc...[4k7]...[pinoRA0]...[4k7]...[gnd]

Neste caso TEM que aplicar 0 e 1 no pino

abç

Fiz essa programação porém  não esta 100%. Gostaria que quando o sistema estivesse em manual o led vermelho permanecesse acesso e o verde desligado e quando o sistema estiver em automatico o led vermelho esteja apagado e o verde acesso                                            

//****************************************************************************////   Configurar o TMR0 (8 bits) para que gere interrupções a cada 1 segundo.  ////****************************************************************************////****************************************************************************////  Vamos considerar que o CLK da CPU = 4 MHz.//  O clock interno será (4MHz/4) = 1 MHz //  Frequencia(F) = 1 / Periodo ----------->  Periodo(T) = 1/Frequencia//  Logo T = 1/1MHz = 1us. Logo a cada 1us TMR0 avança uma unidade.////  Como queremos gerar interrupções a cada 1 segundo, a freqüência de geração //  dessas interrupções deverá ser de 1 Hz.////  Entretanto o clock interno funciona em uma freqüência 1.000.000 maior que 1Hz.//  Usar o TMR0 sem o recurso do PRESCALER, necessitaria contar //  1.000.000 / 256 = 3906,25 interrupções.Isto se torna inviavel.//// Para resolver esse problema configuraremos o divisor de frequencia (PRESCALER)// Vamos considerar que o CLK da CPU = 4 MHz. Logo o CLK interno é de 1 MHz.// Se o PRESCALER estiver programado em 1:64, a freqüência de entrada no TMR0 // será de 1 MHz : 64 = 15625 Hz.//// setup_timer0 (RTCC_INTERNAL | RTCC_DIV_64); configuração do PRESCALER//// Se programarmos o TMR0 para dividir esse sinal 15625 por 125,// teremos um sinal de saída de 125 Hz, para isso, basta carregá-lo// a cada estouro de contagem com o valor:// 256– 125 = 131.// set_timer0 (131);  Inicialização do TMR0////Dessa forma após 125 interrupções,1s terá passado.//****************************************************************************////============================================================================//#include <16F876A.h>        //inclusão das configurações do pic utilizado#use delay(clock=4000000)   //clock interno#fuses HS,NOWDT,PUT,NOLVP   //configurações dos fusiveis//=======================DEFINIÇÃO DAS VARIAVEIS==============================// byte const horario[5]={0x00,0x01,0x02,0x04,0x08};// sequencia horária byte const anti_horario[5]={0X00,0x08,0x04,0x02,0x1}; //sequencia antihoráriaint i=0; //variavel utilizada para a contagem do loopint alarme=0;int contador=0;int status=0;//============================================================================////=======================DEFINIÇÃO DAS ENTRADAS DIGITAIS======================//#define  sensor          pin_A0        //sinal do sensor de filme#define  bt_horario      pin_A1        //botão para giro horario em manual#define  bt_antihorario  pin_A2        //botão para giro antihorario em manual#define  bt_aut_manual   pin_A3        //botão processo automatico//============================================================================////=======================DEFINIÇÃO DAS SAIDAS DIGITAIS========================//#define  led_vermelho   pin_C1    //define pino C1 como saida (led alarme)#define  led_verde      pin_C2    //define pino C2 como saida (led verde)#define  led_laranja    pin_C3    //define pino C3 como saida (led laranja)#define  rele_alarme    pin_C4    //define pino C4 como saida ( relé do alarme)#define  led_verde2     pin_C5    //define pino C4 como saida ( relé do alarme)//============================================================================////=====================DEFINIÇÃO DOS PROTÓTIPOS DE FUNÇÃO=====================//void sentido_horario();          //protótipo de função chamado sentido_horáriovoid sentido_antihorario();      //protótipo de função chamado sentido_antihoráriovoid manual();                   // protótipo de função chamada manualvoid automatico();               // protótipo de função chamada automaticovoid manual_sentido_horario();   //protótipo de função manual sentido horariovoid manual_sentido_antihorario();  //protótipo de função manual sentido antihorario//============================================================================////===============================FUNÇÃO INICIO================================//void inicio(){   output_B(0x00);               // Coloca todo o portB em nivel 0.   delay_ms(500);                // aguarda 100mS   //output_high(rele_alarme);     //Liga relé   //output_high(led_vermelho);    //Liga led vermelho   //delay_ms(500);                // aguarda 100mS}//============================================================================////============================================================================////=========================FUNÇÃO MANUAL SENTIDO HORÁRIO======================//void manual_sentido_horario(){          set_timer0(131 + get_timer0());  //Inicializa o TMR0 com o valor 131   contador++;                     //Incrementa a variavel contador a cada estouro de TMR0         if(contador == 125)   //Após imcrementrar 125 vezes o TMR0, reseta a variavel contador      {               contador = 0;         i++;         output_B(horario[i]);      // PortB assume o valor conforme valor de i               if(i==4)         {            i=0;         }      }}//============================================================================////=====================FUNÇÃO MANUAL SENTIDO ANTI HORARIO=====================//void manual_sentido_antihorario(){            set_timer0(131 + get_timer0());  //Inicializa o TMR0 com o valor 131   contador++;                     //Incrementa a variavel contador a cada estouro de TMR0   output_low(led_verde);     //Liga relé         if(contador == 125)              //Após imcrementrar 125 vezes o TMR0, reseta a variavel contador      {               contador = 0;         i++;         output_B(anti_horario[i]);                        if(i==4)         {            i=0;         }      }}//============================================================================////=========================FUNÇÃO SENTIDO HORÁRIO=============================//void sentido_horario(){          set_timer0(131 + get_timer0());  //Inicializa o TMR0 com o valor 131   contador++;                     //Incrementa a variavel contador a cada estouro de TMR0   output_high(led_verde);     //Liga relé      if(contador == 125)   //Após imcrementrar 125 vezes o TMR0, reseta a variavel contador      {               contador = 0;         i++;         output_B(horario[i]);      // PortB assume o valor conforme valor de i               if(i==4)         {            i=0;         }      }}//============================================================================////=====================FUNÇÃO SENTIDO ANTI HORARIO============================//void sentido_antihorario(){         set_timer0(131 + get_timer0());  //Inicializa o TMR0 com o valor 131   contador++;                     //Incrementa a variavel contador a cada estouro de TMR0   output_low(led_verde);     //Liga relé         if(contador == 125)              //Após imcrementrar 125 vezes o TMR0, reseta a variavel contador      {               contador = 0;         i++;         output_B(anti_horario[i]);                        if(i==4)         {            i=0;         }      }}//============================================================================////==============================FUNÇÃO MANUAL=================================//void manual()  {            if(input(bt_antihorario) && !input(bt_horario))  // Se botão A.H =1 e botão H=0                                                    //chama a função sentido anti_horario   {      manual_sentido_antihorario();  // Chama a função manual_sentido_antihorario   }   else      if(input(bt_horario) && !input(bt_antihorario))   // Se botão H=1 e botão A.H=0                                                        //chama a função manual_sentido_horario      {         manual_sentido_horario();   //Chama a função manual_sentido_horário      }   }//============================================================================////================================FUNÇÃO ALARME===============================//void alarme(){   }//============================================================================////======================FUNÇÃO INTERRUPÇÃO DO TIMER0==========================//#int_TIMER0                            //Interrupção do TMR0void  TIMER0_isr(void) {      if(input(bt_aut_manual))      //se botão aut/manual pressionado   {      delay_ms(200);             //aguarda 200mS      status++;                  // incrementa a variavel status++            if(status==2)              //se status =2      {         status=0;               //status assume valor 0      }   }      if(status==0)  // Sistema em operação manual   {            manual();      //chama a função manual   }   else        if(status==1)  // Sistema em operação automatico      {               if(input(sensor))       //Se sensor em nivel 1         {            sentido_horario();   //Chama a função sentido horário                     }         else                    //Se sensor em nivel 0         {            sentido_antihorario();   //Chama a função sentido antihorário                     }      }   }      void main(){         inicio();   //chama a função inicio   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64); // configura o TMR0 para clock interno e prescaler dividindo por 64   set_timer0 (131);                           // inicia o timer 0 em 131   enable_interrupts (global | int_timer0);   // habilita interrupções   while (true);                             // espera pela interrupção      }                
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

amigo perdão por não te ajudar com ccs. Seu fonte realmente parece 1/2 confuso. Mas percebo que ele é movido só pela interrupção. Isso não é totalmente bom. Na interrupt, faça apenas girar o motor e "converse" com ela com variáveis globais. E faça alguma coisa dentro do loop while(1) tipo acender led, verificar botão e etc

unsigned char direcao=0;// global...interrupt timer0(void){...if (direcao) i++;else i--;PORTB=tabela[i];...}  void main (void){...for (; //ou while(1){...if (!RA0) direcao^=1;//pressione tecla, inverte direção...}}

só um exemplo bobo pra você ter uma ideia da coisa.

Vá por partes...=jack o estripador (af velha e fraquinha esta). 1º tenha sucesso em girar o motor de passo usando interrupção e vá agregando funções fora dela.

A divagar e devagar se vai ao longe

 

abç

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