PIC Lesson: PWM To Analog
PWM boleh menghasilkan analog voltage. PWM to Analog juga adalah merupakan DAC. Jika menggunakan R-2R Ladder, lapan output daripada microcontroller diperlukan untuk menghasilkan satu analog output. Menggunakan PWM, hanya satu output diperlukan bagi satu analog output dengan mengubah duty cycle nya sahaja. Litar PWM kepada voltan adalah seperti berikut.

Litar di atas sebenarnya adalah litar low pass filter di mana litar yang hanya menyalurkan frekuensi rendah dan menyekat frekuensi tinggi. Dalam isyarat PWM terdapat voltan DC dan AC yang dikenali harmonic. Apabila PWM melalui low pass filter, litar akan mengurangkan voltan AC yang berfrekuensi dan hanya menyalurkan voltan DC yang tidak berfrekuensi.
Dalam maksud lain, PWM adalah signal ‘ON’ dan ‘OFF’. Apabila melalui litar RC, capacitor akan charging ketika input 5V dan discharging ketika input 0V. Proses ini berlaku dengan sangat cepat dalam frekuensi PWM yang tinggi. Oleh itu, dengan mengubah duty cycle PWM tersebut, boleh mengubah voltan keluaran.
Contoh program yang saya hasilkan adalah menggunakan program PWM dan sambungkan kepada dua litar RC yang mempunyai kombinasi nilai RC berbeza. Vout1 adalah hasil voltan daripada nilai RC yang lebih tinggi berbanding Vout2. Dalam program ini saya juga mengubah frekuensi PWM bagi menunjukkan perubahan frekuensi tidak menunjukkan perubahan output yang ketara.
Berikut adalah program tersebut.
Berikut adalah videonya.
Post ini telah menerima 2,739 views sejak dikeluarkan pada 3:53 PM, Thursday, 12th August 2010
Category: PIC Lesson Tags: DAC, Low pass filter, PWM
MR shahrul
I am sorry to trouble u again…
i try to understand this code few days already,but i still got 2 function not understand.Can u explain to me more clearly?Below is the 2 function that i dun understand.Hope u dun mind to explain to me…thank you very much
int read_a2d(unsigned char channel)
{
ADCON0=0b00000001; //Turn on A/D module
ADCON1=0b10000000; //configures analog and voltage reference pins
ADCON0=(ADCON0&0xC7)|(channel<<3); //select analog input channel
__delay_ms(2);
ADGO=1; //initiate conversion on the selected channel
while(ADGO==1) continue; //wait until conversion done
return(256*ADRESH+ADRESL);}
void pwm_set(int freq, int duty)
{
int a;
T2CON=0b00000111;
PR2=(_XTAL_FREQ/(4*16))/(freq)-1;
a=(PR2+1)*duty/25;
CCPR2L=a/4;
CCP2CON=(CCP2CON&0b11001111)|((a%4)<<4);
}