性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

wkhn
認證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
通向數(shù)字電源之路——初學者入門(3)
通向數(shù)字電源之路——初學者入門(4)
通向數(shù)字電源之路——初學者入門(5)
通向數(shù)字電源之路--進階(1)
通向數(shù)字電源之路--進階(2)
通向數(shù)字電源之路--進階(3)
作者動態(tài) 更多
一種采用CAN總線方式升級F28035芯片F(xiàn)lash的方法(三)
2024-05-13 15:31
一種采用CAN總線方式升級F28035芯片F(xiàn)lash的方法(二)
2024-05-13 15:31
一種采用CAN總線方式升級F28035芯片F(xiàn)lash的方法(一)
2024-05-13 15:31
STM32G4系列MCU——數(shù)字電源入門(4)
2023-03-14 10:46
STM32G4系列MCU——數(shù)字電源入門(3)
2023-03-13 20:05

通向數(shù)字電源之路--進階(2)

      在數(shù)字電源的研發(fā)過程中,純數(shù)字控制的閉環(huán)算法是個難點。要想達到預(yù)期的性能指標,一般要求控制環(huán)中的算法滿足下面的一些條件:

1.從被控量的采樣到完成占空比的計算和更新,這個過程的時間要盡可能的短。越少的時間越能提高控制環(huán)路的相位裕度,增加環(huán)路的穩(wěn)定性。針對這個問題,microchip的dsp系列單片機有專用的硬件來解決。以dsp33ep128gs806舉例:

      首先,為縮短ADC采樣的時間,該芯片內(nèi)部有4個專用內(nèi)核用來對被控量進行采樣,以最高速運行的dsp,adc的轉(zhuǎn)換時間能控制在200ns以內(nèi)。在上篇文章中,用來采樣mos電流和輸入輸出電壓的ADC(AN0、AN1、AN2、AN3)都是專用內(nèi)核。

      其次,為減少進入ADC中斷時,寄存器壓棧和出棧的時間,引入context轉(zhuǎn)換的功能。筆者實測能比普通方式進入ADC中斷少300ns左右。

      最后,為了快速解算環(huán)路中差分方程的解,引入帶飽和功能的40位累加器,在一個指令周期能完成累加,相乘,兩個參數(shù)的讀取,累加器回寫等指令。配合專用的累加器匯編指令,能加快運算速度。以筆者用的PID算法,在60MHz的工作頻率下,能在1.6us的時間內(nèi)完成差分方程的求解和占空比的更新。

2.環(huán)路中的差分方程的參數(shù)有很多是用小數(shù)表示的。為了滿足控制的精度,并且還能有很快的運算速度,microchip的dsp33ep系列的dsp單片機沒有用浮點數(shù)表示小數(shù),而是用定點數(shù)來表示。具體到累加器中的小數(shù)表示,就是用Q15的格式。

      從上面提到的這些條件來看,筆者覺得,先將累加器是如何工作,如何進行小數(shù)乘法的計算這兩方面弄清楚是很有必要的。

      dsp如何表示小數(shù)?dsp小數(shù)數(shù)據(jù)表示為二進制補碼數(shù),其中最高位定義為符號位,小數(shù)點隱含于符號位之后。這種格式通常被 稱為1.15(或Q15)格式。其中1是用來表示數(shù)據(jù)的整數(shù)部分的位數(shù),而15是用來表示小數(shù)部分的位數(shù)。1.15格式的dsp小數(shù)數(shù)據(jù)表示的范圍是:-1.0(0x8000)至0.999969482(0x7FFF)??梢?,要把紙面中的小于1的小數(shù)轉(zhuǎn)換成dsp能識別的小數(shù)數(shù)據(jù),應(yīng)該用公式:,比如:

而32767的十六進制數(shù)為0x7FFF

那么0.1953125該如何表示?

6400的十六進制數(shù)為0x1900。

下面舉例說明累加器如何計算小數(shù)乘法:

  • 純小數(shù)×整數(shù):

0.1953125*2762=??

0.1953125--0.1953125*2^15=6400--0x1900

2762--0x0ACA

下圖是累加器ACCA計算乘法的過程:

將0x1900賦值給w4寄存器,0x0ACA賦值給w5寄存器。mac指令是用累加器A做w4×w5的運算,并將累加器的ACCAH部分保存在w6寄存器中,下圖是40位累加器寄存器的結(jié)構(gòu)圖:

ACCA寄存器的結(jié)果是0x00021B7400,只保存0x021B到w6中,0x021B的十進制為539。

,所以w6的結(jié)果就是w4×w5的最終結(jié)果。其實這個計算過程手動推導一下是這樣的:

而0x00010DBA00除就是右移15位,也就是0x021B,即為539。

那這個0x00010DBA00是怎么回事??其實累加器有兩種工作模式:小數(shù)模式和整數(shù)模式。當處于小數(shù)模式時,會把結(jié)果自動左移一位,而整數(shù)模式工作時,則不會進行位移。所以讀者可以嘗試將0x00010DBA00左移一位就是0x00021B7400,因此要把0x00021B7400右移16位才是乘法運算正確的結(jié)果。而w6寄存器中的數(shù)據(jù)0x021B正是0x00021B7400右移16位的結(jié)果。

那為何小數(shù)模式會把結(jié)果自動左移一位?小數(shù)都是用1.15格式,1.15×1.15=2.30,即小數(shù)乘法的結(jié)果是2.30格式,但是累加器的小數(shù)點固定在31位和30位之間,為了對齊結(jié)果,就變成了左移一位,成為1.31格式。

從上面的分析中,可以看到,對于累加器A來說,根本就沒有做小數(shù)的乘法,都是整數(shù)的乘法,小數(shù)點只存在于程序員的心里。

  • 純小數(shù)乘純小數(shù):

0.1953125*0.08428955078125=??

0.01953125--0.01953125*2^15=6400--0x1900

0.08428955078125--0.08428955078125*2^15=2762--0x0ACA

0.1953125*0.08428955078125=0.01646280288.......

考慮到小數(shù)取整時的誤差,可以看出,累加器的計算結(jié)果在一定精度上是對的!!

  • 整數(shù)乘整數(shù):(用累加器的整數(shù)模式)

6400*2762=17676800(十六進制0x00010DBA00)

這時的正確結(jié)果是保存在ACCxH和ACCxL兩個寄存器中,無法把結(jié)果保存在一個16位的寄存器中。

  • 大于1的小數(shù)×整數(shù):

以上都是對于純小數(shù)或純整數(shù)的乘法做的計算。那么對于大于1的小數(shù)該如何表示?大于1的小數(shù)無法表示成1.15的格式!

還是那句話,小數(shù)點只存于使用者的心里,累加器只會做整數(shù)的乘法!

舉例:

3.348*2762=9247.176

3.348是大于1的小數(shù),且小于4(2^2),所以換算成dsp可以識別的小數(shù)就應(yīng)該左移(15-2)位,即13位。

2762--0x0ACA

w6寄存器保存正確的結(jié)果0x241F--十進制為9247。

手動推導計算過程:

在計算完w4×w5的結(jié)果后,還要用sftac指令將累加器結(jié)果寄存器ACCA左移2位,最終保存在w6寄存器才是正確的結(jié)果。

在microchip官方提供的PID算法庫函數(shù)中,對于大于1的小數(shù)就是用這種方法來計算的,這在后面還會提到。

通過前面的幾個例子,可以看到dsp能夠處理任意小數(shù)的乘法運算。但是要注意結(jié)果飽和的問題。比如:

200.863*742=149040.346 > 32767,

這時再用上面的步驟,得到結(jié)果后,再左移位,將會引起累加器的飽和,這種情況就只能用整數(shù)模式,并且自己計算小數(shù)的位移,保存計算結(jié)果。

200.863<256(2^8)所以左移7位。即

742--十六進制0x02E6

可以看到累加器最終的計算結(jié)果為0x00012316D4,這時就不能再左移8位了,否則會導致累加器ACCA飽和

最終結(jié)果與正確的結(jié)果有一定的誤差,這是由于取整誤差造成的。

總結(jié):

      dsp的小數(shù)乘法,本質(zhì)上就是整數(shù)乘法,當對于累加器的工作方式了解以后,有助于程序員選擇合適的計算模式。

      通過上面的方法,dsp對所有整數(shù)和小數(shù)的乘法運算都可以很好的支持,明白這些之后,才能熟練應(yīng)用smps_control_library函數(shù)庫,明白如何設(shè)定函數(shù)的參數(shù)。

聲明:本內(nèi)容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 8
收藏 6
關(guān)注 575
成為作者 賺取收益
全部留言
0/200
  • dy-pGz7c8Dn 2022-03-18 23:46
    跟著大師學!
    回復(fù)
  • zhoucwyh 2021-12-15 22:17
    跟著大師學!
    回復(fù)
  • 星球官方號 2021-11-27 16:44
    點贊(?ò ? ó?)
    回復(fù)
  • Westbrook 2021-11-25 10:57
    跟著大師學!
    回復(fù)