📄 pid.c.bak
字号:
p_b=~p_b;
if(p_b==1) //峰值
{
rb_sample_num=r_sample_num;
r_sample_num=rp_sample_num;
rb_num=temp_rot_num;
temp_rot_num=rp_num;
if(rot_ok==1&&K21==ON)
PWM0=temp_rot_vp;
if(wire_ok==1&&WIRE==ON&&K31==ON)
PWM1=temp_wire_vp;
CTCON=CTCON|0X80; //CT3捕捉上升沿
}
else
{
if(rot_ok==1&&K21==ON)//&&r_slope_ok==1)
PWM0=temp_rot_vb;
if(wire_ok==1&&WIRE==ON&&K31==ON)//&&w_slope_ok==1)
PWM1=temp_wire_vb;
CTCON=CTCON|0X40; //CT3捕捉下降沿
}
IEN1=IEN1|0X08; //CT3
}
void CM0_INT (void) interrupt 11 //送丝速度变化时间/抽丝时间
{
CMI0=0;
c_cm0++;
if(retract==1)
{
if(c_cm0==n_cm0)
{
IEN1=IEN1&0XEF; //CM0
PWM1=0;
wire_enable=0;
retract_ok=1;
c_cm0=0;
}
CML0=TML2+0X50; //100ms
if(CML0<TML2)
CMH0=TMH2+1+0XC3;
else
CMH0=TMH2+0XC3;
}
else
{
if(c_cm0==n_cm0)
{
IEN1=IEN1&0xEF; //CM0
if(temp_wire_vp<wire_vp)
{
if(temp_wire_vp+1==wire_vp)
temp_wire_vp=wire_vp;
else
temp_wire_vp=temp_wire_vp+1;
}
if(temp_wire_vp>wire_vp)
{
if(temp_wire_vp==wire_vp+1)
temp_wire_vp=wire_vp;
else
temp_wire_vp=temp_wire_vp-1;
}
if(K31==ON)
{
if(temp_wire_vb<wire_vb)
{
if(temp_wire_vb+1==wire_vb)
temp_wire_vb=wire_vb;
else
temp_wire_vb=temp_wire_vb+1;
}
if(temp_wire_vb>wire_vb)
{
if(temp_wire_vb==wire_vb+1)
temp_wire_vb=wire_vb;
else
temp_wire_vb=temp_wire_vb-1;
}
}
c_cm0=0;
if(K31==OFF)
{
PWM1=temp_wire_vp;
if(temp_wire_vp==wire_vp)
{
if(wire_ok==0)
wire_ok=1;
else
w_slope_ok=1;
}
else
IEN1=IEN1|0x10; //CM0
}
else
{
if(temp_wire_vp==wire_vp&&temp_wire_vb==wire_vb)
{
PWM1=temp_wire_vb;
if(wire_ok==0)
wire_ok=1;
else
w_slope_ok=1;
}
else
IEN1=IEN1|0x10; //CM0
}
}
CML0=TML2+0xC8;
if(CML0<TML2)
CMH0=TMH2+1+0X00;
else
CMH0=TMH2+0X00;
}
}
void CM1_INT (void) interrupt 12 //旋转速度变化
{
CMI1=0;
if(rot_pid_ok==1)
{
new_rot_num=rot_num;
rot_num=0;
r_sample_num++;
switch(r_sample_num)
{
case 1: {
temp_rot_num[r_sample_num-1]=new_rot_num;
average_r_num=new_rot_num+average_r_num;
new_rot_num=0;
}break;
case 2: {
if(new_rot_num<=temp_rot_num[r_sample_num-2])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=new_rot_num;
}
else
temp_rot_num[r_sample_num-1]=new_rot_num;
average_r_num=new_rot_num+average_r_num;
new_rot_num=0;
}break;
case 3: {
if(new_rot_num<=temp_rot_num[r_sample_num-3])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-2])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=new_rot_num;
}
else
temp_rot_num[r_sample_num-1]=new_rot_num;
average_r_num=new_rot_num+average_r_num;
new_rot_num=0;
}break;
case 4: {
if(new_rot_num<=temp_rot_num[r_sample_num-4])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
temp_rot_num[r_sample_num-4]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-3])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-2])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=new_rot_num;
}
else
temp_rot_num[r_sample_num-1]=new_rot_num;
average_r_num=new_rot_num+average_r_num;
new_rot_num=0;
}break;
case 5: {
if(new_rot_num<=temp_rot_num[r_sample_num-5])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
temp_rot_num[r_sample_num-4]=temp_rot_num[r_sample_num-5];
temp_rot_num[r_sample_num-5]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-4])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
temp_rot_num[r_sample_num-4]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-3])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-2])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=new_rot_num;
}
else
temp_rot_num[r_sample_num-1]=new_rot_num;
average_r_num=new_rot_num+average_r_num;
new_rot_num=0;
}break;
case 6: {
if(new_rot_num<=temp_rot_num[r_sample_num-6])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
temp_rot_num[r_sample_num-4]=temp_rot_num[r_sample_num-5];
temp_rot_num[r_sample_num-5]=temp_rot_num[r_sample_num-6];
temp_rot_num[r_sample_num-6]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-5])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
temp_rot_num[r_sample_num-4]=temp_rot_num[r_sample_num-5];
temp_rot_num[r_sample_num-5]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-4])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
temp_rot_num[r_sample_num-4]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-3])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
temp_rot_num[r_sample_num-3]=new_rot_num;
}
else if(new_rot_num<=temp_rot_num[r_sample_num-2])
{
temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
temp_rot_num[r_sample_num-2]=new_rot_num;
}
else
temp_rot_num[r_sample_num-1]=new_rot_num;
average_r_num=new_rot_num+average_r_num;
new_rot_num=0;
}break;
case 7: {
if(new_rot_num<=temp_rot_num[r_sample_num-7])
average_r_num=average_r_num-temp_rot_num[5];
else if(new_rot_num>=temp_rot_num[r_sample_num-2])
average_r_num=average_r_num-temp_rot_num[0];
else
average_r_num=average_r_num-temp_rot_num[0]-temp_rot_num[5]+new_rot_num;
average_r_num=average_r_num*10/5;
rot_last_last_difference=rot_last_difference;
rot_last_difference=rot_difference;
rot_difference=academic_num-average_r_num;
rot_P=r_Kp*rot_difference;
rot_I=r_Ki*(rot_difference+rot_last_difference+rot_last_last_difference);
rot_D=r_Kd*(rot_difference-rot_last_difference);
rot_actual_difference=rot_P+rot_I+rot_D;
if(K21==ON&&p_b==0)
{
temp_rot_vb=255*(new_rot_num+rot_actual_difference)/22;
PWM0=temp_rot_vb;
}
else
{
temp_rot_vp=255*(new_rot_num+rot_actual_difference)/22;
PWM0=temp_rot_vp;
}
new_rot_num=0;
}break;
default: break;
}
}
if(rot_ok==0||r_slope_ok==0)
{
c_cm1++;
if(c_cm1==n_cm1)
{
IEN1=IEN1&0xDF; //CM1
if(temp_rot_vp<rot_vp)
{
if(temp_rot_vp+1==rot_vp)
temp_rot_vp=rot_vp;
else
temp_rot_vp=temp_rot_vp+1;
}
if(temp_rot_vp>rot_vp)
{
if(temp_rot_vp==rot_vp+1)
temp_rot_vp=rot_vp;
else
temp_rot_vp=temp_rot_vp-1;
}
if(K21==ON)
{
if(temp_rot_vb<rot_vb)
{
if(temp_rot_vb+1==rot_vb)
temp_rot_vb=rot_vb;
else
temp_rot_vb=temp_rot_vb+1;
}
if(temp_rot_vb>rot_vb)
{
if(temp_rot_vb==rot_vb+1)
temp_rot_vb=rot_vb;
else
temp_rot_vb=temp_rot_vb-1;
}
}
c_cm1=0;
if(K21==OFF)
{
PWM0=temp_rot_vp;
if(temp_rot_vp==rot_vp)
{
if(rot_ok==0)
rot_ok=1;
else
{
r_slope_ok=1;
r_sample_num=0;
// rp_sample_num=0;
}
rot_pid_ok=1;
}
}
else
{
if(temp_rot_vp==rot_vp&&temp_rot_vb==rot_vb)
{
PWM0=temp_rot_vb;
if(rot_ok==0)
rot_ok=1;
else
{
r_slope_ok=1;
r_sample_num=0;
rp_sample_num=0;
rb_sample_num=0;
}
rot_pid_ok=1;
}
}
}
if(rot_pid_ok==0)
{
CML1=TML2+0XC8;
if(CML1<TML2) //CM1,400us,旋转速度变化时间
CMH1=TMH2+1+0X00;
else
CMH1=TMH2+0X00;
}
else
{
CML1=TML2+0X10;
if(CML1<TML2) //CM1,20ms,PID采样周期
CMH1=TMH2+1+0X27;
else
CMH1=TMH2+0X27;
}
IEN1=IEN1|0x20; //CM1
}
}
main()
{
TMOD=0x22; //定时器1,方式2;
TL1=0XFD; //波特率9600
TH1=0XFD;
TR1=1; //启动定时器
PCON=0X00; //SMOD=0
TMOD=0x23; //定时器0,方式3,两个8位定时器;
TR1=0;
TF1=0;
S0CON=0XF8; //串口方式3,SM2=0,REN=1,TB8=1,RB8=0,TI=0,RI=0
IP0=0X98; //S0=1,T1=1
ES0=1; //开串口中断
ET0=1;
ET1=1;
ES1=1; //I2C
EAD=1; //AD中断允许
EA=1; //中断总允许
start_t2();
urgent_stop=0;
rw_err=0;
err_ok=0;
err=0;
BEGIN: if(urgent_stop==1)
{
urgent_stop=0;
err_ok=0;
EX1=1;
EX0=1;
}
IEN1=0X00;
send_enable=0;
rot_enable=0; //new
PWM1=0; //new
wire_enable=0; //new
PWM0=0; //new
work=0;
start=0;
start_rot=0;
start_wire=0;
stop_wire=0;
decrease=0;
need_para=0;
nonce_sec=0;
in_sector=0;
new_sector=0;
noans_ok=1;
S_ANSW=0;
// R_ANSW=0;
POINTER0=0;
SSUM=0;
POINTER1=0;
RSUM=0;
r_byte_nums=4;
send=0;
overtime=0;
receive_p_out=0;
receive_p_in=0;
demand=0;
resend=0;
ans=0;
p_b=0; //基值
temp_pulse_num=0;
temp_pulse_num1=0;
FINISH=0;
temp_FINISH=0;
rot_front=0;
rot_reverse=0;
rot_ok=0;
rot_stop=0;
rot_stop_ok=0;
rot_num=0;
new_rot_num=0;
rot_pid_ok=0;
average_r_num=0;
rot_difference=0;
rot_last_difference=0;
rot_last_last_difference=0;
wire_add=0;
wire_dec=0;
wire_ok=0;
r_slope_ok=1;
w_slope_ok=1;
wire_pid_num=0;
wire_pid_ok=0;
motor_stop=0;
retract=0;
c_cm0=0;
c_cm1=0;
k_r_p_add=0;
k_r_b_add=0;
k_r_p_dec=0;
k_r_b_dec=0;
temp_rot_vp=0;
temp_rot_vb=0;
temp_wire_vp=0;
temp_wire_vb=0;
retract_ok=0;
auto_return=0;
return_ok=0;
ask_return_ok=0;
to_begin=0;
PWMP=3; //23.5K
CTCON=CTCON|0X02; //CT0捕捉下降沿
tooth_num=10;
EX1=1;
EX0=1;
while(start==0)
{
if(called==1)
{
ini_sbuf(M_main,infor,com_calling,S_ANSW,0,0);
s_byte_nums=get_byte_nums(infor);
TR_noans();
called=0;
}
if(receive_p_out==1)
{
point=&pp.k2;
for(p_sec=0;p_sec<24;p_sec++)
*(point+p_sec)=rbuffer[p_sec*2+2]*256+rbuffer[p_sec*2+3];
pp.k1=rbuffer[50];
ini_sbuf(M_main,answer,S_ANSW,0,0,0);
s_byte_nums=4;
TR_noans();
demand=0;
receive_p_out=0;
}
if(receive_p_in==1)
{
point=&pp.x[nonce_sec][0];
for(p_sec=0;p_sec<10;p_sec++)
*(point+p_sec)=rbuffer[p_sec*2+3]*256+rbuffer[p_sec*2+4];
ini_sbuf(M_main,answer,S_ANSW,0,0,0);
s_byte_nums=4;
TR_noans();
demand=0;
receive_p_in=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -