📄 main.c
字号:
y=DATA1[k];
}
else //否则送修改参数
{
x=10; //熄灭一行数码管
if(k==R) //如果当前显示位与键盘修改位相等,则根据闪烁标志送黑码。
{
if(SF==0)
y=10;
else
y=DATA0[k];
}
else
y=DATA0[k]; //否则直接送显示数
}
//__________________________________________________________________________________________________________
w++; //显示刷新计数器+1。
T0Flag=0; //显示标志位清除。
IOCLR = HC595_CS; // 片选74HC595
// rcv_data = MSPI_SendData(digitable[x]); // 发送显示数据
// rcv_data = MSPI_SendData(digitable[y]); // 发送显示数据
rcv_data = MSPI_SendData(digitable[y]); // 发送显示数据 (修改的)
rcv_data = MSPI_SendData(digitable[x]); // 发送显示数据
rcv_data = MSPI_SendData(selectable[k]); // 发送显示位码
IOSET = HC595_CS; //74HC595锁存数据
//__________________________________________________________________________________________________________
if((IO0PIN&KEY) != 0) //键盘按键检测 !=0: 没按
{
if(TK==k) //如果键盘记录位(TK) 与当前扫描位(K) 相等,执行键功能。
{
switch(TK) //执行TK键盘号功能0~3。
{
case 0: //0#功能为模式键M+1。
{
if(M==8) // M=1 ,1个参数,只能修改一个参数 UO_def
M=1;
else
M++;
switch(M) //取出1~4#参数送显示,以便人机对话修改参数。
{
case 1:
{
CONVBIT0(CS[0],0);
CONVBIT0(M,4);
}
break;
case 2: //以下,在本程序中没用
{
CONVBIT0(CS[1],0);
CONVBIT0(M,4);
}
break;
case 3:
{
CONVBIT0(CS[2],0); ////调基准电压Vref CS[2]
CONVBIT0(M,4);
}
break;
case 4:
{
CONVBIT0(CS[3],0);
CONVBIT0(M,4);
}
break;
case 5:
{
CONVBIT0(CS[4],0);
CONVBIT0(M,4);
}
break;
case 6:
{
CONVBIT0(CS[5],0);
CONVBIT0(M,4);
}
break;
case 7:
{
CONVBIT0(CS[6],0);
CONVBIT0(M,4);
}
break;
case 8:
{
CONVBIT0(CS[7],0);
CONVBIT0(M,4);
}
break;
}
}
break;
case 1: //1#功能为右移键标志位R+1。
{
if(R==3)
R=0;
else
R++;
}
break;
case 2: //2#功能为加键,当前闪烁位+1。
{
if(DATA0[R]==9)
DATA0[R]=0;
else
DATA0[R]++;
}
break;
case 3: //3#功能为回车确认键操作,将修改好的参数送回参数区。
{
while(!M==0)
{
// R=0; //R、M标志归零。
// M=0;
switch(M)
{
//-------------------------------------------------------------
case 1: //M=1是修改 第1级 输出电压,要重算Duty
{
CS[M-1]=DATA0[0]+DATA0[1]*10+DATA0[2]*100+DATA0[3]*1000; //把修改好的回送到CS[0]
//重新设置了 需要的 输出电压 Uo_def,要重新计算占空比
Duty = (Uo_def * 10000 )/ Uin ; //万份之几 的占空比( 扩大了10000倍的)
}
break;
//-------------------------------------------------------------
case 2:
{}
break;
//-------------------------------------------------------------
case 3: //vref
{
CS[M-1]=DATA0[0]+DATA0[1]*10+DATA0[2]*100+DATA0[3]*1000; //把修改好的回送到CS[0]
}
break;
//-------------------------------------------------------------
case 4:
{}
break;
//-------------------------------------------------------------
case 5: //M=5是修改 第2级 输出电压,要重算Duty
{
CS[M-1]=DATA0[0]+DATA0[1]*10+DATA0[2]*100+DATA0[3]*1000; //把修改好的回送到CS[4]
if(CS[M-1]>6000) //限制设置 第2级 最大输出电压为6V
{ CS[M-1] = 6000;}
//重新设置了 需要的 输出电压 Uo_def,要重新计算占空比
Duty2 = (Uo2_def * 10000 * 10) / ((3300 * 10) * 2) ;//万份之几 的占空比( 扩大了10000倍的)
}
break;
//-------------------------------------------------------------
case 6:
{}
break;
//-------------------------------------------------------------
case 7:
{}
break;
//-------------------------------------------------------------
case 8:
{}
break;
}
R=0; //R、M标志归零。
M=0;
}
}
break;
case 4: //4#功能为 换屏键
{
if(display==1)
{
display=2;
}
else
{
display=1;
}
}
};
TK=0x09; //键记录位清除。
}
}
else if((IO0PIN&KEY) == 0) //如果当前键盘位=0,则再读键盘、延时再读=0则记录键盘位TK=K。
{
delays(); //去抖
if((IO0PIN&KEY) == 0)
TK=k;
}
if(k==7) //如果键盘扫描计数器K=7,则清除K,否则K+1。
k=0;
else
k++; //下一个位码的标号 selectable[k]
}
} // if1
else //else2
{
if (Adj_Flag==4) //到了调整的时间了 10ms 调整1次 (if11)
{ Adj_Flag=0;
//===============进行 第1级 的参数调整计算====(START)============================================
ADC_Data = sum_data / adc_count;
sum_data = 0;
adc_count = 0;
// StartADC(); //启动AD
// Uo_test = ADC_Data * Vref / 1024 *5; //换算到的输出电压
Uo_test = (((ADC_Data * Vref) * 82) / 1024)/15; // 1/10 的取样比 ,换算到的输出电压
if (Uo_test > Uo_def)
{
dUo = Uo_test - Uo_def;
S_Flag = 0; //误差为-,要减占空比
}
else
{ dUo = Uo_def - Uo_test ;
S_Flag = 1; //误差为+
}
// dDuty = (dUo / Uin) * 10000; // 不能这样写,因为前面除了以后是小于1的,系统取整后为0,要先做乘法
dDuty = ((dUo * 10000)/ Uin) ; //万分之几的
//————————————————————————————————————————————————————————
if (S_Flag == 0) //为0,减少D
{
// PWMMR3 = (((Uo_def / Uin)*10000 - dDuty) / 10000) * PWMMR0 ;
// PWMMR3 = (((((Uo_def*10000) / Uin) - dDuty) * PWMMR0) / 10000) ;
// Duty = Duty - dDuty ;
if ((Duty - dDuty) < 0) //限制下限
{
Duty = 0;
}
else
{
Duty = Duty - dDuty ;
}
PWMMR3 = (Duty * PWMMR0) / 10000;
// PWMLER = 0x03; // PWM1匹配锁存,写入新值,改变占空比
// PWMLER = 0x09; // PWM3匹配锁存,写入新值,改变占空比
}
else //为0,增加D
{
// PWMMR3 = (((Uo_def / Uin)*10000 + dDuty) / 10000) * PWMMR0 ;
// PWMLER = 0x03; // PWM1匹配锁存,写入新值,改变占空比
// Duty = (((((Uo_def*10000) / Uin) + dDuty) * PWMMR0) / 10000) ;
Duty = Duty + dDuty ;
if (Duty > 10000) //限制下限
{
Duty = 9999;
}
PWMMR3 = (Duty * PWMMR0) / 10000; ;
// PWMLER = 0x09; // PWM3匹配锁存,写入新值,改变占空比
}
//===============进行 第1级 的参数调整计算==(END)==============================================
//===============进行 第2级 的参数调整计算===(START)=============================================
ADC2_Data = sum2_data / adc2_count;
sum2_data = 0;
adc2_count = 0;
// StartADC(); //启动AD
// Uo_test = ADC_Data * Vref / 1024 *5; //换算到的输出电压
Uo2_test = (((ADC2_Data * Vref) * 16) / 1024)/5; // 1/2 的取样比 ,换算到的输出电压
if (Uo2_test > Uo2_def)
{
dUo2 = Uo2_test - Uo2_def;
S_Flag2 = 0; //误差为-,要减占空比
}
else
{ dUo2 = Uo2_def - Uo2_test ;
S_Flag2 = 1; //误差为+
}
// dDuty = (dUo / Uin) * 10000; // 不能这样写,因为前面除了以后是小于1的,系统取整后为0,要先做乘法
dDuty2 = (dUo2 * 10000 * 10) /(((3300 * 10) * 16)/5) ; //万分之几的
//————————————————————————————————————————————————————————
if (S_Flag2 == 0) //为0,减少D
{
// PWMMR3 = (((Uo_def / Uin)*10000 - dDuty) / 10000) * PWMMR0 ;
// PWMMR3 = (((((Uo_def*10000) / Uin) - dDuty) * PWMMR0) / 10000) ;
// Duty = Duty - dDuty ;
if ((Duty2 - dDuty2) < 10) //限制下限
{
Duty2 = 10;
}
else
{
Duty2 = Duty2 - dDuty2 ;
}
PWMMR1 = (Duty2 * PWMMR0) / 10000;
// PWMLER = 0x03; // PWM1匹配锁存,写入新值,改变占空比
// PWMLER = 0x09; // PWM3匹配锁存,写入新值,改变占空比
}
else //为0,增加D
{
// PWMMR3 = (((Uo_def / Uin)*10000 + dDuty) / 10000) * PWMMR0 ;
// PWMLER = 0x03; // PWM1匹配锁存,写入新值,改变占空比
// Duty = (((((Uo_def*10000) / Uin) + dDuty) * PWMMR0) / 10000) ;
Duty2 = Duty2 + dDuty2 ;
if (Duty2 > 9101) //限制上限
{
Duty2 = 9100; //最大输出6V 90.9%
}
PWMMR1 = (Duty2 * PWMMR0) / 10000; ;
// PWMLER = 0x09; // PWM3匹配锁存,写入新值,改变占空比
}
//===============进行 第2级 的参数调整计算==(END)==============================================
PWMLER = 0x0B; // PWM3, 1 匹配锁存,写入新值,改变占空比
}//
else //(else11)
{
StartADC(); //启动AD 第1级
adc_count++;
sum_data = sum_data + ADC_Data;
StartADC2(); //启动AD 第2级
adc2_count++;
sum2_data = sum2_data + ADC2_Data;
AD2SHOW = ADC2_Data; //ad 值送显
}
} //else2
}//jieshu
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -