Hôm nay, vì lý do họp lớp, khá nhiều bạn không đến lớp. Do vậy, chúng ta chỉ học phần PWM. Phần sample code dưới đây viết khá kĩ, các bạn kết hợp với datasheet là hiểu. Mục đích chương trình là dùng biến trở điều khiển độ sáng led ở CCP2 và CCP1:
Ngoài ra, các bạn có thể tham khảo code ở: [Thảo luận]PWM với GPIO
Bài tập ngày hôm nay: Đọc cảm biến nhiệt độ (LM35), calib, xuất nhiệt độ môi trường ra LCD, thể hiện lên LED qua PWM (nhiệt độ càng cao, led càng sáng; calib độ nhạy lớn)
Ngoài ra, các bạn có thể tìm hiểu thêm về led RGB, Buzzer, động cơ DC, điều khiển bằng PWM.
Xong bài, các bạn nén project lại rồi nộp tới email: pif.picc5@gmail.com với cú pháp sau ở chủ đề thư:
Tuần sau, 17/3, chúng ta vẫn giữ thời gian và địa điểm như cũ: 7h30 thứ bảy, 203B8. Bài học sẽ là chuẩn giao tiếp I2C, chúng ta sẽ tìm hiểu tương đối đầy đủ về I2C của PIC luôn. Yêu cầu các bạn đọc TUT và chuẩn bị mạch theo link sau:
[[[[ [[ TUT I2C ]] ]]]]
Code:
/****************************************************************
*
* www.payitforward.edu.vn
*
****************************************************************/
/****************************************************************
*
* PIC Training Course
*
****************************************************************/
/****************************************************************
*
* Module : ADC_PWM_on_LED.c
* Description : Rotating POT to control LEDs 's Brightness through PWM
* Tool : HI-TECH PIC
* Chip : 16F887
* History : 09/03/2012
*
* Author : Nguyen Tien Manh, CLB NCKH DDT
*
*
****************************************************************/
/****************************************************************
* IMPORT
****************************************************************/
#include <htc.h>
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN &
IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word
__CONFIG(BORV21); //2st config. Word
#define _XTAL_FREQ 4000000
/*****************************************************************
GLOBAL VARIABLE
******************************************************************/
/*****************************************************************
* ROUTINES
******************************************************************/
void port_init()
{
TRISC1 = 0; // CCP2 is output
TRISC2 = 0; // CCP1 is output
TRISA0 = 1; // AN0 is input
}
void ADC_init()
{
//AN0 is analog
ANSEL=1;
//ADC conversion clock source = Fosc/8
ADCS0=1;
ADCS1=0;
// Vref = VCC = 5V
VCFG0=0;
VCFG1=0;
// Select channel 0
CHS0=0;
CHS1=0;
CHS2=0;
CHS3=0;
//Result formatting: Right justified
ADFM=1;
// Turn on ADC module
ADON=1;
__delay_ms(1); // delay for initiation of module ADC
}
void timer2_init()
{
// PWM Period = [PR2 + 1] * 4 * TOCS
// PWM frequency = 5kHz => PR2 = 199
T2CON = 0X00; // Prescale & Postscale 1:1
PR2 = 199; // PWM period, also the maximum of CCPR1L and CCPR2L
TMR2ON = 1; // Turn on Timer2
}
void pwm_init()
{
CCP1CON = 0X0C; // enable CCP1
CCP2CON = 0X0C; // enable CCP2
}
void int_init()
{
GIE = 1; //Global Interrupt Enable
PEIE = 1; //Peripheral Interrupt Enable
ADIE = 1; //ADC Interrupt Enable
ADIF = 0; //Clear ADC Interrupt Flag
}
//Interrupt service rountine
void interrupt isr()
{
unsigned long adcres;
if (PEIE && ADIE && ADIF) //Determine ADC interrupt
{
ADIF = 0; // pull down interrupt flag
adcres = (ADRESH<<8) + ADRESL; // convert adc result
CCPR2L = (1023-adcres)*200/1023; // Duty clycle on CR1
CCPR1L = (adcres)*200/1023; // Duty clycle on CR2
GODONE = 1; //start reading adc again
}
}
/****************************************************************
* MAIN
****************************************************************/
void main()
{
port_init();
ADC_init();
timer2_init();
int_init();
pwm_init();
__delay_ms(1);
GODONE = 1; //start reading adc
while(1);
}
/****************************************************************
* END OF ADC_PWM_on_LED.c
****************************************************************/
Bài tập ngày hôm nay: Đọc cảm biến nhiệt độ (LM35), calib, xuất nhiệt độ môi trường ra LCD, thể hiện lên LED qua PWM (nhiệt độ càng cao, led càng sáng; calib độ nhạy lớn)
Ngoài ra, các bạn có thể tìm hiểu thêm về led RGB, Buzzer, động cơ DC, điều khiển bằng PWM.
Xong bài, các bạn nén project lại rồi nộp tới email: pif.picc5@gmail.com với cú pháp sau ở chủ đề thư:
[C5] [BT9] [N.] _Họ tên_ ...
Tuần sau, 17/3, chúng ta vẫn giữ thời gian và địa điểm như cũ: 7h30 thứ bảy, 203B8. Bài học sẽ là chuẩn giao tiếp I2C, chúng ta sẽ tìm hiểu tương đối đầy đủ về I2C của PIC luôn. Yêu cầu các bạn đọc TUT và chuẩn bị mạch theo link sau:
[[[[ [[ TUT I2C ]] ]]]]