📄 text22.c
字号:
case 52: prop_float=211;break; /* '2' */
case 53: prop_float=218;break; /* '3' */
case 54: prop_float=226;break; /* '4' */
case 55: prop_float=232;break; /* '5'and's' */
case 56: prop_float=240;break; /* '6' */
case 57: prop_float=247;break; /* '7' */
case 58: prop_float=254;break; /* '8' */
case 59: prop_float=262;break; /* '9' */
case 60: prop_float=269;break; /* '0' */
case 61: prop_float=276;break; /* '1'and'i' */
case 62: prop_float=283;break; /* '2' */
case 63: prop_float=291;break; /* '3' */
case 64: prop_float=298;break; /* '4' */
case 65: prop_float=305;break; /* '5'and's' */
case 66: prop_float=313;break; /* '6' */
case 67: prop_float=320;break; /* '7' */
case 68: prop_float=328;break; /* '8' */
case 69: prop_float=335;break; /* '9' */
case 70: prop_float=343;break; /* '0' */
case 71: prop_float=351;break; /* '1'and'i' */
case 72: prop_float=358;break; /* '2' */
case 73: prop_float=366;break; /* '3' */
case 74: prop_float=374;break; /* '4' */
case 75: prop_float=382;break; /* '5'and's' */
case 76: prop_float=391;break; /* '6' */
case 77: prop_float=399;break; /* '7' */
case 78: prop_float=407;break; /* '8' */
case 79: prop_float=416;break; /* '9' */
case 80: prop_float=425;break; /* '0' */
case 81: prop_float=433;break; /* '1'and'i' */
case 82: prop_float=442;break; /* '2' */
case 83: prop_float=451;break; /* '3' */
case 84: prop_float=461;break; /* '4' */
case 85: prop_float=471;break; /* '5'and's' */
case 86: prop_float=481;break; /* '6' */
case 87: prop_float=492;break; /* '7' */
case 88: prop_float=502;break; /* '8' */
case 89: prop_float=514;break; /* '9' */
case 90: prop_float=525;break; /* '0' */
case 91: prop_float=537;break; /* '1'and'i' */
case 92: prop_float=550;break; /* '2' */
case 93: prop_float=564;break; /* '3' */
case 94: prop_float=579;break; /* '4' */
case 95: prop_float=595;break; /* '5'and's' */
case 96: prop_float=612;break; /* '6' */
case 97: prop_float=633;break; /* '7' */
case 98: prop_float=655;break; /* '8' */
case 99: prop_float=687;break; /* '9' */
case 100: prop_float=735;break; /* '0' */
default: prop_float=196;
}
prop_int=prop_float+0.5;
EA=1;
}
/*自动拟合模块,调整coe[]的值*/
void Adjust()
{
EA=0;
coe_pv[0]=7.22286*adjust_Prop[1]-12.1976*adjust_Prop[2]+5.97479*adjust_Prop[3];
coe_pv[1]=-0.166667*adjust_Prop[1]+0.352941*adjust_Prop[2]-0.186275*adjust_Prop[3];
coe_pv[2]=0.0952381*adjust_Prop[1]-0.235294*adjust_Prop[2]+0.140056*adjust_Prop[3];
adjust_count=1;
adjust_Prop[1]=327;
adjust_Prop[2]=429;
adjust_Prop[3]=504;
EA=1;
}
/*闭环控制模块*/
void CLC_func()
{
if(AD_flag) /*处理AD转换的任务*/
{
ADDR_0804 = 0 ; /* 启动一次AD转换*/
if (AD_ptr >= AD_SMPL_NUM ) /*计算平均值*/
{
AD_ptr = 0;
AD_value = 0;
for(i=0;i<AD_SMPL_NUM;i++)
{
AD_value += AD_data[i];
}
AD_value = AD_value/AD_SMPL_NUM;
}
AD_flag=0;
}
if(DelayCounter>CLC_DELAY) /*延时一定时间之后调整占空比*/
{
AD_require=ad_change(volt);
DelayCounter=0; /*重置延时计数器*/
AD_ptr=0;
/*闭环占空比调整部分*/
AD_temp= AD_value-AD_require;
if( (AD_temp) >0) /*AD_value大了,电压低了,Prop应增加*/
{/*分段调整,根据差值的大小动态改变占空比,实现1秒之内的调整速度*/
if((AD_temp)>35)
{
prop_int+=25;
prop_float=prop_int;
}
else if((AD_temp)>10)
{
prop_int+=10;
prop_float=prop_int;
}
else
{
prop_int++;
prop_float=prop_int;
}
change_flag=1;
if (setting_flag)
{
refresh_flag=1;
}
}
else if(AD_temp<-0)
{
if(AD_temp<-35)
{
prop_int-=25;
prop_float=prop_int;
}
else if(AD_temp<-10)
{
prop_int-=10;
prop_float=prop_int;
}
else
{
prop_int--;
prop_float=prop_int;
}
change_flag=1;
if (setting_flag)
{
refresh_flag=1;
}
}
}
}
/***************
主程序
***************/
main()
{
/* 单片机系统初始化 */
P1=0XFF;
P3=0XFF;
/* 中断工作寄存器初始化 */
PT0=0;
IE=0X80;
IP=0;
PT1=1;
IT0=0;
IT1=0;
/* 定时器工作寄存器初始化 */
TMOD=0X11;
TH1=(65536-11059200/12/2)/256;
TL1=(65536-11059200/12/2)%256;
TH0=V_TH0;
TL0=V_TL0;
/* 串行通信口工作初始化 ,注:本例中虽未使用到串行通信口,但本段程序无妨保留 */
SM0=0; /*SCOM MODE 1 (8BIT UART VARBR)*/
SM1=1;
SM2=0;
REN=1;
TI=1;
/* 全局变量赋初值 */
/*数码管扫描*/
digi_scaner=1;
/*以下按键消抖变量清零*/
key1_flag=0;
key2_flag=0;
key3_flag=0;
key4_flag=0;
key1_count=0;
key2_count=0;
key3_count=0;
key4_count=0;
cur_sample1=0;
pre_sample1=0;
cur_sample2=0;
pre_sample2=0;
cur_sample3=0;
pre_sample3=0;
cur_sample4=0;
pre_sample4=0;
/*输出置零*/
PWM_OUT=0;
/*状态标志初值*/
refresh_flag=1;
setting_flag=0;
change_flag=1;
/*任务变量赋初值,默认输出频率为400Hz,占空比32.4%,电压5.0V*/
volt=50;
prop_int=310;
prop_float=prop_int;
/*pv多项式系数赋初值*/
coe_pv[0]=134.98438;
coe_pv[1]=3.20414;
coe_pv[2]=0.00664;
/*自动拟合*/
adjust_count=1;
adjust_Prop[1]=327; //v=5.4
adjust_Prop[2]=429; //v=7.9
adjust_Prop[3]=504; //v=9.6
/*ADC变量赋初值*/
AD_flag =1;
AD_ptr=0;
AD_value=1;
AD_require=241;
/*开/闭环控制变量赋初值*/
CLC_flag=0;
DelayCounter=0;
/** 开定时器,定时器中断允许 **/
TR0=1;
TR1=1;
ET0=1;
ET1=1;
/******************************************
主循环模块
在T0、T1中断服务程序未被执行的空余时间里,
处理机在以下程序中不断循环
*******************************************/
while(1)
{
/************************
按键服务子模块
**************************/
if(key4_flag)
/*按键四:可以进入不同状态,setting_falg==0为OPEN/CLOSE,称非设置状态
1,2,3称设置状态,1为电压,2为占空比,3为自动拟合按键服务*/
{
if( (++setting_flag)>3 )
{
setting_flag=0;
}
refresh_flag=1;
key4_flag=0;
}
if(key3_flag)
{
if(setting_flag==0)
/*按键三:0为开环、闭环控制切换*/
{
CLC_flag=!CLC_flag;
}
else if(setting_flag==3)
/*按键三:3为自动拟合流程控制*/
{
if( (++adjust_count)>ADJUST_NUM )
{
Adjust();
}
}
key3_flag = 0;
refresh_flag=1;
}
if(key1_flag)
{
/*在设置状态下,1号按键的作用是增加*/
if(setting_flag==1)
{
if(volt<100)
{
volt+=1;
}
/*电压调整后计算占空比*/
Calc_Prop(volt);
}
else if(setting_flag==2)
{
if(prop_int<1000)
{
prop_int+=1;
prop_float=prop_int;
}
}
else if(setting_flag==3)
{
if(adjust_Prop[adjust_count]<1000)
{
adjust_Prop[adjust_count]+=1;
}
}
refresh_flag=1;
change_flag=1;
key1_flag=0;
}
if(key2_flag)
{
/*在设置状态下,2号按键的作用是减少*/
if(setting_flag==1)
{
if(volt>50)
{
volt-=1;
}
/*电压调整后计算占空比*/
Calc_Prop(volt);
}
else if(setting_flag==2)
{
if(prop_int>0)
{
prop_int-=1;
prop_float=prop_int;
}
}
else if(setting_flag==3)
{
if(adjust_Prop[adjust_count]>0)
{
adjust_Prop[adjust_count]-=1;
}
}
refresh_flag=1;
change_flag=1;
key2_flag=0;
}
/**********************************************
CLC_flag=1启动闭环控制
***********************************************/
if(CLC_flag)
{
CLC_func();
}
/*************************************
子模块:T1初值的计算,辅助<PWM信号发生>
**************************************/
if(change_flag)
{
EA=0;
hilv_time = 65536-(TOTAL_TIME*prop_float/1000); //"/1000"是因为prop_float的单位是千分之一
lolv_time = 65536-(TOTAL_TIME-(65536-hilv_time));
hilv_th = hilv_time/256;
hilv_tl = hilv_time%256;
lolv_th = lolv_time/256;
lolv_tl = lolv_time%256;
change_flag=0;
EA=1;
}
/*******************************
数码管显示刷新子模块
********************************/
if(refresh_flag)
{
EA=0;
/*刷新:setting_flag==0为OPEN/CLOSE,1为电压,2为占空比,3为自动拟合按键服务*/
if(!setting_flag)
{
if(!CLC_flag) //OPEN
{
digi[0] = 0;
digi[1] = 30;
digi[2] = 14;
digi[3] = 26;
}
if(CLC_flag)
{
digi[0] = 12;
digi[1] = 1;
digi[2] = 5;
digi[3] = 13;
}
}
else if(setting_flag==1)
{
digi[0] = 29;
digi[1] = volt/100;
digi[2] = volt/10%10+16;
digi[3] = volt%10;
}
else if(setting_flag==2)
{
digi[0] = 30;
digi[1] = prop_int/100%10;
digi[2] = prop_int/10%10+16;
digi[3] = prop_int%10;
}
else if(setting_flag==3)
{
digi[0] = 30;
digi[1] = adjust_Prop[adjust_count]/100%10;
digi[2] = adjust_Prop[adjust_count]/10%10+16;
digi[3] = adjust_Prop[adjust_count]%10;
}
refresh_flag=0;
EA=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -