![]() |
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Jun 2010
Bài gửi: 2
: |
Sử dụng ADC và PWM để chỉnh độ sáng đèn LED
Xin chào anh em picvietnam,
Mình là thành viên mới, mới đọc qua diễn đàn nhưng cảm thấy rất thích phong cách trao đổi nhiệt tình và hết mình của mọi người trên diễn đàn. Chưa có nhiều kinh nghiệm về lập trình PIC nhưng mình thật sự rất thích, nay có một vấn đề muốn trao đổi hay chính xác là hỏi anh em, mong mọi người chỉ giáo. Mình đang tiến hành làm một project nói ngắn gọn trong mấy chữ là thiết kế thiết bị nguồn để điều chỉnh độ sáng của một loại cọc tiêu dẫn đường cho máy bay. Về phần điện thì không có nhiều lo lắng nhưng về code microPIC thì thật sự mình chưa được khá cho lắm. Hướng đi của mình như sau: mình sử dụng một microPIC 18F1320 nuôi bằng điện thế 5V, mạch thì mình có một trimport có thể thay đổi hiệu điện thế từ 0-5V gắn với cổng RA0. Mình dự định sẽ điều chỉnh PWM theo hàm điện thế. Khi điện thế bằng 5V thì đầu ra PWM là 100% và khi điện thế là 0V thì đầu ra PWM là 0% do đó tạm thiết lập một hàm tuyến tính cho đơn giản: Code:
PWM=0.2*V_in Code:
#include <p18f1320.h> void main(void) { unsigned int v_num, CCPR1L_CCP1CON_5_4; unsigned float v_analog; float pwm; OSCCON = 0x70; // Select 8 MHz internal clock TRISB = 0x00; // Set All on PORTB as Output TRISA = 0x81; // Input for RA0 and RA7 /* Set up PWM */ PR2 = 0b00001001; // Set PWM period CCP1CON &= 0x3F; CCP1CON |= 0x0C; // Configure ECCP module PIR1 &= 0xFD; // Clear TMR2IF bit T2CON &= 0x05; T2CON |= 0x01; // Set TMR2 prescale, postscale value /* Init ADC */ ADCON1 = 0b01110010; // Set ports AN0, AN2, AN3 to analog input ADCON0 &= 0x23; // ADC port channel 0 (AN0), use Internal Voltage Reference ADCON2 = 0b10101011; // Right justify result, 12 TAD, Select the FRC for 8 MHz ADCON0 |= 0x01; // Enable ADC v_num = 100; for(;;) { ADCON0bits.GO=1; while (ADCON0bits.GO); // Wait conversion done v_num = ADRESL; // Get the 8 bit LSB result v_num += (ADRESH << 8); // Get the 2 bit MSB result v_analog = ((float)v_num * 5)/1024; pwm = 0.2*v_analog; // pwm = f(v) CCPR1L_CCP1CON_5_4 = 4 * pwm * (PR2 + 1); // Store CCPR1L:CCP1CON<5:4> results CCPR1L = CCPR1L_CCP1CON_5_4 >> 2; // Store CCPR1L CCP1CON &= 0xCF; CCP1CON |= ((CCPR1L_CCP1CON_5_4 & 0x03)<<4); // Store CCP1CON<5:4> T2CONbits.TMR2ON = 1; // Timer2 is on } } P/s: à quên nói mình chỉnh thạch anh 8MHz và tần số PWM dự định là 50kHz. Mình gửi thêm anh em link datasheet của pic 18F1320. http://ww1.microchip.com/downloads/e...Doc/39605F.pdf Best regards, Lotta2k thay đổi nội dung bởi: lotta2k, 15-06-2010 lúc 05:47 AM. |
![]() |
![]() |
|
|