Chia sẻ Điều khiển động cơ bằng phương pháp PID với PIC

duyngoc1995

Học sinh phổ thông
#61
Chào mọi người !
Mong mọi người giải thích giúp điểm này !
Khi ta tính được Error và đưa vào giải thuật PID vậy đầu ra Output của mình sẽ có thứ nguyên là gì ? và nó được so sánh với cái gì để có thể cài đặt lại Duty Cycle.
Giả sử mô phỏng trong Matlab simulink thì Output ra là giá trị điện áp cấp vào động cơ!

Mong mọi người giúp đỡ. Tks mọi người!
 

duyngoc1995

Học sinh phổ thông
#62
if (Output >PWM_Period) Output=PWM_Period-1;
if (Output <=0) Output=1;
set_pwm1_duty((int16)Output); //gan duty cycle cho CCP1 update PWM
pre_Err=Err; //luu lai gia tri error

Mọi người cho hỏi tại sao Output được so với PWM_Period vậy ? Mình chưa hiểu được chỗ này, mong mọi người chỉ giúp !
 
#63
if (Output >PWM_Period) Output=PWM_Period-1;
if (Output <=0) Output=1;
set_pwm1_duty((int16)Output); //gan duty cycle cho CCP1 update PWM
pre_Err=Err; //luu lai gia tri error

Mọi người cho hỏi tại sao Output được so với PWM_Period vậy ? Mình chưa hiểu được chỗ này, mong mọi người chỉ giúp !
duty = Output/PWM_Period, nếu Output > PWM_Period thì duty > 100% ah !
PWM_Period là giá trị đếm ra chu kì tần số đóng cắt.
Output là giá trị gán thời gian on-time. Trong một số con DSPic có thể set là offtime, duty âm và duty dương tùy thuộc yêu cầu điều khiển, :)
 

duyngoc1995

Học sinh phổ thông
#64
duty = Output/PWM_Period, nếu Output > PWM_Period thì duty > 100% ah !
PWM_Period là giá trị đếm ra chu kì tần số đóng cắt.
Output là giá trị gán thời gian on-time. Trong một số con DSPic có thể set là offtime, duty âm và duty dương tùy thuộc yêu cầu điều khiển, :)
Bạn cho mình hỏi duty cycle = output / (PWM_Period) là ở phần tài liệu nào. Mình chưa hiểu chỗ này !
Trong CCS người ta cài đặt duty cycle = value / 4*(PR2+1)
 

duyngoc1995

Học sinh phổ thông
#65
Thấy có mấy bạn cứ thích dùng PIC không thích AVR cho đề tài PID này lắm. Mình chuyển code cho bạn nào dùng PIC nhé !
Xem đính kèm 12072

Mã:
/******************************************************************************
Project : DKDC PP PID
Version : V2.0
Date    : 21/02/2013
Update  : 19/09/2013
Author  : Dao Xuan Truong
Company : vtechpro.vn
Comments:

Chip type               : PIC16F88
Program type            : Application
Clock frequency         : 10,000000 MHz

******************************************************************************/
#include "PID1.h"
//Dinh nghia cac duong dieu khien motor
#define Sampling_time        50     //thoi gian lay mau (ms)
#define inv_Sampling_time    20     // 1/Sampling_time
#define PWM_Period           1023

unsigned int16 Pulse=0,pre_Pulse=0;
signed long rSpeed=0,Err=0 , pre_Err=0; //thanh phan PID
float Kp=5, Kd=0.6, Ki=2.4; //thanh phan PID
float pPart=0, iPart=0, dPart=0; //thanh phan PID
unsigned long Ctrl_Speed=10;     //van toc can dieu khien (desired speed)
unsigned int16 Output;// absrSpeed;
unsigned char sample_count=0;
void Motor_Speed_PID(long int des_Speed);

#int_EXT
void  EXT_isr(void)
{
if(!input(PIN_B0))Pulse++;
else Pulse--;
}

#int_TIMER1
void  TIMER1_isr(void)
{
    Set_timer1(3035);//25ms
    sample_count++;
    Motor_Speed_PID(Ctrl_Speed);
}

void Motor_Speed_PID(unsigned long des_Speed){
  
    rSpeed=Pulse-pre_Pulse;     //tinh van toc (trong sampling time)
    pre_Pulse=Pulse;
    Err=des_Speed-abs(rSpeed);  //tinh error (loi)
    pPart=Kp*Err;
    dPart=Kd*(Err-pre_Err)*inv_Sampling_time;
    iPart+=Ki*Sampling_time*(Err+pre_Err)/2000;
    Output +=pPart+dPart+iPart;     //cong thuc duoc bien doi vi la dieu khien van toc
    if (Output >PWM_Period) Output=PWM_Period-1;
    if (Output <=0) Output=1;
    set_pwm1_duty((int16)Output); //gan duty cycle cho CCP1 update PWM  
    pre_Err=Err;  //luu lai gia tri error
}

void main()
{
   set_tris_a(0xff);
   //set_tris_b(0x01);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
   setup_timer_2(T2_DIV_BY_16,255,1);
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_EXT);
   ext_int_edge( H_TO_L );   // Sets up EXT
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   while(true)
   {
   ;
   }
}[CODE]
Chào bạn ! Bạn cho mình hỏi PWM_Period 1023 được tính như thế nào và tại sao Output được so sánh với nó không ? Tks bạn!
 

kuhmm

Học sinh phổ thông
#66
Có ai biết tần số băm xung PWM trong ví dụ đó không?
EM tính ra gần 2,5KHz, không biết đúng hay không nhỉ????
 

Quảng cáo Google