|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
23-04-2010, 09:27 AM | #1 |
Đệ tử 4 túi
Tham gia ngày: Jun 2007
Bài gửi: 74
: |
kiểm tra hộ cách tạo PWM bằng timer1?
Mình chân thành cảm ơn
Chào mọi người. Mình có 1 câu hỏi cần nhờ các bạn giúp đỡ: Mặc dù trong con 16f887 đã có 2 bộ CCPx nhưng mình muốn dùng Timer1 để tạo ra để tạo xung PWM –nhưng vẫn chưa được! Yêu cầu:dùng dùng bộ chuyển đổi ADC để xác định mức cao cho xung PWM-dùng Timer1 Ghi chú:- T_h,T_l là thời gian mức cao và mức thấp của xung PWM - thạch anh=12MHz. - ADC dùng kênh 1. điện áp tham chiếu 0V và 5V - Dùng ngắt timer1 để thay đổi độ rộng xung. - Tần số PWM=1khz => T_s=1000us. Giải quyết: - Do ta dùng bộ adc để tạo T_h cho PWM nên T_h=(giá_trị_đọc_về/1024)*1000 - tính giá trị mức cao để nạp cho thanh ghi của timer1 mỗi khi có ngắt: value_T1=T_h/(1/3)=3*T_h Register_T1_h=65534-value_T1. - tính giá trị mức thấp để nạp cho thanh ghi của timer1 mỗi khi có ngắt: T_l=1000-T_h Register_T1_l=65534-(T_l/(1/3))=65534-3*T_l. - mình làm như vậy mà sao khi điều chỉnh biến trở mà tần số vẫn không hể thay đổi (chu kì của xung PWM cố định ở 32,29ms chứ kg phải là 1ms) Mình có kèm theo file mô phỏng (proteus). Mong mọi người giúp đỡ. Chân thành cảm ơn. Code:
#include<16f887.h> #device *=16 ADC=10 #FUSES NOWDT,HS,NOPUT,NODEBUG,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT #include<math.h> #use delay(clock=12000000) #define pwm2 59 //pin_c3 ngo ra PWM dung voi T1 float th1,tl1,value_adc1; //-------------------------------- #INT_TIMER1 void timer1_isr() { if (input_state(pwm2)) { OUTPUT_BIT(pwm2,0); SET_TIMER1(65534-tl1); } else { OUTPUT_BIT(pwm2,1); SET_TIMER1(65534-th1); } } //================================= void main() { unsigned int16 duty_pwm; float value_adc0; //---------------------------------- ENABLE_interrupts(INT_TIMER1); ENABLE_interrupts(global); SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1); setup_ccp1(CCP_PWM); setup_timer_2(T2_DIV_BY_16, 187, 1); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0|sAN1|VSS_VDD); OUTPUT_BIT(PIN_C3,1); SET_ADC_CHANNEL(1); delay_us(50); value_adc1=read_adc(); th1=(value_adc1/1024)*1000; tl1=(3*(1000-th1)); th1=(th1*3); SET_TIMER1(65534-th1); while(1) { SET_ADC_CHANNEL(0); delay_us(50); value_adc0=read_adc(); SET_ADC_CHANNEL(1); delay_us(50); value_adc1=read_adc(); value_adc0=(value_adc0/1024)*0.001; duty_pwm=ceil((value_adc0*12000000)/16); set_pwm1_duty(duty_pwm); th1=(value_adc1/1024)*1000; tl1=(3*(1000-th1)); th1=(th1*3); } } thay đổi nội dung bởi: hongquyen, 26-04-2010 lúc 08:59 AM. Lý do: sai.. |
|
|