RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

hỏi: tạo PWM bằng timer1?

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • hongquyen
    Đệ tử 4 túi
    • Jun 2007
    • 74

    #1

    hỏi: 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);                  
       }
    }
    Last edited by hongquyen; 26-04-2010, 07:59 AM. Lý do: sai..
  • hongquyen
    Đệ tử 4 túi
    • Jun 2007
    • 74

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

    Comment

    Working...