智能车制作

标题: 我写的PID跪求解决 [打印本页]

作者: 90后    时间: 2012-6-22 11:23
标题: 我写的PID跪求解决
我写的PID控制不起,跪求高手解决???、小弟感激不尽
int speed=0;
int s=0;
int s1=0;
void init_PACA()
{
   PACTL=0x50;//PAEN=1为PAC3 PAC2级联/PAMOD=0 PEDGE=0上升沿计数/
   TIOS_IOS7=0;//通道7作输入捕捉
    PACNT=0x00;//寄存数据
}
void TIM_Init(void)
{
    TSCR1=0x00;   //禁止
    TIOS=0x04;      //外部输入捕捉0,1通道,通道2输出比较
    TCTL4=0x09;      //通道0 上升沿触发,通道1下降沿触发
   
    TSCR2=0x07;      //128分频后为625KHZ  50ms  
    TC2=0xF424;       //31250   
    TIE=0x07;          //通道 0,1,2 中断使能      
    TSCR1=0x80;   //使能
}
int pid(int Kp,int Kd,int s)
{
  // s   当前值
  //  s1  上次值
     DDRE=0xff;//点亮单片机上面2个灯
    PORTE=~PORTE;
    s=(s/Kp)+(s1-s)/Kd;     
    return s;
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 10 void TIM(void)
{      
      
    speed=pid(5,5,PACNT);       // s   当前值
     s1=speed;                        //  s1  上次值
     if(speed>25){Dianji_data=12;}
     if(speed<-15){Dianji_data=-10;}     
     Dianji_data=10+speed;   
         
    PACNT=0;     //寄存数据      
    TFLG1_C2F=1;  //请中断标志位
    TC2=TCNT+0xF424;
   
}


作者: cqu_cj    时间: 2012-6-22 11:49
用PE的看到你们这样写的程序就真心难受!/*------------------------
功能说明:电机舵机PID模块
-----------------------*/
#include"PID.h"
#include "Cpu.h"
#include "Events.h"
#include "KONGZHIMOKUAI.h"

#define KP 0.5   //0.6
#define KI 0.06  //0.08
#define KD 0.04  //0.02

word idea_speed=500;   //单位为cm/s
word real_speed=0;        //单位为cm/s
int uk=0;                          //u[k]
static int number=0;
int ek=0;          //偏差e[k]
static int ek1=0;          //偏差e[k-1]
static int ek2=0;          //偏差e[k-2]
static int uk1=0;          //对uk四舍五入
static int deltauk;
char flag1;
/*----------------------------------
测速模块初始化:cesuchushihua()
----------------------------------*/
void cesuchushihua(void)
{
        setReg(TMRA2_CTRL,0);
        setReg(TMRA2_SCR,0x00);
        setReg(TMRA2_CNTR,0);
        setReg(TMRA2_LOAD,0);
        setRegBitGroup(TMRA2_CTRL,CM,0x01);
}


/*----------------------------------
测速模块:cesumokuai()
----------------------------------*/
void cesumokuai(void)
{
        number=getReg(TMRA2_CNTR);
        setReg(TMRA2_CNTR,0);  
        real_speed=(word)(0.94737*number);     
}

/*----------------------------------
PID模块:dianjiPID()
----------------------------------*/
void dianjiPID(void)
{
                deltauk=KP*(ek-ek1)+KI*(ek)+KD*(ek-2*ek1+ek2);
                ek2=ek1;
                ek1=ek;       
                uk=uk1+deltauk;       
                if(uk<-99)
                        uk=-99;
                if(uk>99)
                        uk=99;
                uk1=uk;
                if(sc_flag==0)
                {
                        if(uk<0)
                        {
                                uk=99+uk;
                                DIANJI_DIRECTION_IO1_SetVal();
                                DIANJI_PWM_SetDutyUS(uk);
                        }
                        else
                        {
                                DIANJI_DIRECTION_IO1_ClrVal();
                                DIANJI_PWM_SetDutyUS(uk);       
                        }
                }
                else
                {
                        sc_flag=sc_flag-1;
                        DIANJI_DIRECTION_IO1_SetVal();
                        DIANJI_PWM_SetDutyUS(60);
                }               
                if(uk1<-95)
                        flag1++;
                else
                        flag1=0;
                if(flag1>4)
                {
                        DIANJI_ENABLE_IO2_ClrVal();
                }               
}
作者: usstwhw    时间: 2012-6-22 16:33





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2