Rotary encoder

ဒီ Project လေးကတော့ Rotary encoder အမျိုးအစား တစ်ခုဖြစ်တဲ့ EC11 encoder လေးကို ဖတ်ဖို့အတွက် PIC ရဲ့ GPIO တွေဖြစ်တဲ့ PORTA ရဲ့ PIN0 နဲ့ PIN1 ကို အသုံးပြုပြီး ENCODER ရဲ့ Channel1 နဲ့ Channel2 ကို တစ်ပြိုင်တည်း ဖတ်ပြီး Counter ကို တိုးခြင်း ၊ လျှော့ခြင်း တို့ကို 7 segment Display ပေါ်မှာ ကိန်းကဏန်း အနေဖြင့် ဖော်ပြခြင်းဖြင့် encoder ရဲ့ အတိုး အလျှော့ လှည့်ခြင်းကို လိုက်မှတ်ပြီး မိမိ အလိုရှိရာ အသုံးပြုရသော program code လေးကို ဖော်ပြပေးထားပါတယ်။


Rotary encoder အသုံးပြုပြီး အသုံးချသော ပစ္စည်းအချို့ကို ဖော်ပြလိုက်ပါတယ်။

(1) Automotive coil winding machine
(2) Digital volume control

အစရှိသည် ပစ္စည်းများတွင် အသုံးပြုကြသည်။


/*Example code

  ယခုဖော်ပြပါ code သည် PIC16F887 ပေါ်တွင် ရေးသားထားပြီး Encoder Input အနေဖြင့် RA0 , RA1 ကို အသုံးပြုပြီး

7 segment Display ကို PORTD မှ နေပြီး အသုံးပြုပြီး ၊ 7 segment မှ common များကို PORTC မှ RC0,RC1,RC2,RC3

တို့ကိုအသုံးပြုထားပါသည်။

   MKT မှ ထုတ်လုပ်သော PIC board ပေါ်တွင် လွယ်ကူစွာ အသုံးပြုနိုင်ပသည်။

*/

#include <pic.h>

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & LVPDIS);// Configuration bit များကြေညာခြင်း

void delay_ms(int ms);

void PIC_Init(void);// function prototype

void display(void);//function prototype


void Save(unsigned int count);

const char segment[16]={0b00000011,//0

0b10011111,//1

0b00100101,//2

0b00001101,//3

0b10011001,//4

0b01001001,//5

0b01000000,//6

0b00011110,//7

0b00000001,//8

0b00001001,//9

0b00010001,//A

0b11000001,//b

0b01100011,//C

0b10000101,//d

0b01100001,//E

0b01110001//F

};

__EEPROM_DATA(0xbc,0x61, 0x4e, 3, 4, 5, 6, 7);

__EEPROM_DATA(‘1′,’2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’);

__EEPROM_DATA(‘9′,’A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’);

unsigned int Delay=0;

char cnt,state=0,Push1=0;

unsigned char Digit[4];

unsigned int Counter=0;

unsigned char Disdelay=5;

unsigned int  Cntdelay=1000,Pushdelay=0;

char EC11[4],Index=0;


 unsigned char Digit[4];

void interrupt isr(void)

{

  if(T0IF)//1ms

  {

   T0IF=0;

   TMR0 = 6;

   

   if(Delay)

    –Delay;

   

   if(Disdelay)

    –Disdelay;

   

    if(Cntdelay)

    –Cntdelay;

  

   }


}


void main(void)

{


 PIC_Init(); 

 Counter  = eeprom_read(0)<<8;

 Counter =  Counter | eeprom_read(1);

  

 while(1)//Forever

 {

    if(Disdelay==0)//5ms

    {

    display();

    Disdelay=5;//Reload delay value

    }

    

    if(Cntdelay==0)

    {

    

    Digit[0]=Counter%10;

Digit[1]=Counter%1000%100/10;

Digit[2]=Counter%1000/100;

Digit[3]=Counter/1000;

Cntdelay=100;

    

    }

    

    if(!RB0)

    {

     if(!Push1)

     {

      Push1=1;

      Save(Counter);

     

     }

    

    }

    else Push1=0;

   

   switch(PORTA & 0b00000011)

  {

     case 0b00000000://A=0,B=0

     if(EC11[1] & EC11[2])

     {

       Counter++;

       if(Counter>9999)

        Counter=0;

       EC11[1]=0;

       EC11[2]=0;

     }

     else if(EC11[3] & EC11[2])

     {

        Counter–;

        if(Counter<21)

        Counter=0;

        EC11[3]=0;

        EC11[2]=0;

     

     }

     break;

     

     case 0b00000001://A=1,B=0

     if(EC11[2]==1)

     {

       EC11[1]=1;

     }

     break;

     

     case 0b00000011://A=1,B=1

     EC11[2]=1;

     break;

     

     case 0b00000010://A=0,B=1

     if(EC11[2]==1)

     {

      EC11[3]=1;

     }

     break;

     

     default:

     break;

 

  }

}

}


void PIC_Init(void)

{

 TRISD = 0;//PORTD all OUTPUT

 PORTD = 0;//PORTD Clear

 

 TRISE = 0b00000111;//RE0,RE1,RE2 input

 ANSEL = 0b00011100;//AN5,AN6,AN7 disable digit I/O

 PORTE = 0; 

 

 TRISC = 0;//PORTC are output

 PORTC = 0;

  

 TRISA = 0b00000011;//RA0 , RA1 Input

 PORTA = 0;//Clear porta

 

 TRISB =  0b00000001;//RB0 input

 ANSELH = 0; //Analog off Digital ON

 WPUB = 0b00000001;//RB0 pull up

 RBPU = 0;//PORTB Pull up enable

 

  OPTION = 0x81; // PortB pull-up disable, Timer0 prescaler 1:2

  TMR0 = 6; // Timer 0 ထဲကို Reload value 6 ထည့်ခဲ့မယ်

  INTCON = 0xA0;// Global Interrupt set လုပ် ပြီး ၊ Timer 0 interrupt ဖြစ်တဲ့ T0IF ကို set လုပ်




}


void delay_ms(int ms)

{

  Delay=ms;

  while(Delay)

  {

  

  }


}


void display(void)

{

switch(state)

{

case 0:

PORTD = segment[Digit[0]];// Digit array ထဲက အခန်းနံပါတ်က segment array ထဲကအခန်း နံပါတ် ကိုယူပြီး PORTD ထဲကိုထည့်

  RC0=1;//Digit 0 ON

  RC1=0;//Digit 1 OFF

  RC2=0;

  RC3=0;

  state=1;

  break;

 

case 1:

PORTD = segment[Digit[1]];

  RC0=0;//Digit 0 OFF

  RC1=1;//Dgiit 1 ON

  RC2=0;

  RC3=0;

  state=2;

  break;

 

 

case 2:

PORTD = segment[Digit[2]];

  RC0=0;//Digit 0 ON

  RC1=0;//Digit 1 OFF

  RC2=1;

  RC3=0;

  state=3;

  break;

 

case 3:

PORTD = segment[Digit[3]];

  RC0=0;//Digit 0 OFF

  RC1=0;//Dgiit 1 ON

  RC2=0;

  RC3=1;

  state=0;

  break;

 

  default:

  break;

}

}


void Save(unsigned int count)

{ char x;

x = count>>8; 

/* Counter သည်  int 16bit ဖြစ်သောကြောင့်  သိမ်းဆည်းရမည့်  EEPROM သည် 8bit                                                                  သာဖြစ်သောကြောင့် LSB , MSB ခွဲထည့်ရပါသည်။ */

  eeprom_write(0,x);

  x = count;

  eeprom_write(1,x );

}


Leave a Reply

Your email address will not be published. Required fields are marked *