除錯旋轉編碼器成功

PeterrrWang發表於2016-07-02

  為了挑戰杯國賽能取得一個好成績,我們準備重新做一個機器人。機械臂的動力源選的電動推杆。初步方案是用旋轉編碼器做限位開關,簡單的來說就是當主控端角度傳送至從控端微控制器後,勢能電動推杆,此時旋轉編碼器角度變化,通過比較旋轉編碼器旋轉角度與傳送角度相等時關閉電動推杆已達到同步角度的目的。來張草圖吧:

新技能get√ <wbr>旋轉編碼器除錯成功

 

今晚上一直在調旋轉編碼器,已除錯成功。我買的是有AB線的400碼旋轉編碼器。相位差90度的脈衝。簡單的來說,正轉一下A線有1個低電平輸出,反轉即B線有一個低電平輸出,轉一圈會有400個低電平輸出。我用的STC15系列微控制器,利用外部中斷得到點評變化訊號,進入中斷函式後計數,再將記錄的數值乘以360/400即可得到旋轉角度。

 


輸出結果:









//Keil:uVision4
//MCU:STC15F2K60S2
//FOSC:11.0592MHz

 

#include"reg52.h" //標頭檔案

#define FOSC11059200L       //系統頻率
#define BAUD9600               //串列埠波特率

 

typedef unsigned char BYTE;
typedef unsigned int WORD;

 

sfr AUXR  =0x8e;                    //輔助暫存器
sfr P_SW1 =0xA2;                  //外設功能切換暫存器1


sbitrotation=P3^2;               //旋轉編碼器A線
sbit anotherbit =P3^3;         //旋轉編碼器B線

 

bitFLAG;                                 //1:上升沿中斷 0:下降沿中斷
bitbusy;                                  //串列埠繁忙標誌位 
intCW_count                         //旋轉計數
      ,angle                                //旋轉角度
     ,a                                        //臨時變數
     ,b;                                       //臨時變數

 


void SendData(BYTE dat)
{
    while(busy);              //等待前面的資料傳送完成
    ACC =dat;                 //獲取校驗位P (PSW.0)
    busy =1;
    SBUF =ACC;              //寫資料到UART資料暫存器
   return;
}

 


void SendString(char *s)
{
    while(*s)                    //檢測字串結束標誌
    {
       SendData(*s++);    //傳送當前字元
    }
   return;
}

 


void init(void)
{
    SCON =0x50;                                        //8位可變波特率
    AUXR =0x40;                                       //定時器1為1T模式
    TMOD =0x00;                                      //定時器1為模式0(16位自動過載)
    TL1 = (65536-(FOSC/4/BAUD));         //設定波特率重灌值
    TH1 = (65536- (FOSC/4/BAUD))>>8;
    TR1 =1;                                                //使能定時器1
    INT0 =1;                     
    IT0 =0;                                  

相關文章