PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 15-06-2010, 05:42 AM   #1
lotta2k
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
Khi đó khi mình vặn trimport để thay đổi điện thế đèn LED sẽ sáng dần lên (mình có một bộ 4 LED gắn ở PORTB). Mình code bằng C, MPLab, ICD2 và C18 Compiler. Cụ thể thì đoạn code của mình như sau:

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
  }                           
}
Không hiểu có sai sót ở đâu không nhưng mình không thấy tín hiệu gì từ đèn LED, build không có lỗi. Nhờ anh em tư vấn. Mình xin cảm ơn.

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.
lotta2k vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-06-2010, 09:58 AM   #2
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Trích:
v_num += (ADRESH << 8);
ADRESH là biến 8bit để dịch trái bạn phải ép kiểu sang 16bit

Ngoài ra giá trị của ADC là 10bit, đầu vào của PWM cũng là 10bit, vậy bạn chỉ cần gán trực tiếp giá trị ADC vào CCPR

Với cách tính của bạn
Trích:
v_analog = ((float)v_num * 5)/1024;
Thì bạn chỉ gán giá trị từ 0 - 5 vào CCPR, duty cực kỳ nhỏ nên ko thể làm LED sáng
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-06-2010, 05:21 AM   #3
lotta2k
Nhập môn đệ tử
 
Tham gia ngày: Jun 2010
Bài gửi: 2
:
Lỗi sai của mình khá cơ bản là do mình chưa kiểm tra kĩ datasheet. Ở đây ADC có 10bits resolution trong khi PWM control của mình chỉ có 8 bits resolution. Chỉ cần chọn lại Left justify thay vì right justify mọi chuyện sẽ ổn.

Hỏi google một chút thì mình phát hiện ra một hướng ngắn gọn hơn để có thể đạt được mục đích mà không cần phải thiết lập phương trình gì cả, đó là ta sẽ bỏ qua 2 biến LSB bits. Nó sẽ đưa ra một sự xấp xỉ từ 0% đến 100% khi thay đổi điện thế từ 0-5V.

Mình post đoạn code lên đây nếu ai cần thì thêm nguồn tìm kiếm, cũng chẳng có gì to tát nhưng với những người mới tập đến PIC thì có chút hữu dụng nhất định vì đây là một ứng dụng rất phổ biến của PIC.



Lotta2k
lotta2k vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 11:43 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam