智能小车
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar i=0;
***it IN1=P1^2;
***it IN2=P1^3;
***it IN3=P1^4;
***it IN4=P1^5;
***it ENA=P1^6;
***it ENB=P1^7;
int e ,e1;//偏差
float uk,uk1,duk ;//输出值
float Kp=20;//控制系数 20,
int out=0;
uint SpeedSet=300;
uint cnt=0;
uint Inpluse=0,num=0;//脉冲计数
uint PWMtime=100;//脉冲宽度
void Control();
void SystemInit();
void delay(uchar x);
void PWMOUT();
/**************主函数************/
void main()
{
SystemInit();
while(1)
{
SpeedSet=300;
PWMOUT(); //输出PWM
}
}
void Control() //偏差计算
{
e=SpeedSet-num; //误差=设定值-1s采集的脉冲值
duk=Kp*(e-e1);
uk=uk1+duk;
out=(int)uk; //输出为占空比
if(out>1000)
{
out=1000;
}
else if(out<0)
{
out=0;
}
uk1=uk; //变量值移位
e1=e;
PWMTime=out;
}
void delay(uchar x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=50;j>0;j--);
}
void PWMOUT() //输出PWM脉冲
{
if(cnt
{
ENA=1;
ENB=1;
IN1=1;IN2=0;IN3=1;IN4=0;
}
else
{
ENA=0;
ENB=0;
}
if(cnt>1000) cnt=0;
}
void SystemInit()
{
TMOD=0X21; //定时器1用来控制pwm,定时器0,用来计算转速
TH0=0XF9;
TL0=0X0F;
TH1=0xC0;
TL1=0XC0;
ET1=1;
ET0=1;
TR0=1;
TR1=1;
EX0=1; //中断0用来测量转速
IT0=1;
EA=1;
e =0; //初始化 差值
e1=0;
}
void int0() interrupt 0
{
Inpluse++; //采集外部脉冲
}
void t0() interrupt 1
{
static unsigned char Bit=0;//静态变量,退出程序值保留
static unsigned int time=0;
TH0=0XF9; //赋初值
TL0=0X0F; //赋初值
Bit++;
time++; //转速测量周期
if(Bit>8) Bit=0;
P0=0xff;
if(time>100)
{
time=0;
num=Inpluse*5; //算得1s采集的脉冲数
Inpluse=0;
Control(); //调用比例控制算法,输出PWM
}
}
void timer_1() interrupt 3
{
cnt++; //cnt越大占空比越高2.5Khz
}
已退回2积分
更多回帖