Ir ao conteúdo
  • Cadastre-se
diego.maga

Bobinadeira com PIC - Dúvidas

Recommended Posts

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 ?

 

 

 

 

 

Compartilhar este post


Link para o post
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ç

Compartilhar este post


Link para o post
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ç

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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ç

Compartilhar este post


Link para o post
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      }                

Compartilhar este post


Link para o post
Compartilhar em outros sites

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ç

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×