PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   hỏi: tạo PWM bằng timer1? (http://www.picvietnam.com/forum/showthread.php?t=6209)

hongquyen 23-04-2010 09:27 AM

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);                 
  }
}


hongquyen 26-04-2010 08:54 AM

huhu, ai giúp em với ạ !!!!!!


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam