PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Cần giúp về tính toán thông số cho PWM - PIC18F4431 (http://www.picvietnam.com/forum/showthread.php?t=6739)

superman136 26-07-2010 03:06 PM

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?

hovanphu 19-11-2010 11:11 PM

1 Attachment(s)
đây là file exell tính PWM của mình
bạn tham khảo thử
không biết có đúng không
mình cũn mới vào nghề.
nhờ anh em chỉ giúp


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

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