時鐘是硬件設計人員的標準概念,但不太熟悉軟件工程師。但是,在嵌入式編程(尤其是實時嵌入式編程)中,軟件開發人員必須在其軟件程序中處理時鐘。本文討論基于軟件的時鐘的基礎知識。
什么是時鐘
時鐘是一種交替固定頻率的信號。
圖1:時鐘信號。
時鐘周期是信號連續上升沿之間的時間。頻率是上升沿出現的速率(即1/周期)。時間或頻率表征時鐘。在軟件中,要跟蹤時鐘,您只需存儲其中一個值。在本文中,這些示例使用其周期來表征時鐘,因為這使得它們更容易編碼。為了說明,讓我們使用浮點類型來表示它(例如,C double類型)。在實踐中,可以使用任何可以表示時間的類型。通常使用定點表示。
使用時鐘
一旦軟件中有時鐘頻率,您可以通過乘以或除以周期來輕松地對時鐘進行乘法或除法。有關時鐘的信息可以傳送到遠程系統以遠程重建,或控制與時鐘同步傳輸的數據流。
輸出時鐘
要輸出時鐘,需要對輸出端口進行高位和低位交替打擊。以下C風格的偽代碼顯示了這個想法:
double t;
int val = 0;
t = get_current_time();
while(1){
t + = period/2;
output_at_time(t,val);
val = ~val;
}
此處 get_current_time 獲取當前時間, output_at_time 在指定時間向端口輸出值。但是,這些功能僅對軟件系統中固有的某些分辨率是準確的。輸出時鐘的頻率被量化為該分辨率,這意味著頻率可以遠離所需值。你可以通過跟蹤這種量化引起的誤差并隨著時間的推移進行調整來改善這一點。以下代碼顯示了這一點:
double t;
int val = 0;
double hi = floor((期間/2)/分辨率)*分辨率;
double lo =(期間/2)-hi;
double err = 0;
t = get_time();
while(1){
t + = hi;
err + = lo;
if(err》 = resolution){
err - = resolution;
t + = 1;
output_at_time(t,val);
val = ~val;
}
此算法會跟蹤錯誤,當錯誤變得足夠大以便合并到輸出中時,它會這樣做。使用此方法,輸出時鐘將具有正確的頻率,但量化仍將導致時鐘上的可觀察到的抖動。
恢復時鐘
有時您需要從輸入信號中恢復時鐘,以便將其用作系統中其他處理的基礎。
匹配頻率
最簡單的事情是匹配傳入時鐘的頻率。在特定時間段內,計算時鐘上升沿的數量,然后計算每個上升沿的周期:
period = sample_period/ticks_in;
傳入時鐘隨時間變化,因此您必須定期重新采樣。
使用反饋回路
有時只是匹配時鐘的頻率是不夠的。隨著時間的推移,小的不匹配和調整會增加,導致您的內部時鐘概念和實際時鐘長時間漂移。恢復時鐘的滴答數可以與原始時鐘的滴答數不同。為了解決這個問題,您需要不斷調整時鐘之間的累積誤差,這是一個可以使用PID控制循環完成的任務。1
假設您想要將輸出時鐘與輸入時鐘匹配。其思想是定期調整輸出時鐘周期。在每個調整點,查看自上次調整傳入時鐘(ticks_in)以來的滴答數以及自上次調整傳出時鐘(ticks_out)以來的滴答數。它們之間的區別在于時鐘的比例誤差。
從比例誤差中,您還可以計算積分(或累計)誤差和差分誤差。然后基于這些值調整周期以將時鐘周期移向正確的值。隨著時間的推移,算法停留在固定點上,并且比例誤差趨向于零。以下代碼可用于調整每次更新的時間段:
P = ticks_out -ticks_in;
I = I + P;
D = P -prevP;
period = period + Kp * P + Ki * I + Kd * D;
常數Kp,Ki和Kd的設置會影響算法的穩定速度以及它可以處理的輸入時鐘的擾動程度。有一套方法可以正確地為你的應用程序計算這些常量,這里沒有討論,但一個很好的起點是關于PID控制循環的維基百科頁面。
下圖顯示了此類算法隨時間推移的典型誤差。
圖2:PID誤差進程。為什么?
對于硬件工程師來說,上一節的結果并不突出。時鐘已經以相當復雜的方式路由。那么為什么需要將時鐘帶入軟件領域呢?一個原因是,將時鐘作為軟件中的邏輯實體,您可以對其進行分析并對其進行操作。例如,您可以將要在其他地方使用的時鐘進行小數乘法,或者可以將其頻率報告給某個更高級別的應用程序。但是,一個很大的應用是,您可以將時鐘傳輸到系統的另一部分,并通過僅數字傳輸進行恢復,而無需顯式傳輸時鐘。例如,時鐘可以通過USB總線或以太網傳輸。如果必須明確連接系統中的每個時鐘信號,這在連接性和靈活性方面帶來了很多好處,這將受到嚴重限制。
要遠程恢復時鐘,您需要傳輸反饋信息(例如,滴答計數)。這種計算在一段時間內仍然需要一個共同的時基,因此系統的所有部分必須具有相同的全球時間感。如何做到這一點超出了本文的范圍,但對于基于總線的系統(如USB或Firewire),總線可能帶有全局時鐘。對于更松散耦合的系統,如以太網或其他分組交換網絡,需要全局時鐘恢復協議。
-
嵌入式
+關注
關注
5068文章
19019瀏覽量
303267 -
存儲
+關注
關注
13文章
4262瀏覽量
85670 -
時鐘
+關注
關注
10文章
1720瀏覽量
131364
發布評論請先 登錄
相關推薦
評論