Bài đăng

Bài 6: PWM

Hình ảnh
Làm thế nào để tạo PWM trên dspic33f Bài toán: tạo xung PWM với chu kì 1ms, duty = 60%. Đầu tiên, cấu hình dao động Ta sẽ sử dụng cấu hình dao động nội là Fcy = 40Mhz =>Fosc  =80MHz. như sau:   _FOSCSEL(FNOSC_FRC); // Enable Clock Switching and Configure _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF); .....    // Configure PLL prescaler, PLL postscaler, PLL divisor PLLFBD = 41; // M = 43 CLKDIVbits.PLLPOST=0; // N2 = 2 CLKDIVbits.PLLPRE=0; // N1 = 2    //Fosc = 80MHz // 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); Tiếp theo cấu hình các chân xuất PWM là output: _TRISB10 = 0; _TRISB11 = 0; _TRISB12 = 0; _TRISB13 = 0; _TRISB14 =0; _TRISB15 = 0; Ta tạo 1 hàm để setup cấu hình PWM mong muốn setup_PWM(); Các thông số sẽ được tính toán như sau: Ta sử dụng các bit thiết lập đầu tiên:   ...

Bài 5: Ngắt Timer 1

Hình ảnh
Timer rất quan trọng trong kĩ thuật lập trình, nó có thể thay thế hàm main(), tạo khoảng thời gian định thời mà không cần dùng hàm delay(). Ứng dụng tối quan trọng của Timer đó là ngắt, ta có thể tạo ra một khoảng thời gian mong muốn để thực hiện một chuỗi hàm trong ngắt.. Timer1 của Dspic 33fj32mc202 là timer 16 bit Xét bài toán: Dùng ngắt timer 1 để tạo bật tắt Led đơn với chu kì 0,5s Tính toán: Giả sử ta dùng tần số dao động của chip là Fosc = 40MHz  => Fcy = 20MHz Ta sử dụng bộ chia tần cho timer là 1:256 Ta có: 0.5 = PR1 * 256 * 1/20.000.000  Suy ra:  PR1 = 0,5*20.000.000/256 = 39062. Đây chính là giá trị  hẹn giờ Timer cần đặt Thực hiện: ta chọn tần số dao động là 40MHz: #include <p33fj32mc202.h> // Select Internal FRC at POR _FOSCSEL(FNOSC_FRC);      //su dung dao động nội 7.37MHz // Enable Clock Switching and Configure _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF);  //disable WDT int main() {   // Configure PLL p...

Bài 4: giao tiếp IC ghi dịch 74HC595

IC 74hc595 giúp mở rộng chân cho VĐK, thường được dùng để quét led 7 thanh, led matrix, sau đây là code tham khảo sử dụng ic 74hc595 để quét led 7 thanh catot chung: #include <p33fj32mc202.h> // Select Internal FRC at POR _FOSCSEL(FNOSC_FRC);   //su dung tan so noi 7.37MHz // Enable Clock Switching and Configure _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF); #define clk   _LATB0 #define din   _LATB1 #define lat   _LATB2     // khai bao chan xuat cho ic 74hc595 #define led1  _LATB3 #define led2  _LATB4 #define led3  _LATB5 #define led4  _LATB6        // khai báo chan dk led unsigned char count_led = 0; char number[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  // ma led cattoth chung char led[4]; unsigned char i,Q; void display(); //void readADC(); void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void)  // ngat timer1 { /* Interrupt S...

Bài 3: Ngắt ngoài (interrupt external)

Hình ảnh
Trong dspic33fj32mc202 hỗ trợ 3 kênh ngắt ngoài: INT0, INT1 và INT2. Với INT0, Chip hỗ trợ ngắt trên chân INT0 là chân số 16. Với INT1 và INT2, chip hỗ trợ ngắt ngoài trên bất kì chân nào từ RP0 đến RP15, được cấu hình bởi bit INT1R và INT2R trong các thanh ghi RPINR0 và RPINR1. Ta xét ví dụ để sử dụng 3 ngắt ngoài: Dùng 3 ngắt ngoài để đổi trạng thái 3 led đơn. Ta thực hiện mô phỏng như sau: Ban đầu, ta phải cấu hình tần số dao động cho chip: _FOSCSEL(FNOSC_FRC);      // sử dụng dao động nội FRC 7.37MHz _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF);   // tắt WDT     ở trong hàm main ta phải thực hiện các lệnh chờ để kích hoạt dao động: __builtin_write_OSCCONH(0x01); __builtin_write_OSCCONL(0x01); Tiếp theo, ta cấu hình vào ra cho các chân sử dụng, với các chân nối với led được cấu hình output, các chân sử dụng ngắt cấu hình input:   _TRISB7 = 1;   _TRISB11 = 1;   _TRISB14 = 1;   _TRISB0 = 0;   _TRISB1 = 0; ...

Bài 2: I/O PORT

Chúng ta có thể cài đặt I/O cho các chân digital của Dspic bằng các thanh ghi sau: TRISx = 0bxxxxxx; để lựa chọn các chân của PORTx là input hay output, với 1 là input, 0 là output vd:   TRISB = 0x02;    // 0x01 = 0b10; tức là chân RB0 là chân output, chân RB1 là input; hoặc chúng ta set bit trực tiếp lên địa chỉ chân: _TRISB0 = 0; _TRISB1 = 1; Các địa chỉ này đã được định nghĩa sẵn trong thư viện của mplab. Hai thanh ghi PORTx là LATx dùng để đọc và ghi giá trị lên chân I/O. Tuy nhiên khi người dùng cố tình chuyển đổi chức năng I/O cho 1 chân bất kì thì giá trị PORTx có thể bị sai lệch đọc giá trị trên chân:  vd:  if (_LATB0 == 0)      led = ~led;  if (_PORTB1 == 1)      led1= ~led1; Ngoài ra, các chân I/O trên dspic còn tích hợp các chức năng đặc biệt khác, mà khi muốn sử dụng chức năng nào, chúng  ta phải cấu hình lại chân đó.. chúng ta sẽ tìm hiểu ở các bài tiếp theo

Bài 1: Cấu hình dao động

Hình ảnh
 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 FOSCSEL: Thanh Ghi đang kí cấu hình ban đầu bit 15 - 8 : mặc định là 1. 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 6-3: mặc định là 1 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...