[單晶片] - Keil C使用PCA 功能介紹 + Capture HC-SR04感測資料
此晶片使用MPC82G516
這裡介紹PCA的使用方法
PCA 主要有四種不同的應用方法
第一種模式 16-bit Software Timer Mode
可以將此當成額外的計數器,並且擁有16bit的大小
觸發中斷方式為,內部計數器CH CL 和設定值 CCAPnH CCAPnL 相同時 特別之處是本身計數器會不停往上數 因此目標的值也需要不停增加 以下為範例 製造P10腳位輸出周期2ms 方波
以下用Positive , Negative 皆觸發的模式 ,
應用於 超音波感測器 HC-SR04
HC-SR04 基本訊號Protocol 可參照 此網頁
可以得知我們需要送出一個大於10us的脈波,利用Timer2的16-bit 產生
並且間格最好有60ms 可以防止Trigger 和 echo 之間的衝突
程式碼設定
但有一個缺點會占用掉CL=CH的數值,可能會導致其他PCA計算出現問題
之後再想辦法用程式去取代
第三種模式 High Speed Output Mode
此模式類型相似於計時器
但是他會讓設定的PCA腳位 自動產生反向
就是類似製造方波,但是測試後發現容易產生較高的雜訊
實際原因待研究
第四種 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%
這裡介紹PCA的使用方法
PCA 主要有四種不同的應用方法
- 16-bit Software Timer Mode
- Capture Mode
- High Speed Output Mode
- 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 使用範例
應用於 超音波感測器 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
留言
張貼留言