2017-10-14 133 views
0

我很難找到我懷疑在我的代碼中是一個非常愚蠢的錯誤。我正在使用ATmega328。如何限制PWM佔空比值的範圍?

我需要的是產生一個PWM信號,其佔空比不是介於0%和100%之間,而是介於另外兩個值之間。這是通過設置宏duty_maxduty_min來考慮的。我在做什麼在我的代碼正在讀取ADC技術,具有1024個值的分辨率,並映射讀取接受值的範圍值:

#define duty_max 239 
#define duty_min 50 

[...] 

//Reading the ADC 
ADMUX = 0b01000101; 
ADCSRA |= (1<<ADSC); 
while(!(ADCSRA & (1<<ADIF))); 
ADCSRA |= (1<<ADIF); 
//Setting the variable 'duty' to the value read by the ADC 
cli(); 
duty = ADC; 
sei(); 
//Mapping to the range of accepted values 
duty = round((duty*(duty_max-duty_min))/1023 + duty_min); 

//Generating the PWM signal 
OCR0B = duty; 
//Timer 0 
TCCR0A = 0b00100011; 
TCCR0B = 0b00000001; 

我遇到的問題是信號沒有按照應有的方式工作。當從0到1023掃描ADC讀數並用示波器測量輸出信號時,我希望信號從最小佔空比穩定到最大。但是,它從0到40%(大約)四次。也就是說,當ADC的值增加時,在某個時間,佔空比停止增加並返回到0,然後持續增加,直到在整個ADC範圍內達到0 ...四次。

如果我用duty = round(duty/4);代替映射公式,它可以正常工作,但佔空比超出了可接受的範圍(因爲它從0%到100%)。

這是怎麼發生的?這個錯誤必須在映射公式中,但我找不到它,而且我現在已經處理了一段時間。

+0

哪種類型是「責任」? – flaviodesousa

+0

@flaviodesousa它是'unsigned int'。 – Tendero

+0

「廣泛討論」的評論仍然與您之前的問題相關。請不要接受任何實際上無法幫助您的問題的答案。在問題上使用賞金以獲得更多觀點。 –

回答

0

我已經能夠幾乎通過截斷爲16位的

(duty*(duty_max-duty_min))/1023 

結果當佔空比是347時,輸出值從114下降(其爲約47%最大的)複製你的症狀到50,這是最小的工作週期。在輸入範圍(而不是四個)上發生這三次

爲了防止這種情況發生,你可以嘗試,在這種情況下,通過一個共同的因子去除兩個數字:持續時間差,189,是被3整除,所以是1023試着寫它作爲

duty = round((duty*63)/341) + duty_min; 

看看這是否會改變任何東西。