07-07-2009, 01:02 AM
|
#23
|
Đệ tử 2 túi
Tham gia ngày: Dec 2008
Bài gửi: 33
:
|
Trích:
Nguyên văn bởi namqn
Trong các ví dụ của tôi, tôi không dùng hàm thư viện nào cả, chỉ thiết lập các thanh ghi như trong datasheet. Tôi viết bằng cú pháp của MPLAB C18, còn bạn dùng CCS C. Do đó, bạn phải tự thân vận động một chút.
Luồng này bạn hỏi về PWM chứ không hỏi về cách viết chương trình C ra sao, do đó tôi giả thiết là bạn biết cách đặt đoạn chương trình C mẫu vào chương trình của bạn. Nếu bạn chưa biết cách viết chương trình C, đề nghị bạn tìm một tài liệu hướng dẫn về ngôn ngữ C để đọc, sau đó đọc tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng. Sau đó, làm vài bài tập cơ bản để nắm được cách viết chương trình C trong trình biên dịch của bạn.
Dưới đây là toàn bộ chương trình tôi dùng để test PIC18F4431, viết cho MPLAB C18. Đừng yêu cầu tôi port code sang CCS C.
Code:
#include <p18cxxx.h>
#pragma config OSC = HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = ON
#pragma config BOREN = ON
#pragma config BORV = 27
#pragma config WDTEN = OFF
#pragma config WINEN = OFF
#pragma config WDPS = 32768
#pragma config T1OSCMX = OFF
#pragma config HPOL = HIGH
#pragma config LPOL = HIGH
#pragma config PWMPIN = ON
#pragma config MCLRE = ON
#pragma config EXCLKMX = RD0
#pragma config PWM4MX = RD5
#pragma config SSPMX = RD1
#pragma config FLTAMX = RD4
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
void Init_PCPWM(void);
void main() {
Init_PCPWM();
while (1) Nop();
}
void Init_PCPWM() {
PTCON0 = 0x04; //postscale 1:1, prescale 1:4, free running
PTPERL = 0x9B; //8 kHz @ 20 MHz
PTPERH = 0x00;
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;
}
Nếu bạn nghĩ rằng tôi làm khó dễ bạn, lần sau tôi sẽ không trả lời câu hỏi của bạn nữa, để bạn khỏi bị làm khó dễ.
Thân,
|
Theo như code của anh thì PDCx = 4 x PTPER thì chu kỳ nhiệm vụ mới đạt 100%,cho em hỏi đây có phải là đặc tính của 18f4431 hay không?Vì trong tutorial 5 của anh viết cho DsPIC thì PDCx = 2 x PTPER ,chu kỳ nhiệm vụ đạt 100%
Cảm ơn anh
|
|
|