我很難找到我懷疑在我的代碼中是一個非常愚蠢的錯誤。我正在使用ATmega328。如何限制PWM佔空比值的範圍?
我需要的是產生一個PWM信號,其佔空比不是介於0%和100%之間,而是介於另外兩個值之間。這是通過設置宏duty_max
和duty_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%)。
這是怎麼發生的?這個錯誤必須在映射公式中,但我找不到它,而且我現在已經處理了一段時間。
哪種類型是「責任」? – flaviodesousa
@flaviodesousa它是'unsigned int'。 – Tendero
「廣泛討論」的評論仍然與您之前的問題相關。請不要接受任何實際上無法幫助您的問題的答案。在問題上使用賞金以獲得更多觀點。 –