Thứ Năm, 14 tháng 6, 2018

Published tháng 6 14, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Ví dụ về PWM kết hợp ADC trên CCS


Bộ vi điều khiển PIC16F877A có hai mô-đun CCP và với các mô-đun này, chúng ta có thể tạo ra hai tín hiệu PWM (Pulse Width Modulation) PWM1 liên quan với CCP1 và PWM2 liên quan với CCP2. Cả hai mô đun PWM đều sử dụng Timer2 để tạo tín hiệu có nghĩa là hai mô-đun sẽ có cùng tần số.
Bài viết này sẽ hướng dẫn cách sử dụng mô-đun PWM PIC16F877A bằng trình biên dịch CCS PIC C. Trước tiên, chúng ta phải cấu hình mô-đun CCP để chạy dưới dạng PWM sử dụng các lệnh CCS sau:
setup_ccp1(CCP_PWM);           // Configure CCP1 as a PWM
setup_ccp2(CCP_PWM);           // Configure CCP2 as a PWM
Sau đó, chúng ta phải sử dụng Timer2 để thiết lập tần số pwm. 
Sử dụng các phương trình sau đây để tính toán tần số PWM:
PWM (period) = [(PR2) + 1] • 4 • Tosc • (TMR2 Prescale Value)
Trường này hợp tần số PWM được định nghĩa là 1/PWM period .
PWM period là chu kỳ băm xung.
PR2 là giá trị tải trước của Timer2, giá trị này dùng để xác định độ dài của một chu kỳ T
Tosc = 1/(tần số nội của MCU)
TMR2 Prescale Value là giá trị bộ chia có thể là  1, 4 hoặc 16.
Cho ví dụ : PR2 = 255 , tần số MCU= 8MHz và Prescale Value= 16 chúng ta sẽ nhận được một tần số PWM là 488Hz.
Cấu hình thông số cho timer2 bằng lệnh sau :
setup_timer_2(mode,  period, postscale)
Trong đó: mode là Giá trị Prescale Value TMR2period là PR2 và postscaler không được sử dụng trong việc xác định tần số PWM (nên giữ nó là 1).
Cho ví dụ : setup_timer_2(T2_DIV_BY_16, 255, 1);
Trên là bước xác định chu kỳ và tần số , sau khi xác định xong thì tiến hành xác định chu kỳ ON và chu kỳ OFF có nghĩ là trong 1 chu kỳ xung sẽ có mức cao và thấp (hay  1 và 0)
Ta sử dụng lệnh : 
set_pwm1_duty(Ton Value); 
set_pwm2_duty(Ton Value);
// trong đó Ton Value là chỉ số của chu kỳ ON nhưng phải luôn bé hơn hoặc bằng Period 
còn chu kỳ OFF thì tự nó tính trừ đi chu kỳ OFF bằng biểu thức Tof
Để cụ thể hơn , chúng ta sẽ đi lập trình một bài toán, điều chỉnh độ sáng của led bằng băm xung thông qua đọc giá trị điện áp vào chân ANALOG của PIC.



#include "main.h"
int16 i,j,n,m,k=0,l=0;
void main()
{
setup_adc(ADC_CLOCK_DIV_32); // chon bo chia ADC
setup_adc_ports(ALL_ANALOG); // mo tat cac cong ANALOG
setup_ccp1(CCP_PWM); // cai dat ccp1
setup_ccp2(CCP_PWM); // cai dat ccp1
delay_ms(100); // cho 100ms de hoan tat
setup_timer_2(T2_DIV_BY_16,255, 1); // cai dat de lay mau dua vao cong thuc
// truong hop co loc trung binh
while(false)
{
set_adc_channel(0); // chon kenh dau tien
delay_ms(1);
i=0; j=0; // tao gia tri mac dinh
for(n=0;n<50 50="" adc="" ap="" bien="" binh="" chia="" chon="" cong="" cua="" cycle="" dau="" de="" delay_ms="" dien="" duty="" for="" gan="" gia="" hop="" i="" j="" k="" kenh="" khong="" l="" lam="" lan="" loc="" m="0;m<50;m++)" n="" pre="" set_adc_channel="" set_pwm1_duty="" set_pwm2_duty="" tam="" tien="" toff="" ton="" tri="" true="" trung="" truong="" va="" vao="" while="">
      edit

0 nhận xét:

Đăng nhận xét