View Single Post
Old 26-07-2010, 03:06 PM   #1
superman136
Nhập môn đệ tử
 
Tham gia ngày: Jan 2010
Bài gửi: 1
:
Cần giúp về tính toán thông số cho PWM - PIC18F4431

Các anh ơi, em là newbie mới tập học về PIC bằng CCS, em đang làm 1 cái đồ án về điều khiển Brushless DC motor. Mà cái động cơ của em sử dụng 1 ESC (tức là 1 driver giúp điều khiển động cơ đó). Công việc còn lại là chỉ cần cấp nguồn và xung vuông PWM cho cái ESC với đúng tần số yêu cầu - 50Hz là nó chạy thôi. Nhưng không hiểu sao em đã config các thông số của (setup_power_pwm) rất kĩ rồi mà vẫn ko ra đúng 50Hz. Các bác xem giúp em cái code với ạh. :
Code:
#include <18f4431.h>
#include <DEFS_18F4431.h>
#fuses  HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)
#include <lcd_4bit.h>
#define use_portd_lcd true
int16 duty_cycle0=0;
int16 duty_cycle0_x=0;
int16 dem=0;
int16 xung=0;
int16 rps=0;
void display_lcd();
#INT_EXT
void ngatngoai0()
   {
      xung++;
      INT0F=0;
   }
#INT_PWMTB
void interrupt_pwmtb()
   {
       dem++;
       if (dem==5)
       {
          rps=xung;
          dem =0;
          xung=0;
       }
   }
void main()
   {
      set_tris_b(0);    // port B la xuat
      portb=0;
      set_tris_c(0b00001000);
      portc=0b00000110;
      set_tris_d(0);
      portd=0;
      set_tris_a(0xff);
      porta=0xff;
      lcd_init();//setup LCD    
  
      PTCON1=0b10000000;  //setup power PWM // dung che do ngat time base
      SETUP_POWER_PWM(PWM_CLOCK_DIV_64|PWM_FREE_RUN,1,0,938,0,1,0);//  12M/4/64/937.5=50hz hay chu ki là 20ms
      SETUP_POWER_PWM_PINS(PWM_COMPLEMENTARY,PWM_OFF,PWM_OFF,PWM_OFF);
      set_power_pwm0_duty(0); 
      duty_cycle0=150;

      display_lcd();
      enable_interrupts(INT_PWMTB);
      enable_interrupts(INT_EXT); //interrupts
      EXT_INT_EDGE(L_TO_H);
      enable_interrupts(global);
      while(1)
      {
         display_lcd();
 
         SET_POWER_PWM0_DUTY(duty_cycle0);
         if(RC1==0)
         {
             delay_ms(50);
             if(RC1==0)
             {
                if(duty_cycle0>=3600)
                duty_cycle0=3600;
                else duty_cycle0=duty_cycle0+50;
                duty_cycle0_x=duty_cycle0*53/500;
             }
         }
         if(RC2==0)
         {
             delay_ms(50);
             if(RC2==0)
             {
                if(duty_cycle0<=150)
                duty_cycle0=150;
                else duty_cycle0=duty_cycle0-50;
                duty_cycle0_x=duty_cycle0*53/500;
             }
         }
      }
}
void display_lcd()
{
lcd_setposition(0x00);
printf(lcd_putc,"h_p=%lu",duty_cycle0_x);
lcd_setposition(0x40);
printf(lcd_putc,"RPM=%lu",rps*30);
}
PS: em đã xem cách tính đó trong datasheet không biết có đúng không?

thay đổi nội dung bởi: superman136, 26-07-2010 lúc 06:42 PM.
superman136 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn