PDA

View Full Version : Cấu hình mẫu cho PWM trong PIC 8-bit


namqn
19-07-2008, 08:17 PM
Đa số các PIC có module CCP, mà một trong những chức năng của nó là tạo ra tín hiệu PWM (pulse-width-modulation: điều chế độ rộng xung). Để thiết lập cấu hình cho module CCP, bạn có thể dùng đoạn chương trình sau làm điểm khởi đầu (ví dụ thiết lập cho module CCP2):
TRISCbits.TRISC1 = 1;
PR2 = 200; //PR2 = (PWM period)*Fosc/(4*TMR2 prescale), 10 kHz
CCP2CON = 0x0C; //PWM mode, 2 LSBs of duty cycle are '0'
CCPR2L = 100; //50% duty initially
PIR1bits.TMR2IF = 0;
T2CON = 0x04; //Timer 2 is on (prescale = 1:1, postscale = 1:1)
TRISCbits.TRISC1 = 0; //RC1 is an output (PWM output)
Một số PIC được thiết kế đặc biệt cho việc điều khiển động cơ (như PIC18Fxx31 hay PIC18Fxx30) có thêm module PCPWM, với khả năng điều chế độ rộng xung mạnh và linh hoạt hơn module CCP. Để thiết lập cấu hình cho module PCPWM, bạn có thể dùng đoạn chương trình sau làm điểm khởi đầu (ví dụ thiết lập cho PIC18F4431):
PTCON0 = 0x04; //postscale 1:1, prescale 1:4, free running
PTPERH = 0; //8 kHz @ 20 MHz
PTPERL = 0x9B;
PWMCON0 = 0x40; //PWM0..5 are enabled for PWM output
PWMCON1 = 0x01; //postscale 1:1, output override are synchronized
//to the PWM time base
DTCON = 0x05; //0.5 us dead time @ 20 MHz
OVDCOND = 0xFF; //output on PWM I/O pin is controlled by duty cycle
//and time base
OVDCONS = 0x00; //PWM I/O is INACTIVE when POUT is cleared
FLTCONFIG = 0x00; //disable all fault pins
SEVTCMPL = 0;
SEVTCMPH = 0;
PDC0H = 0;
PDC1H = 0;
PDC2H = 0;
PDC3H = 0;
PDC0L = 0x80; //Duty cycle of 20.5% at PWM1
PDC1L = 0xA0; //Duty cycle of 25.6% at PWM3
PDC2L = 0xC0; //Duty cycle of 30.8% at PWM3
PDC3L = 0xE0; //Duty cycle of 35.9% at PWM7
PTCON1bits.PTEN = 1;

Các đoạn chương trình mẫu trên được viết trong ngôn ngữ C, theo cú pháp của MPLAB C18.

Thân,