2015-09-11 35 views
0

我正在使用MPC 7555控制器。它有一個16位Σ-Δ型ADC。 一個稱爲麥克風輸入的信號被饋送到該ADC引腳。基於該電壓,應該生成具有相同頻率的ADC信號採樣的PWM信號。基於Mic輸入的PWM信號生成

For e.g. 
0.1 V = 2 percent 
0.2 V = 4 percent 
0.3 V = 6 percent....and so on 

So, i thought the following logic - 
5V - 0xFFFF in digital 
0.1V - 1310 
0.2V - 2620 and so on 

所以,當由655劃分將產生1而不是由655將數字值將給出精確的佔空比值的1309

1310/655 = 2 
2620/655 = 4........ 

但是數字銷也可以顯示值0.1V時,其2.

無論如何,我可以避免這一點,或有任何更好的解決方案,請分享。

+0

夥計任何幫助,請 – gabbar

+0

耐心 - 世界上不是每個人都在你的時區,24小時是一個好時機,然後想知道爲什麼你沒有答案,即使這樣你應該考慮你的問題是否需要改進而不是懇求迴應。只有那些編輯過你的問題或已經評論過的人可能在任何情況下都會收到你的評論的通知, – Clifford

回答

0

任務是以與ADC轉換速率相同的速率輸出PWM。

假設ADC轉換時間是T(您可以通過讀取自由運行定時器計數器來確定此時間)。並假設ADC的轉換價值爲V.那麼PWM輸出時間H花「高」必須是

H = T * V/0xFFFF 

每次ADC轉換是可用的,你(取消所有待單次計時器中斷和)設置PWM輸出爲1,並在H時刻觸發一次性定時器。當它中斷時,將PWM輸出設置爲0(或者如果您有反邏輯,則反過來)。

如果輸入是0x00000xFFFF您可以採用替代策略 - 將輸出設置爲0或1,但不要部署單次計時器。

+0

對你的回答有很大的影響 – gabbar

+0

我對此比較陌生。請讓我知道爲什麼一次拍攝計時器設置必須完成。將真的很感激 – gabbar

+0

@ gabbar也許你的控制器有PWM輸出功能 - 我沒有看。我的評論是當使用一個沒有的控制器時。然後,您需要一種在佔空比正確的時刻更改輸出的方法,這將隨每個(不同的)讀數而變化。 –

0

爲了獲得PWM信號的最佳保真度,您最好直接在PWM的分辨率下工作,而不是僅計算一個百分比,然後將其轉換爲PWM計數。使用整數百分比,可以有效地將分辨率限制爲每個樣本6.64位(即,日誌記錄爲012)

所以我們可以說每個週期的PWM計數PWM_MAX,和你的ADC最大ADC_MAX,然後將PWM高發期將是:

pwm_high = adc_val * PWM_MAX/ADC_MAX ; 

首先執行乘法,以避免信息的損失是很重要的。如果PWM_MAX是suficiently高,有可能是沒有必要擔心的整數除法向零舍入而不是到德最接近的整數,但如果這是一個問題(低PWM_MAX),則:

pwm_high = ((adc_val * PWM_MAX) + (ADC_MAX/2))/ADC_MAX ; 

例如,大豆你的PWM_MAX只有100(即分辨率忠實地是整數百分比),則在第一種情況下:

pwm_high = 1310 * 100/0xFFFF的= 1

並且在第二:

pwm_high =((1310 * 100)+ 0x7FFF的)/ 0xFFFF的= 2

然而,如果PWM_MAX是更合適的4096也許,則:

pwm_high = 1310 * 4096/0xFFFF的= 81

pwm_high =((1310 * 4096)+ 0x7FFF的)/ 0xFFFF的= 82

隨着PWM_MAX在4096你有分辨率的有效12位,並且將保持更高的保真度以及直接計算正確的PWM值。

+0

感謝克利福德你的答案,真的很感激它。在我的情況下,輸入到hw寄存器的100%佔空比值是0x8000,adc是15位而不是16位,如上所述。所以你提出的第一次溶出就可以了。也就是說,如果接收到的數字值是當時的佔空比=(a * 0x8000)/ 0x7FFF。請糾正,如果我錯了 – gabbar

+0

@gabbar:這個問題實際上指定了一個16位ADC,但不管。許多ADC可以選擇將結果左移,以使MSB爲0x8000。這允許代碼被寫入16位,而不管實際的ADC分辨率如何,使代碼更加便攜。您可以將軟件中的換檔應用於不支持它的硬件。 – Clifford