BÀI 29 : BĂM XUNG SỬ DỤNG BIẾN TRỞ HIỂN THỊ LCD PIC16F877A CCS

4:50:00 AM
I. GIỚI THIỆU
Vi điều khiển PIC họ 16F877A có 2 bộ PWM dùng để điều khiển tốc độ động cơ DC.
Phần này sẽ khảo sát chi tiết khối PWM của PIC và tập lệnh lập trình C cho PWM.
II. KHẢO SÁT PWM
1. SƠ ĐỒ KHỐI PWM của PIC16F877A có sơ đồ khối như hình 7-1:
sơ đồ khối pwm pic16f877a
Khối PWM gồm có 2 mạch so sánh: mạch so sánh 8 bit với mạch so sánh 10 bit. Mạch so sánh 8 bit sẽ so sánh giá trị đếm của timer2 với giá trị của thanh ghi PR2 (period register), giá trị trong timer2 tăng từ giá trị đặt trước cho đến khi bằng giá trị của PR2 thì mạch so sánh sẽ set flip flop RS làm ngõ ra CCPx lên mức 1. Đồng thời nạp giá trị 10 bit từ thanh ghi CCPRxL sang thanh ghi CCPRxH, timer2 bị reset và bắt đầu đếm lại cho đến khi giá trị của timer2 bằng giá trị của CCPRxH thì mạch so sánh sẽ reset flip flop RS làm ngõ ra CCPx về mức 0. Quá trình này lặp lại.
Dạng sóng điều chế PWM như hình 7-2:
Chu kỳ không thay đổi, muốn thay đổi thời gian xung ở mức 1 thì ta thay đổi hệ số chu kỳ (duty cycle). Khi hệ số chu kỳ thay đổi thì điện áp hay dòng trung bình thay đổi. Hệ số chu kỳ càng lớn thì dòng trung bình càng lớn, nếu điều khiển động cơ sẽ làm thay đổi tốc độ.
2. TÍNH CHU KỲ XUNG PWM
Chu kỳ PWM của PIC16F877A được tính theo công thức:

PERIODPWM = [(PR2) +1] * 4 * TOSC PVTMR2
Trong đó: TOSC là chu kỳ của tụ thạch anh tạo dao động.
                PVTMR2 (prescale value) giá trị chia trước của timer2.
Khi giá trị của timer 2 (TMR2) bằng giá trị của thanh ghi PR2 thì 3 sự kiện theo sau sẽ xảy ra:
  • Thanh ghi TMR2 bị xóa
  • Tín hiệu ngõ ra CCPx lên mức 1, ngoại trừ hệ số chu kỳ bằng 0% thì CCPx vẫn ở      mức 0.
  • Hệ số chu kỳ PWM được chuyển từ thanh ghi CCPRxL sang thanh ghi CCPRxH. 3.   TÍNH HỆ SỐ CHU KỲ XUNG PWM
Hệ số chu kỳ được thiết lập bởi giá trị lưu trong thanh ghi 10 bit gồm CCPRxL 8 bit và 2 bit còn lại là bit thứ 4 và thứ 5 ở trong thanh ghi CCPxCON – kí hiệu là CCPxCON<5:4>.
Giá trị của hệ số chu kỳ là 10 bit nên có thể thay đổi từ 0 đến 1023 tạo ra 1024 cấp giá trị điều khiển. Giá trị 10 bit thì 8 bit có trọng số lớn lưu trong thanh ghi CCPRxL và 2 bit còn lại có trọng số thấp thì ở CCPxCON<5:4>.
Hệ số chu kỳ của PIC16F877A được tính theo công thức:

DUTYCYCLEPWM = (CCPRxL CCPxCON < 5 : 4 >) * TOSC PVTMR2
- Đây là ảnh mô phỏng protues.

băm xung sử dụng biến trở pic16f877a

- Đây là code chương trình.
#include <16f877a.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)

#define use_portd_lcd TRUE
#include <lcd.c>

unsigned long int pot_data=0;
unsigned long int pwm_data=0;

void main()
{
   setup_psp(psp_disabled);
   setup_ccp1(ccp_pwm);
   setup_ccp2(ccp_off);
   setup_timer_1(t1_disabled);
   
   setup_timer_2(t2_div_by_1,170,1);
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(adc_clock_internal);
   
   lcd_init();
   printf(lcd_putc,"\f   DEMO PWM\nBY LAM 3 NGON");
   delay_ms(2000);

   do
   {

      set_adc_channel(0);
      delay_us(20);
      pot_data=read_adc();
      pwm_data=pot_data/6;
      set_pwm1_duty(pwm_data);
      printf(lcd_putc,"\fValue ADC.= %lu\nValue PWM= %lu",pot_data,pwm_data);
      delay_ms(1000);
      
   }
   while(1);
}
- Link download project Click here

Share this

Related Posts

Previous
Next Post »

3 nhận xét

Write nhận xét
March 29, 2016 at 1:51 AM delete

Muốn cho hiển thị lên led 7 thanh đc không pác ơi !

Reply
avatar
Anonymous
October 29, 2019 at 8:35 PM delete

cho em hỏi pwm_data=pot_data/6; chỗ adc đọc về sao lại chia 6 vậy a

Reply
avatar