PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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
Prev Previous Post   Next Post Next
Old 23-04-2010, 09:27 AM   #1
hongquyen
Đệ tử 4 túi
 
hongquyen's Avatar
 
Tham gia ngày: Jun 2007
Bài gửi: 74
:
Question 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..
hongquyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam