『壹』 求助:對於STC12C5A60S2單片機,如何用pca實現定時中斷
程序說明:
y = pca(mixedsig),程序中mixedsig為 n*T 階混合數據矩陣,n為信號個數,T為采樣點數, y為 m*T 階主分量矩陣。
程序設計步驟:
1、去均值
2、計算協方差矩陣及其特徵值和特徵向量
3、計算協方差矩陣的特徵值大於閾值的個數
4、降序排列特徵值
5、去掉較小的特徵值
6、去掉較大的特徵值(一般沒有這一步)
7、合並選擇的特徵值
8、選擇相應的特徵值和特徵向量
9、計算白化矩陣
10、提取主分量
程序代碼
%程序說明:y = pca(mixedsig),程序中mixedsig為 n*T 階混合數據矩陣,n為信號個數,T為采樣點數
% y為 m*T 階主分量矩陣。
function y = pca(mixedsig)
if nargin == 0
error('You must supply the mixed data as input argument.');
end
if length(size(mixedsig))>2
error('Input data can not have more than two dimensions. ');
end
if any(any(isnan(mixedsig)))
error('Input data contains NaN''s.');
end
%——————————————去均值————————————
meanValue = mean(mixedsig')';
mixedsig = mixedsig - meanValue * ones(1,size(meanValue,2));
[Dim,NumofSampl] = size(mixedsig);
oldDimension = Dim;
fprintf('Number of signals: %d\n',Dim);
fprintf('Number of samples: %d\n',NumofSampl);
fprintf('Calculate PCA...');
firstEig = 1;
lastEig = Dim;
covarianceMatrix = cov(mixedsig',1); %計算協方差矩陣
[E,D] = eig(covarianceMatrix); %計算協方差矩陣的特徵值和特徵向量
%———計算協方差矩陣的特徵值大於閾值的個數lastEig———
rankTolerance = 1e-5;
maxLastEig = sum(diag(D)) >rankTolerance;
lastEig = maxLastEig;
%——————————降序排列特徵值——————————
eigenvalues = flipud(sort(diag(D)));
%—————————去掉較小的特徵值——————————
if lastEig <oldDimension
lowerLimitValue = (eigenvalues(lastEig) + eigenvalues(lastEig + 1))/2;
else
lowerLimitValue = eigenvalues(oldDimension) - 1;
end
lowerColumns = diag(D) > lowerLimitValue;
%—————去掉較大的特徵值(一般沒有這一步)——————
if firstEig > 1
higherLimitValue = (eigenvalues(firstEig - 1) + eigenvalues(firstEig))/2;
else
higherLimitValue = eigenvalues(1) + 1;
end
higherColumns = diag(D) < higherLimitValue;
%—————————合並選擇的特徵值——————————
selectedColumns =lowerColumns & higherColumns;
%—————————輸出處理的結果信息—————————
fprintf('Selected[ %d ] dimensions.\n',sum(selectedColumns));
fprintf('Smallest remaining (non-zero) eigenvalue[ %g ]\n',eigenvalues(lastEig));
fprintf('Largest remaining (non-zero) eigenvalue[ %g ]\n',eigenvalues(firstEig));
fprintf('Sum of removed eigenvalue[ %g ]\n',sum(diag(D) .* (~selectedColumns)));
%———————選擇相應的特徵值和特徵向量———————
E = selcol(E,selectedColumns);
D = selcol(selcol(D,selectedColumns)',selectedColumns);
%——————————計算白化矩陣———————————
whiteningMatrix = inv(sqrt(D)) * E';
dewhiteningMatrix = E * sqrt(D);
%——————————提取主分量————————————
y = whiteningMatrix * mixedsig;
%——————————行選擇子程序———————————
function newMatrix = selcol(oldMatrix,maskVector)
if size(maskVector,1)~ = size(oldMatrix,2)
error('The mask vector and matrix are of uncompatible size.');
end
numTaken = 0;
for i = 1:size(maskVector,1)
if maskVector(i,1) == 1
takingMask(1,numTaken + 1) == i;
numTaken = numTaken + 1;
end
end
newMatrix = oldMatrix(:,takingMask);
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lillllllll/archive/2010/02/21/5315382.aspx
『貳』 什麼是STC12系列單片機的PCA及跟PWM有什麼區別
PCA——可編程計數器陣列
STC手冊中把概念模塊化了,他的PCA包含兩個 捕獲/比較匹配 模塊,可以實現上升沿/下降沿捕獲,及捕獲中斷,或者比較匹配中斷,或者PWM,或者最普通的定時/計數器。
其實就是個功能稍微強大點的定時器 - -!
比如STC12C2052AD,它的PCA是16位的計數器,計數脈沖可選(時鍾分頻後做為計數信號,或者外部信號),包含兩個比較單元,這兩個比較單元可以用來產生比較匹配或者PWM,也就是上面所說的 兩個模塊。
當PCA本身的計數數值與比較匹配相等時,可以觸發中斷,或者PWM波形翻轉。
當PCA工作於捕獲時,首先設定一個捕獲條件 上升沿或下降沿 。當這個條件發生時,PCA本身的計數值就被自動的復制到一個固定的寄存器上,等待讀取,並可以觸發中斷。
實際上PCA就是一個平平常常的計數器,比AT89S52的強點,現在的定時器基本上都有這些功能。
實在不明白就看看手冊吧。。
『叄』 單片機PCA是什麼意思
單片機PCA的意思是可編程計數器陣列。PCA由5個16位的捕獲/比較模塊與之相連,由高位元組(PCA0H)和低位元組(PCA0L)組成。
在讀PCA0L 的同時自動鎖存PCA0H 的值,先讀PCA0L 寄存器將使PCA0H 的值得到保持(在讀PCA0L 的同時),直到用戶讀PCA0H 寄存器為止。
(3)12單片機pca擴展閱讀
計數/定時器溢出時,PCA0MD中的計數器溢出標志(CF)被置為1,並產生中斷請求(如果CF 中斷被允許)。
將PCA0MD 中ECF 位設置為邏輯1 即可允許CF 標志產生中斷請求。當CPU 轉向中斷服務程序時,CF 位不能被硬體自動清除,必須用軟體清0。
要使CF 中斷得到響應,必須先總體允許PCA0 中斷。通過將EA 位(IE.7 )和EPCA0 (EIE1.3 )設置為邏輯1 來總體允許PCA0 中斷。清除PCA0MD寄存器中的CIDL 位將允許PCA 在微控制器內核處於等待方式時繼續正常工作。
『肆』 單片機PCA能測量1秒脈寬嗎
可以,只要代碼編輯無誤,一般情況下是可以測量的。STC12C系列增強型單片機片上擴展了基本51單片機的功能,如提供了PCA/PWM介面,定時器能工作在1T模式下(基本51單片機的時鍾是Fosc的12分頻,1T模式下1分頻)。PCA可以用於脈寬測量,但是,protues暫不支持該系列單片機的模擬功能,反復燒寫也挺麻煩,所以還是先用基本51單片機實現該功能,在後面的博文里在實現PCA測量脈寬。TMOD最高位GATEn置位後,Tn啟動計數受INTn(Pin3.3)和TRn的共同影響:TRn為1,當INTn引腳輸入為高電平時,Tn才允許計數。利用這個功能可測量INTn上正脈沖的寬度。
『伍』 STC12系列單片機安常式編好了,結果進不去PCA捕捉中斷。不知道為什麼
請參考《單片機原理與應用-基於匯編、C51及混合編程》一書的第199-204頁的例題,該書以STC12C5A60S2為主線介紹,這一款單片機內部功能多,適合於競賽和產品設計,該書的特點:各個例題的原理圖與實際電路圖一致,標出了各器件的參數,給出了匯編、C51兩種編程的詳解,該書例題的程序編寫思路符合於產品設計,最後一章給出了兩個完整的實例,可指導初學者入門。
『陸』 關於STC12C5A60S2單片機的PCA/PWM應用
1、CL/CH就是個一直在累加的計數器,功能同TL/TH;2、CCAPnL/CCAPnH裡面放所謂的捕獲值,也就是說:CL/CH中計數的值等於CCAPnL/CCAPnH時發生捕獲事件,將申請中斷;PWM時計數達到CCAPnL時輸出電平翻轉,達到CCAPnH時翻轉回去,重新計數;3、CL/CH是計數器;CCAPnL/CCAPnH是寄存器,單片機實時對比其與CL/CH的值是否相等;4、實現16位軟體定時可以用CL/CH的溢出中斷(同T0、T1。。),也可以使用捕獲模式,CCAPnL/CCAPnH中存放定時所要計數的值,CL/CH初值賦0,在捕獲中斷中清零CL/CH的值;5、在2中已說明。
『柒』 STC12C5A60S2單片機的PCA作為捕捉使用時,捕捉的是兩個邊沿信號之間的脈寬還是一段時間內的脈沖數量
沒仔細研究,這一節的說明特別長,看起來費勁但我學習STM32時對捕獲有所理解,應該是兩個捕獲寄存器1和2聯合使用,第一個上升沿到來,兩個捕獲寄存器同時復位,下降沿時,捕獲寄存器2產生捕獲更新事件,即可得到脈沖寬度第二個上升沿到來捕獲寄存器1產生捕獲更新事件,即可得到脈沖周期同時占空比也知道了兩個寄存器的捕獲值是內部時鍾個數,根據晶振頻率和分頻系數即可得到時間
而不是一段時間內外部的脈沖數量
『捌』 stc12c5a60s2單片機的串列中斷對pca有沒有影響
串口中斷對PCA可能造成的影響是:
1、如果是優先順序一樣,那麼一個中斷在執行過程中,其他中斷只能排隊等候,所以有中斷響應延遲的情況出現。
2、如果是優先順序不一樣,那麼低級中斷就可能被高級中斷打斷的可能。
3、如果沒有使用using n(n~3)那麼如果多個中斷都使用了同一個名稱的工作寄存器的話,可能會干涉。
『玖』 我想用stc12c5a60s2單片機PCA輸出pwm 周期20ms 脈寬1ms,怎麼計算周期 怎麼
stc12C5A60s2的官方文檔
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!10.3.4 脈寬調節模式(PWM) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
有介紹
PWM頻率= PCA時鍾/256.
PCA的時鍾源可以選擇:sysclk,sysclk/2,sysclk/4,sysclk/6,sysclk/8,sysclk/12,(其中 sysclk就是你的晶振頻率),定時器0的溢出,P3.4口的輸入時鍾.
CCAPnL寄存器的值 = 256-(256*脈寬/周期)
另外CCAPnL是重裝值,也需要配置好.
周期20ms,也就是說頻率是50Hz.
那你只能選擇使用定時器0的溢出作為PCA的時鍾了.
CL=0;//清零PCA計數器
CMOD=0x04;//定時器0溢出做PCA模塊的時鍾源
CCAPnH=CCAPnL=0xF3;//n=0or1//1ms
CCAPMn=0x42;//n=0or1//脈寬調節模式
CR=1;//都配置好了之後,打開PCA計數器
當然其它的寄存器配置你需要自己寫,比如說定時器0.
詳見官方文檔
我寫是對照文檔現寫的,比較匆忙,代碼可能有問題,但是思路是對的.