[單晶片] - Keil C使用PCA 功能介紹 + Capture HC-SR04感測資料

此晶片使用MPC82G516

這裡介紹PCA的使用方法

PCA 主要有四種不同的應用方法

  1. 16-bit Software Timer Mode                                         
  2. Capture Mode 
  3. High Speed Output Mode
  4. PWM Mode
有以上四種不同的模式。


第一種模式 16-bit Software Timer Mode

可以將此當成額外的計數器,並且擁有16bit的大小
觸發中斷方式為,內部計數器CH CL 和設定值 CCAPnH CCAPnL 相同時 特別之處是本身計數器會不停往上數 因此目標的值也需要不停增加 以下為範例 製造P10腳位輸出周期2ms 方波

long PCA0T = 1843;      //PCA0 目標值
                        //設定 因石英震盪體為22.1184  /12  = 1843200 /s  1843約=1ms
int  PAC0Internal =1843;//設定每一次間隔的大小 1843=1ms
CCAP0L=0xff&(PCA0T);    //設定首次要追的目標,將值丟入暫存
CCAP0H=0xff&(PCA0T>>8);
CCAPM0=0x49;            //開啟Comparator 和 中斷 和 MATn
CL=0x00;                //歸零
CH=0x00;  
AUXIE = 0x04;  //PCA interrupt
CCON=0x40;              //開啟PCA計數


void PCATimer(void) interrupt 10   
{
 
 
 
  if(CCF0)
  {   
  PCA0T =PCA0T+PAC0Internal ;
  if(PCA0T>65536)  PCA0T-=65536;  //數字超過就減去65536 = 16bit 
  CCAP0L=0xff&(PCA0T);
  CCAP0H=0xff&(PCA0T>>8);
  P10=~P10;              // 製造一個方波周期為2ms,因為每個ms改變一次
  CCF0=0;
  
  }

}



第二種模式 Capture Mode

有三種觸發模式,Positive , Negative , Positive and Negative .

設定暫存器 CCAPMn 中的 5 , 6 bit  CAPPn = Positive 是否啟用 CAPNn = Negative 是否啟用

Capture Mode 使用範例 

以下用Positive , Negative 皆觸發的模式 ,
應用於 超音波感測器 HC-SR04
HC-SR04 基本訊號Protocol 可參照 此網頁 
可以得知我們需要送出一個大於10us的脈波,利用Timer2的16-bit 產生
並且間格最好有60ms 可以防止Trigger 和 echo 之間的衝突
程式碼設定


int capture_flag = 0 //當作開始旗標使用

CMOD = 0x00;    //時脈選用 FOSC/12  FOSC=系統時脈
CCAPM4 = 0x31;  //使用第四個PCA  開通 正負觸發
IE = 0x80;      //開啟全域中斷
AUXIE = 0x40;   //開啟PCA中斷
CL=0;           //清空計數
CH=0; 


void Timer2 (void) interrupt 5          //送出脈波訊號 並且間隔10ms
                                        // (測試10ms更新較快且數值算是精確,可自行調整時間)
{
 if(TF2)
 {
 P11=~P11; 
 if(P11)
 {
   P11=~P11;
 }
 else
 {
  if(t2count==1000)
  {
    P11=~P11;
    t2count=0;
  }
 
 } 
 t2count++;
 TF2=0;
 }
 
}

void PCATimer(void) interrupt 10   // PCA中斷
{
    if(CCF4)                       // CCF4觸發中斷
   {
     if(!capture_flag)             // 判斷首次觸發 
                                   //(因此不能中途接上訊號,會導致觸發點不一定為Negative,可自行更改)
  {
    CL=CH=0;                       //第一次進脈波時歸零計數
    capture_flag=1;                //旗標=1
  }
  else
  {
   ultrasound_L=CCAP4L;            //紀錄現在計數多少,會因為程式的工作周期導致些許的lost data
   ultrasound_H=CCAP4H;             
   capture_flag=0;                 //旗標歸零
  } 
      CCF4=0;                      //中斷歸零
   }
}


上面所得到的ultrasound_H ,ultrasound_L 就是超音波的微秒
之後針對震盪器和數值作轉換變能得到正確的距離。


但有一個缺點會占用掉CL=CH的數值,可能會導致其他PCA計算出現問題
之後再想辦法用程式去取代



第三種模式 High Speed Output Mode

此模式類型相似於計時器
但是他會讓設定的PCA腳位 自動產生反向
就是類似製造方波,但是測試後發現容易產生較高的雜訊
實際原因待研究




long PCA0T = 1843;      //PCA0 目標值
                        //設定 因石英震盪體為22.1184  /12  = 1843200 /s  1843約=1ms
int  PAC0Internal =1843;//設定每一次間隔的大小 1843=1ms
CCAP0L=0xff&(PCA0T);    //設定首次要追的目標,將值丟入暫存
CCAP0H=0xff&(PCA0T>>8);
CCAPM0=0x4d;            //開啟Comparator 和 中斷 和 MATn  和 TOGn
CL=0x00;                //歸零
CH=0x00;  
AUXIE = 0x04;  //PCA interrupt
CCON=0x40;              //開啟PCA計數



void PCATimer(void) interrupt 10   //PCA中斷
{


      

if(CCF0)
  {   
  PCA0T =PCA0T+PCA_left;
  if(PCA0T>65536)  PCA0T-=65536;    
  CCAP0L=0xff&(PCA0T);
  CCAP0H=0xff&(PCA0T>>8);
  MotorL=~MotorL;
  CCF0=0;
  
 }
}


第四種 PWM Mode  
也是一般常見的模式,對於PWM的應用的簡易設定。
主要設定Duty cycle的方式,去決定電壓輸出的大小,
詳細介紹請看 維基百科  。
PWM的頻率取決於PCA設定的頻率,而寬度則取決於計數器。

主要有以下計數器  PCAPWMn  CCAPnH CCAPnL,
PPAPWMn 只有最後兩個BIT設定 分別是 ECAPnH ECAPnL,

Duty cycle設定公式如下:
Duty cycle = 1 - [ECAPnH ,CCAPnH] / 256
也就是合成出九個bit 在除以256 之後看百分比

計數時是利用CCAPnL 和 ECAPnL ,而高位元則是用來Auto reload
因此不需要重複在中斷內設定。

程式碼範例:
PWM輸出 75%




CMOD = 0x00;
CCAPM0 = 0x42;   // 不需開啟中斷
PCAPWM0 = 0x00;
CCAP0H = 0x40;
CCAP0L = 0x40;

CCON = 0x40  ;   // 開啟計數

PCA0腳位輸出相對應的Duty cycle




留言

這個網誌中的熱門文章

[單晶片]-寫I2C通訊(MPU6050為範例)

[研發替代役]-威聯通QNAP面試

[研發替代役]-明緯面試