Bài 1: Cấu hình dao động
DSPic 33 / PIC24 có 4 tùy chọn cấu hình dao động nội và ngoại
Sử dụng bộ nhân PLL để nâng cao giá trị tần số
Bộ dao động hệ thống có các tùy chọn:
- Bộ dao động chính Posc trên các chân OSC1 và OSC2
- Bộ dao động phụ Sosc trên các chân SOSC1 và SOSC0.
- Bộ dao động nhanh nội bộ RC với bộ chia tần số: FRC
- Bộ dao động nội tần số thấp LPRC
- Bộ dạo động chính với bộ nhân PLL
- Bộ dao động nội với bộ nhân PLL
Các thanh ghi điều khiển
bit 7: IESO :
- 1 : Khởi động thiết bị với bộ dao động nội FRC, sau đó người dùng có thể chuyển sang bộ dao động do người dùng chọn khi đã sẵn sàng.
- 0: Khởi động thiết bị với bộ dao động do người dùng chọn
bit 2-0: FNOSC: bit lựa chọn nguồn dao động ban đầu:
- 111: dạo động RC nhanh với bộ chia Divide by N
- 110: dao động RC nhanh với bộ chia 16
- 101: dao động công suất thấp
- 100: dao động thứ cấp / bộ dao động phụ
- 011: bộ dao động chính với bộ nhân PLL
- 010: bộ dao động chính (HS, XT, EC)
- 001:Bộ dao động nội RC nhanh với bộ nhân FRCPLL
- 000: Bộ dao động nội nhanh FRC : 7.37MHz.
Chúng ta có thể đăng kí thanh ghi này như sau:
>> Đăng kí bằng Maccro:
Được thực hiện ngay trên phần khai báo thư viện:
_FOSCSEL( lựa chọn )
**
** Các lựa chọn
** FNOSC_FRC Fast RC oscillator
** FNOSC_FRCPLL Fast RC oscillator w/ divide and PLL
** FNOSC_PRI Primary oscillator (XT, HS, EC)
** FNOSC_PRIPLL Primary oscillator (XT, HS, EC) w/ PLL
** FNOSC_SOSC Secondary oscillator
** FNOSC_LPRC Low power RC oscillator
** FNOSC_FRCDIV16 Fast RC oscillator w/ divide by 16
** FNOSC_LPRCDIVN Low power Fast RC oscillator w/divide by N
**
** Two-speed Oscillator Startup :
** IESO_OFF Disabled
** IESO_ON Enabled
FOSC: Thanh ghi đang kí cấu hình dao động
bit 15-8: mặc định là 1
bit 7-6: chế độ chuyển đồng hồ:
- 1x : chuyển đồng hồ tắt.
- 01: chuyển đồng hồ bật, FSCM bị tắt (chức năng giám sát)
- 00: chuyển đồng hồ bật, FSCM bật
bit 5: PIN ngoại vi chọn bit cấu hình (ko đề cập)
bit 2: OSCIOFNC : lựa chọn chức năng cho chân OSC2
- 1: OSC2 xuất ra xung dao động Fcy
- 0: OSC2 là chân i/o.
bit 1-0: lựa chọn chế độ dao động chính:
- 11: chế độ dao động chính bị tắt
- 10: chế độ dao động chính HS
- 01: chế độ dao động chính XT
- 00: chế độ dao động ngoại: EC
>>chúng ta sẽ đăng kí thanh ghi này bằng maccro:
_FOSC( các lựa chọn cách nhau bởi dấu & )
**
** Clock switching and clock monitor:
** FCKSM_CSECME Both enabled
** FCKSM_CSECMD Only clock switching enabled
** FCKSM_CSDCMD Both disabled
**
** Single configuration for remappable I/O:
** IOL1WAY_OFF Disabled
** IOL1WAY_ON Enabled
**
** OSC2 Pin function:
** OSCIOFNC_ON Digital I/O
** OSCIOFNC_OFF OSC2 is clock O/P
**
** Oscillator Selection:
** POSCMD_EC External clock
** POSCMD_XT XT oscillator
** POSCMD_HS HS oscillator
** POSCMD_NONE Primary disabled
CLKDIV : thanh ghi đang kí bộ chia dao động
Chúng ta sẽ chú ý tới các bit sau:
CLKDIV : thanh ghi đang kí bộ chia dao động
Chúng ta sẽ chú ý tới các bit sau:
- DOZE :14-12:bộ chia tần số Fcy: Dạo động của micro chip : Fcy = 1/2 Fosc
111 = FCY chia cho 128
110 = FCY chia cho 64
101 = FCY chia cho 32
100 = FCY chia cho 16
011 = FCY chia cho 8 (mặc định)
010 = FCY chia cho 4
001 = FCY chia cho 2
000 = FCY chia cho 1
- FRCDIV: 10 - 8: bộ chia bộ dạo động nội FRC
111 = FRC chia cho 256
110 = FRC chia cho 64
101 = FRC chia cho 32
100 = FRC chia cho 16
011 = FRC chia cho 8
010 = FRC chia cho 4
001 = FRC chia cho 2
000 = FRC chia cho 1 (mặc định)
>>Ngoài ra chúng ta có thể thiết lập bộ tỉ lệ dao động với công thức
Fosc = F(mặc định)*M/(N1*N2)
trong đó :
N1: được đặt bởi bít PLLPRE:
với N1 = CLKDIVbits.PLLPRE +2 với CLKDIVbits.PLLPRE từ 0 đến 31.
N2: được đặt bởi bit PLLPOST
11: Fout / 8
01: /4
00: /2
M được đặt ở bit PLLDIV trong thanh ghi PLLFBD
với M = _PLLDIV +2 : _PLLDIV từ 0 đến 511;
>> Thanh ghi OSCTUN: đăng kí điều chỉnh dao độngĐược thực hiện bởi các bit:TUN<5:0>
011111 = Tần số trung tâm + 11.625% (8.23 MHz)
011110 = Tần số trung tâm + 11,25% (8,20 MHz)
•
•
•
000001 = Tần số trung tâm + 0.375% (7.40 MHz)
000000 = Tần số trung tâm (danh định 7.37 MHz)
111111 = Tần số trung tâm - 0.375% (7.345 MHz)
•
•
•
100001 = Tần số trung tâm - 11.625% (6.52 MHz)
100000 = Tần số trung tâm - 12% (6.49 MHz)
Bộ dao động bên ngoài: Posc có các chế độ:
* XT mode: khai báo khi sử dụng thạch anh có tần số từ 3.5 -10 MHz.
* HS mode: khai báo khi sử dụng thạch anh có tần số từ 10 - 40 Mhz
Ví dụ về code sử dụng dao động ngoại:
// Select Internal FRC at POR
_FOSCSEL(FNOSC_FRC);
// Enable Clock Switching and Configure Posc in XT mode
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
int main()
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD=30; // M = 32
CLKDIVbits.PLLPOST = 0; // N2 = 2
CLKDIVbits.PLLPRE = 0; // N1 = 2
// Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0b011)
__builtin_write_OSCCONH(0x03);
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC! = 0b011);
// Wait for PLL to lock
while(OSCCONbits.LOCK! = 1) {};
}
Ví dụ về code sử dụng dao động nội:
// Select Internal FRC at POR
_FOSCSEL(FNOSC_FRC);
// Enable Clock Switching and Configure
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF);
int main()
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD = 41; // M = 43
CLKDIVbits.PLLPOST=0; // N2 = 2
CLKDIVbits.PLLPRE=0; // N1 = 2
// Initiate Clock Switch to Internal FRC with PLL (NOSC = 0b001)
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC! = 0b001);
// Wait for PLL to lock
while(OSCCONbits.LOCK! = 1) {};
}
Nhận xét
Đăng nhận xét