中兴24004.3版电源用STM8单片机改装输出可调0-60V,0-50A
最近搞逆变,没有合适的电池供电。又没有大功率电源,关键是米不多,买不起大电源。。。所以就萌生了改装个通讯电源可调输出的想法。后来多次搜索终于确定了中兴2400的电源,把别人测绘的原理图看了看。这个电源用料真足。保护电路很完善,二手的一两百一台。后来看到很多改装方案,基本都是加电位器调节电压电流反馈基准电压形式。但是总感觉这个不是很靠谱,在想能不能用单片机直接控制不是更安全准确么。。那么废话不多说先上图
全部回复(76)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
PCB板子,一个主板。另外那个凸起是风扇控制板,上面用的是双NMOS IC,控制风扇
花了几个小时才焊接完毕,用了0603封装,眼神不好焊起来有点困难。。。然后用个18V电源通电,显示默认值。
这个是降压模块3R33。输出5V,输入可以到7-23V,不过看你装的贴片滤波电容耐压而定。
这是拆掉的2400控制板,原理图网上可以找到。如果谁需要可以留下邮箱。
焊接线,一共8根。出去电源,就是电压AD,DA:电流AD,DA;风扇温度和控制。
NTC 10K热敏电阻,负温度系数,根据查表得到电阻值,然后计算电压
这是装到2400前面板下面,尺寸正好放进去!
初步调试,电压校准好还是比较准的。电流校准后大约有20mA误差。
本来拍了个调试视频,发不上来。。。只能看图了。昨晚上焊的时候,没拍几张照片,凑合看吧
0
回复
提示
@syf7150
[图片][图片]PCB板子,一个主板。另外那个凸起是风扇控制板,上面用的是双NMOSIC,控制风扇[图片][图片]花了几个小时才焊接完毕,用了0603封装,眼神不好焊起来有点困难。。。然后用个18V电源通电,显示默认值。[图片]这个是降压模块3R33。输出5V,输入可以到7-23V,不过看你装的贴片滤波电容耐压而定。[图片][图片][图片]这是拆掉的2400控制板,原理图网上可以找到。如果谁需要可以留下邮箱。[图片]焊接线,一共8根。出去电源,就是电压AD,DA:电流AD,DA;风扇温度和控制。[图片]NTC10K热敏电阻,负温度系数,根据查表得到电阻值,然后计算电压[图片]这是装到2400前面板下面,尺寸正好放进去![图片]初步调试,电压校准好还是比较准的。电流校准后大约有20mA误差。本来拍了个调试视频,发不上来。。。只能看图了。昨晚上焊的时候,没拍几张照片,凑合看吧
我用的是中兴2400 4.3版改装的,输出0-60V,0-50可调。STM8单片机,主要是电压采样,PWM电压输出控制,电流采样,PWM电流输出控制。温度采样,温度输出用NMOS输出控制。输出能保存9组自定义存储电压电流值,可以直接调用输出。同时能随意调节输出电压电流。用编码开关,AD采样600个点,每个点对应0.1V电压。可以精确控制输出电压值,经过校准后精确度在0.1,并且可调。输出限流500AD值对应0.1A输出,也能精确限流。本程序参考了别人源代码,如果有兴趣的朋友可以一起讨论下这个程序。因为写的太完美了。。人性化。。所以拿来和大家一起分享下
0
回复
提示
@syf7150
[图片][图片]PCB板子,一个主板。另外那个凸起是风扇控制板,上面用的是双NMOSIC,控制风扇[图片][图片]花了几个小时才焊接完毕,用了0603封装,眼神不好焊起来有点困难。。。然后用个18V电源通电,显示默认值。[图片]这个是降压模块3R33。输出5V,输入可以到7-23V,不过看你装的贴片滤波电容耐压而定。[图片][图片][图片]这是拆掉的2400控制板,原理图网上可以找到。如果谁需要可以留下邮箱。[图片]焊接线,一共8根。出去电源,就是电压AD,DA:电流AD,DA;风扇温度和控制。[图片]NTC10K热敏电阻,负温度系数,根据查表得到电阻值,然后计算电压[图片]这是装到2400前面板下面,尺寸正好放进去![图片]初步调试,电压校准好还是比较准的。电流校准后大约有20mA误差。本来拍了个调试视频,发不上来。。。只能看图了。昨晚上焊的时候,没拍几张照片,凑合看吧
能分享一下软硬件吗?
0
回复
提示
#include "iostm8s103f3.h"
#include "F:\学习笔记\单片机\stm8\my.h"
/*
【选项字节设置】
需要激活:AFR0
*/
/*
【74HC595与数码管连接的脚位定义】
第1级74HC595的Q0对应0x0001<<0
第1级74HC595的Q7对应0x0001<<7
第2级74HC595的Q0对应0x0001<<8
第2级74HC595的Q7对应0x0001<<15 以此类推
*/
/*
【EEPROM空间分配情况】
0-7 开机默认电压电流 8字节
8-79 9组存储电压电流 72字节
80-119 工厂模式的显式参数 40字节
120-151 工厂模式的隐式参数 32字节
*/
#define _Dpy_wei_0 (0x0001<<9)
#define _Dpy_wei_1 (0x0001<<12)
#define _Dpy_wei_2 (0x0001<<13)
#define _Dpy_wei_3 (0x0001<<3)
#define _Dpy_wei_4 (0x0001<<0)
#define _Dpy_wei_5 (0x0001<<2)
#define _Dpy_wei_6 (0x0001<<1)
#define _Dpy_duan_A (0x0001<<10)
#define _Dpy_duan_B (0x0001<<11)
#define _Dpy_duan_C (0x0001<<4)
#define _Dpy_duan_D (0x0001<<6)
#define _Dpy_duan_E (0x0001<<7)
#define _Dpy_duan_F (0x0001<<8)
#define _Dpy_duan_G (0x0001<<14)
#define _Dpy_duan_DP (0x0001<<5)
/*
单个数码管数字的字段数据,多种字段可用逻辑与运算结合显示(示例:Dpy_duan_0 & Dpy_duan_dp 就是显示“0.”)
*/
#define Dpy_duan_0 (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F ))
#define Dpy_duan_1 (~( _Dpy_duan_B|_Dpy_duan_C ))
#define Dpy_duan_2 (~(_Dpy_duan_A|_Dpy_duan_B |_Dpy_duan_D|_Dpy_duan_E |_Dpy_duan_G ))
#define Dpy_duan_3 (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D |_Dpy_duan_G ))
#define Dpy_duan_4 (~( _Dpy_duan_B|_Dpy_duan_C |_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_5 (~(_Dpy_duan_A |_Dpy_duan_C|_Dpy_duan_D |_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_6 (~(_Dpy_duan_A |_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_7 (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C ))
#define Dpy_duan_8 (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_9 (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D |_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_all (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G|_Dpy_duan_DP))
#define Dpy_duan_null (~(0x0000 ))
#define Dpy_duan_negative (~( _Dpy_duan_G ))
#define Dpy_duan_dp (~( _Dpy_duan_DP))
#define Dpy_duan_o (~( _Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E |_Dpy_duan_G ))
#define Dpy_duan_f (~(_Dpy_duan_A |_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_s Dpy_duan_5
#define Dpy_duan_e (~(_Dpy_duan_A |_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_t (~( _Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_v (~( _Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E ))
#define Dpy_duan_r (~( _Dpy_duan_E |_Dpy_duan_G ))
#define Dpy_duan_a (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C |_Dpy_duan_E|_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_c (~(_Dpy_duan_A |_Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F ))
#define Dpy_duan_n (~( _Dpy_duan_C |_Dpy_duan_E |_Dpy_duan_G ))
#define Dpy_duan_l (~( _Dpy_duan_D|_Dpy_duan_E|_Dpy_duan_F ))
#define Dpy_duan_y (~( _Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D |_Dpy_duan_F|_Dpy_duan_G ))
#define Dpy_duan_d (~( _Dpy_duan_B|_Dpy_duan_C|_Dpy_duan_D|_Dpy_duan_E |_Dpy_duan_G ))
#define Dpy_duan_m (~(_Dpy_duan_A|_Dpy_duan_B|_Dpy_duan_C |_Dpy_duan_E|_Dpy_duan_F ))
/*
数码管的字位选通数据,Dpy_wei_0 是最左边的数码管,Dpy_wei_6 是最右边的数码管(示例:Dpy_wei_2 & Dpy_duan_0 & Dpy_duan_dp 就是在最左边第3个数码管显示“0.”)
*/
#define Dpy_wei_0 (_Dpy_wei_0|(~Dpy_duan_all))
#define Dpy_wei_1 (_Dpy_wei_1|(~Dpy_duan_all))
#define Dpy_wei_2 (_Dpy_wei_2|(~Dpy_duan_all))
#define Dpy_wei_3 (_Dpy_wei_3|(~Dpy_duan_all))
#define Dpy_wei_4 (_Dpy_wei_4|(~Dpy_duan_all))
#define Dpy_wei_5 (_Dpy_wei_5|(~Dpy_duan_all))
#define Dpy_wei_6 (_Dpy_wei_6|(~Dpy_duan_all))
const u2 duanma[]={
Dpy_duan_0
,Dpy_duan_1
,Dpy_duan_2
,Dpy_duan_3
,Dpy_duan_4
,Dpy_duan_5
,Dpy_duan_6
,Dpy_duan_7
,Dpy_duan_8
,Dpy_duan_9
,Dpy_duan_negative//横杠
};
const u2 str_0[]={
19//这是字符串本组字符串的长度
,Dpy_duan_f
,Dpy_duan_a
,Dpy_duan_c
,Dpy_duan_t
,Dpy_duan_o
,Dpy_duan_r
,Dpy_duan_y
,Dpy_duan_null
,Dpy_duan_m & Dpy_duan_dp//两个数码管合并显示成“M”
,Dpy_duan_m //两个数码管合并显示成“M”
,Dpy_duan_o
,Dpy_duan_d
,Dpy_duan_e
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
};
const u2 str_1[]={
17//这是字符串本组字符串的长度
,Dpy_duan_s
,Dpy_duan_e
,Dpy_duan_t
,Dpy_duan_null
,Dpy_duan_0 & Dpy_duan_dp
,Dpy_duan_5
,Dpy_duan_v
,Dpy_duan_null
,Dpy_duan_r
,Dpy_duan_e
,Dpy_duan_f
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
};
const u2 str_2[]={
19//这是字符串本组字符串的长度
,Dpy_duan_s
,Dpy_duan_e
,Dpy_duan_t
,Dpy_duan_null
,Dpy_duan_9
,Dpy_duan_negative
,Dpy_duan_6
,Dpy_duan_0
,Dpy_duan_v
,Dpy_duan_null
,Dpy_duan_r
,Dpy_duan_e
,Dpy_duan_f
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
};
const u2 str_3[]={
17//这是字符串本组字符串的长度
,Dpy_duan_s
,Dpy_duan_e
,Dpy_duan_t
,Dpy_duan_null
,Dpy_duan_0 & Dpy_duan_dp
,Dpy_duan_5
,Dpy_duan_a
,Dpy_duan_null
,Dpy_duan_r
,Dpy_duan_e
,Dpy_duan_f
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
};
const u2 str_4[]={
19//这是字符串本组字符串的长度
,Dpy_duan_s
,Dpy_duan_e
,Dpy_duan_t
,Dpy_duan_null
,Dpy_duan_9
,Dpy_duan_negative
,Dpy_duan_4
,Dpy_duan_0
,Dpy_duan_a
,Dpy_duan_null
,Dpy_duan_r
,Dpy_duan_e
,Dpy_duan_f
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
,Dpy_duan_null
};
const u2 str_5[]={
6//这是字符串本组字符串的长度
,Dpy_duan_s
,Dpy_duan_a
,Dpy_duan_v
,Dpy_duan_e
,Dpy_duan_null
,Dpy_duan_null
};
const u2 str_6[]={
6//这是字符串本组字符串的长度
,Dpy_duan_c
,Dpy_duan_a
,Dpy_duan_n
,Dpy_duan_s
,Dpy_duan_e
,Dpy_duan_l
};
const u2 *str_list[]={
str_1
,str_2
,str_3
,str_4
,str_5
,str_6
};
u2 showing_data[7]={0};
u2 HC595_data;
u2 HC595_data_mask[]={0xFFFF,0xFFFF};
v hc595_update(){
PD4O=0;
if(HIGH(HC595_data)&0x80)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(HIGH(HC595_data)&0x40)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(HIGH(HC595_data)&0x20)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(HIGH(HC595_data)&0x10)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(HIGH(HC595_data)&0x08)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(HIGH(HC595_data)&0x04)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(HIGH(HC595_data)&0x02)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(HIGH(HC595_data)&0x01)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(LOW(HC595_data)&0x80)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(LOW(HC595_data)&0x40)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(LOW(HC595_data)&0x20)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(LOW(HC595_data)&0x10)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(LOW(HC595_data)&0x08)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(LOW(HC595_data)&0x04)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(LOW(HC595_data)&0x02)PD4O=1;
PA2O=0;
PA2O=1;
PD4O=0;
if(LOW(HC595_data)&0x01)PD4O=1;
PA2O=0;
PA2O=1;
PA1O=1;
PA1O=0;
}
u1 smg_scan=0;
u1 smg_scan2=0;
u1 bmq_status1=1;
u1 bmq_status2=1;
u1 bmq_turning=0;
u1 bmq_frist_down;
u1 bmq_last_up;
u1 bmq_idel_time=0xFF;
u2 bmq_last_time=0x8000;
u2 bmq_last2_time=0x8000;
/*
#define coefficient_V_show 62700//数值越小,显示越高
#define offset_V_show 1693//数值越小,显示越高
#define coefficient_I_show 57957//数值越小,显示越高
#define offset_I_show 2471//数值越小,显示越高
#define coefficient_V_set 9880//数值越大,设定越高
#define coefficient_I_set 8270//数值越大,设定越高
//*/
//工厂模式的参数
s2 PWM_V_bias;
u2 PWM_V_coefficient;
s2 PWM_I_bias;
u2 PWM_I_coefficient;
s2 ADC_V_bias;
u2 ADC_V_coefficient;
s2 ADC_I_bias;
u2 ADC_I_coefficient;
u1 UI_time_out;
u1 btn_status=1;
u1 btn_down_time=0;
u1 btn_event=0;//按钮事件,0x01=编码器正转,0xFF=编码器反转,02=按钮短按,03=按钮长按
u2 PWM=0;
u1 output_PWM_update=0;//此变量置1即可更新输出PWM,自动清零
u1 is_output_ON=0;
u2 _setV=0;//TIM4线程专用
u2 _setI=0;//TIM4线程专用
u2 setV=0;//main线程专用,最终由TIM4实行
u2 setI=0;//main线程专用,最终由TIM4实行
u2 nowV_16bit_ADC_result=0;
u2 nowV=0;//比例:537=53.7V
u2 nowI_16bit_ADC_result=0;
u2 nowI=0;//比例:125=12.5A
u2 output_I_limit=500;
s2 seting_data[11];
u1 *eep_addr;
u2 _adc_buf[4];
u2 adc_buf=0;
u1 adc_now_ch=0;//0是主温度,1是电压,2是电流,3是整流温度
u1 adc_step=0;
u1 adc_count;
u1 is_fan_need_to_speed_up=0;
u1 factory_mode_setV_or_setI;//工厂模式专用变量,0=设置电压(对应菜单项1和2),5=设置电流(对应菜单项3和4)。FLASH空间不足了,逼我做成代码复用....
u1 flashing_style[2]={2,2};//flashing_style[1]常年=2,flashing_style[0]=0是灭<->亮循环,=1是半亮<->全亮循环
u1 tim4_timer1=250;
u1 user_timer1=0;//此处放入非0值即可每25mS自动递减一次
u1 tim4_timer2=0;//此处放入非0值即可每25mS自动递减一次(TIM4专用)
u1 tim4_timer3=0;//此处放入非0值即可每25mS自动递减一次(TIM4专用)
u1 main_x;//此变量为临时多用变量,只能在main线程内使用,不允许跨函数使用
u2 main_u2x;//此变量为临时多用变量,只能在main线程内使用,不允许跨函数使用
v set_V_PWM(){//用main_u2x全局变量做传入参数
TIM1_CCR3H = 0;
TIM1_CCR3L = PWM%100;
TIM1_CCR4H = 0;
TIM1_CCR4L = PWM/100%100;
}
#pragma optimize=low
v setV_update(){
PWM=0;
if(is_output_ON && _setV){
PWM=(u4)_setV*PWM_V_coefficient/(600);
PWM+=(PWM_V_bias);
if((s2)PWM<0){
PWM=0;
}
}
set_V_PWM();
}
v set_I_PWM(){//用main_u2x全局变量做传入参数
TIM1_CCR1H = 0;
TIM1_CCR1L = PWM%100;
TIM1_CCR2H = 0;
TIM1_CCR2L = PWM/100%100;
}
#pragma optimize=low
v setI_update(){
PWM=0;
if(_setI){
PWM=(u4)_setI*PWM_I_coefficient/(600);
PWM+=(PWM_I_bias);
if((s2)PWM<0){
PWM=0;
}
}
set_I_PWM();
}
#pragma vector=TIM4_OVR_UIF_vector
__interrupt v TIM4_Init(){
{//数码管管理
hc595_update();
smg_scan2=!smg_scan2;
HC595_data=showing_data[smg_scan] & HC595_data_mask[smg_scan2];
smg_scan++;
if(smg_scan>=7)smg_scan=0;
}
{//编码器管理
if(bmq_idel_time!=0xFF)bmq_idel_time++;
if(bmq_idel_time==6){
//完成了一次转动
bmq_turning=0;
btn_event=bmq_last_up-bmq_frist_down;
bmq_last2_time=bmq_last_time;
bmq_last_time=0;
}
if((HIGH(bmq_last_time)&0x80)==0)bmq_last_time++;
}
{//按键去抖动
if(PA3I){//没按
if(btn_status){
if(btn_status<10)btn_status=1;
btn_status--;
}
}else{//正在按
if(btn_status!=0xFF){
if(btn_status>=10)btn_status=0xFE;
btn_status++;
}
}
}
{//通用定时器
if(--tim4_timer1==0){
//每25mS进入一次
if(user_timer1)user_timer1--;
if(tim4_timer2)tim4_timer2--;
if(tim4_timer3)tim4_timer3--;
tim4_timer1=250;
{//按键判断
if(btn_status>=10){//正在按
if(btn_down_time!=0xFF)btn_down_time++;
if(btn_down_time==20){//发现是长按
btn_event=0x03;
}
}else{//没按
if(btn_down_time){
if(btn_down_time<20){//是短按
btn_event=0x02;
}
btn_down_time=0;
}
}
}
}
}
{//ADC
switch(adc_step){
case 0://要切换通道
switch(adc_now_ch){
case 0:
//之前是主温度ADC
//adc_buf数值 17316=4.1V,2111=0.5V
if(adc_buf>=17316 || adc_buf<2111){
is_fan_need_to_speed_up|=1;
}
adc_now_ch=1;//切换到电压ADC
ADC_CSR=0x06;//选定ch6
break;
case 1:
//之前是电压ADC
nowV_16bit_ADC_result=adc_buf;
if(adc_buf>=ADC_V_bias){
nowV=(((u4)(adc_buf-ADC_V_bias))*600)/ADC_V_coefficient;
}else{
nowV=1+~((((u4)(ADC_V_bias-adc_buf))*600)/ADC_V_coefficient);
}
adc_now_ch=2;//切换到电流ADC
ADC_CSR=0x05;//选定ch5
break;
case 2:
//之前是电流ADC
nowI_16bit_ADC_result=adc_buf;
if(adc_buf>=ADC_I_bias){
nowI=(((u4)adc_buf-ADC_I_bias)*600)/ADC_I_coefficient;
}else{
nowI=1+~(((ADC_I_bias-(u4)adc_buf)*600)/ADC_I_coefficient);
}
adc_now_ch=3;//切换到整流温度ADC
ADC_CSR=0x03;//选定ch3
break;
default:
//之前是整流温度ADC
if(adc_buf>63000){//整流测温二极管开路
if(nowI>50 && nowI>nowV && nowV<400){
is_fan_need_to_speed_up|=1;
if(tim4_timer2==0){
output_I_limit=400;//限流40A
tim4_timer3=200;
}
}else{
if(tim4_timer3==0){
output_I_limit=500;//限流50A
tim4_timer2=200;
}
}
}else{//整流测温二极管正常
//精度为5度左右
//8400=75度
//9718=70度
//11244=65度
//13004=60度
//15019=55度
//17309=50度
if(adc_buf<17309){//大于50度加强风扇
is_fan_need_to_speed_up|=1;
}else{//小于50度
if(tim4_timer2==0){
output_I_limit=500;//限流50A
tim4_timer2=200;
}
}
if(tim4_timer2==0){
if(adc_buf<8400){//大于75度
if(output_I_limit!=0){
output_I_limit=0;//禁止输出
tim4_timer2=200;
}
}else if(adc_buf<9718){//大于70度
if(output_I_limit!=100){
output_I_limit=100;//限流10A
tim4_timer2=200;
}
}else if(adc_buf<11244){//大于65度
if(output_I_limit!=200){
output_I_limit=200;//限流20A
tim4_timer2=200;
}
}else if(adc_buf<13004){//大于60度
if(output_I_limit!=300){
output_I_limit=300;//限流30A
tim4_timer2=200;
}
}else if(adc_buf<15019){//大于55度
if(output_I_limit!=400){
output_I_limit=400;//限流40A
tim4_timer2=200;
}
}
}
}
if(is_fan_need_to_speed_up){
if(TIM2_CCR1H!=0xFF)TIM2_CCR1H++;
TIM2_CCR1L=0xFF;
}else{
if(TIM2_CCR1H)TIM2_CCR1H--;
TIM2_CCR1L=0;
}
is_fan_need_to_speed_up=0;
adc_now_ch=0;//切换到主温度ADC
ADC_CSR=0x04;//选定ch4
break;
}
adc_step=1;
break;
case 1://预启动ADC
ADC_CR1_ADON=1;//启动ADC
_adc_buf[0]=
_adc_buf[1]=
_adc_buf[2]=
_adc_buf[3]=0;
adc_count=64;
adc_step=2;
_setV=setV;
if(output_I_limit=6){
adc_buf=((u4)_adc_buf[0]+(u4)_adc_buf[1]+(u4)_adc_buf[2]+(u4)_adc_buf[3])/4;
adc_step=0;
}
}
break;
}
}
TIM4_SR_UIF=0;//取消本次中断请求
}
v set_brightness(u1 brightness,u2 mask){
if(brightness<=1){
HC595_data_mask[1]=~mask;
}else{
HC595_data_mask[0]=
HC595_data_mask[1]=0xFFFF;
return;
}
if(brightness==0){
HC595_data_mask[0]=HC595_data_mask[1];
return;
}
HC595_data_mask[0]=0xFFFF;
}
#pragma optimize=low
s2 calculation_factory_bias(u2 a,u2 b,u2 c){
return
a
-
(s2)(
(u4)(c-a)//差值
*
5//下余缝
/
(b-5)//电压差
);
}
#pragma optimize=low
u2 calculation_factory_coefficient(u2 a,u2 b,u2 c){
return
(c-a)//差值
+
(u2)(
(u4)(c-a)//差值
*
(600-b+5)//上下余缝
/
(b-5)//电压差
);
}
#pragma optimize=low
v calculation_factory_parameters(){
PWM_V_bias=calculation_factory_bias(
seting_data[1]
,seting_data[3]
,seting_data[4]
);
PWM_V_coefficient=calculation_factory_coefficient(
seting_data[1]
,seting_data[3]
,seting_data[4]
);
//PWM_V_coefficient+=(PWM_V_coefficient/2400);//微调补偿
PWM_V_bias+=(PWM_V_coefficient/2400);//微调补偿
ADC_V_bias=calculation_factory_bias(
seting_data[2]
,seting_data[3]
,seting_data[5]
);
ADC_V_coefficient=calculation_factory_coefficient(
seting_data[2]
,seting_data[3]
,seting_data[5]
);
//ADC_V_coefficient-=(ADC_V_coefficient/2400);//微调补偿
ADC_V_bias-=(ADC_V_coefficient/2400);//微调补偿
PWM_I_bias=calculation_factory_bias(
seting_data[1+5]
,seting_data[3+5]
,seting_data[4+5]
);
PWM_I_coefficient=calculation_factory_coefficient(
seting_data[1+5]
,seting_data[3+5]
,seting_data[4+5]
);
//PWM_I_coefficient+=(PWM_I_coefficient/2400);//微调补偿
PWM_I_bias+=(PWM_I_coefficient/2400);//微调补偿
ADC_I_bias=calculation_factory_bias(
seting_data[2+5]
,seting_data[3+5]
,seting_data[5+5]
);
ADC_I_coefficient=calculation_factory_coefficient(
seting_data[2+5]
,seting_data[3+5]
,seting_data[5+5]
);
//ADC_I_coefficient-=(ADC_I_coefficient/2400);//微调补偿
ADC_I_bias-=(ADC_I_coefficient/2400);//微调补偿
}
u1 mod(){//求模运算,用main_u2x传参
u1 result;
result=main_u2x%10;
main_u2x/=10;
return result;
}
u1 show_str(const u2 *str,u1 t3){//str是字符串指针,t3是字符串的当前要显示的字符位置
main_x=str[0];//main_x = 字符串长度
if(main_x>6){
showing_data[1]=showing_data[2] & (~_Dpy_wei_2) | _Dpy_wei_1;
showing_data[2]=showing_data[3] & (~_Dpy_wei_3) | _Dpy_wei_2;
showing_data[3]=showing_data[4] & (~_Dpy_wei_4) | _Dpy_wei_3;
showing_data[4]=showing_data[5] & (~_Dpy_wei_5) | _Dpy_wei_4;
showing_data[5]=showing_data[6] & (~_Dpy_wei_6) | _Dpy_wei_5;
showing_data[6]=Dpy_wei_6 & str[t3+1];
t3++;
if(t3>=main_x)t3=0;
}else{
showing_data[1]=Dpy_wei_1 & str[1];
showing_data[2]=Dpy_wei_2 & str[2];
showing_data[3]=Dpy_wei_3 & str[3];
showing_data[4]=Dpy_wei_4 & str[4];
showing_data[5]=Dpy_wei_5 & str[5];
showing_data[6]=Dpy_wei_6 & str[6];
t3=0;
}
return t3;
}
u1 UI_timeout_timer(){
return ++UI_time_out>=20;
}
u1 flashing_FSM=1;//数码管闪烁专用状态机,0=暗,1=亮
v FSM_Reverse(){
flashing_FSM=!flashing_FSM;
}
v display_left_1_digital(){//用main_u2x传参要显示的数值,用main_x传参亮度
showing_data[0]=Dpy_wei_0 & duanma[(u1)main_u2x];
set_brightness(main_x,_Dpy_wei_0);
}
v display_left_3_digital(){//用main_u2x传参要显示的数值,用main_x传参亮度
if(main_u2x & 0x8000){//是负数
main_u2x=(~main_u2x)+1;
showing_data[1]=Dpy_wei_1 & Dpy_duan_negative;
}else{
showing_data[1]=Dpy_wei_1 & Dpy_duan_null;
}
showing_data[3]=Dpy_wei_3 & duanma[mod()];
showing_data[2]=Dpy_wei_2 & duanma[mod()] & Dpy_duan_dp;
if(LOW(main_u2x)=mod()){
showing_data[1]=Dpy_wei_1 & duanma[LOW(main_u2x)];
}
set_brightness(main_x,_Dpy_wei_1 | _Dpy_wei_2 | _Dpy_wei_3);
}
v display_right_3_digital(){//用main_u2x传参要显示的数值,用main_x传参亮度
if(main_u2x & 0x8000){//是负数
main_u2x=(~main_u2x)+1;
showing_data[4]=Dpy_wei_4 & Dpy_duan_negative;
}else{
showing_data[4]=Dpy_wei_4 & Dpy_duan_null;
}
showing_data[6]=Dpy_wei_6 & duanma[mod()];
showing_data[5]=Dpy_wei_5 & duanma[mod()] & Dpy_duan_dp;
if(LOW(main_u2x)=mod()){
showing_data[4]=Dpy_wei_4 & duanma[LOW(main_u2x)];
}
set_brightness(main_x,_Dpy_wei_4 | _Dpy_wei_5 | _Dpy_wei_6);
}
v (*fp_display_PWM_value)();
v display_PWM_value(){//用main_u2x传参要显示的数值,用main_x传参亮度
if(fp_display_PWM_value){
PWM=main_u2x;
fp_display_PWM_value();//用此函数设置PWM输出
}
showing_data[6]=Dpy_wei_6 & duanma[mod()];
showing_data[5]=Dpy_wei_5 & duanma[mod()];
showing_data[4]=Dpy_wei_4 & duanma[mod()];
showing_data[3]=Dpy_wei_3 & duanma[mod()];
set_brightness(main_x,_Dpy_wei_3 | _Dpy_wei_4 | _Dpy_wei_5 | _Dpy_wei_6);
}
v chkbmq(){//判断编码器状态
if(bmq_turning){
if(PB4I==0){
bmq_status1=0;
bmq_last_up=0;
bmq_idel_time=0;
}else if(PB5I==0){
bmq_status2=0;
bmq_last_up=1;
bmq_idel_time=0;
}
}else{
if(PB4I==0){
bmq_turning=1;
bmq_status1=0;
bmq_frist_down=0;
bmq_last_up=0;
bmq_idel_time=0;
}else if(PB5I==0){
bmq_turning=1;
bmq_status2=0;
bmq_frist_down=1;
bmq_last_up=1;
bmq_idel_time=0;
}
}
}
#pragma optimize=low
v bmq_wait_event(){
btn_event=0;
user_timer1=10;
do{
chkbmq();
if(btn_event)return;
}while(user_timer1);
}
s2 bmq_turn_mgr_seting_data;
u1 bmq_turn_mgr_speed_coefficient;
s2 bmq_turn_mgr_number_upper_limit;
s2 bmq_turn_mgr_number_lower_limit;
v (*fp_bmq_turn_mgr_display)();
#pragma optimize=low
v bmq_turn_mgr(){
if(fp_bmq_turn_mgr_display){
main_u2x=bmq_turn_mgr_seting_data;//传参给下面这个函数
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
fp_bmq_turn_mgr_display();
}
bmq_wait_event();
switch(btn_event){
case 0x01://编码器正转
if(bmq_last2_time>252){
main_x=252;
}else{
main_x=bmq_last2_time;
}
bmq_turn_mgr_seting_data+=((252-main_x)/bmq_turn_mgr_speed_coefficient)+1;
if(bmq_turn_mgr_seting_data>bmq_turn_mgr_number_upper_limit){
bmq_turn_mgr_seting_data=bmq_turn_mgr_number_upper_limit;
}
flashing_FSM=1;
UI_time_out=0;
return;
case 0xFF://编码器反转
if(bmq_last2_time>252){
main_x=252;
}else{
main_x=bmq_last2_time;
}
bmq_turn_mgr_seting_data-=((252-main_x)/bmq_turn_mgr_speed_coefficient)+1;
if(bmq_turn_mgr_seting_data全亮闪烁模式
bmq_turn_mgr_seting_data=factory_mode_seting_PWM_PWMdata;
bmq_turn_mgr_speed_coefficient=1;
bmq_turn_mgr_number_upper_limit=9999;
bmq_turn_mgr_number_lower_limit=0;
fp_bmq_turn_mgr_display=display_PWM_value;
if(factory_mode_setV_or_setI){//电流PWM
PWM=800;//输出5V左右
set_V_PWM();//用main_u2x做传入参数
fp_display_PWM_value=set_I_PWM;
}else{//电压PWM
PWM=5000;//输出25A左右
set_I_PWM();//用main_u2x做传入参数
fp_display_PWM_value=set_V_PWM;
}
while(1){
bmq_turn_mgr();
if(btn_event==0x02){
factory_mode_seting_PWM_PWMdata=bmq_turn_mgr_seting_data;
PWM=0;
set_I_PWM();//用main_u2x做传入参数
set_V_PWM();
return;
}
}
}
s2 eeprom_buf1;
s2 eeprom_buf2;
v eeprom_read_addrx8(){//用main_x传参确定地址
eep_addr=(u1 *)(EEPROM_ADDRESS+(8*main_x));
eeprom_buf1=*(s2 *)eep_addr;
if(eeprom_buf1 != ((*(s2 *)(eep_addr+2))^0xADB5)){
eeprom_buf1=0;
}
eeprom_buf2=*(s2 *)(eep_addr+4);
if(eeprom_buf2 != ((*(s2 *)(eep_addr+6))^0xADB5)){
eeprom_buf2=0;
}
}
v eeprom_write_unlock_addrx8(){//用main_x传参确定地址
FLASH_DUKR = 0xAE;//EEPROM解锁密码
FLASH_DUKR = 0x56;//EEPROM解锁密码
while(FLASH_IAPSR_DUL==0);//等待解密就绪
eep_addr=(u1 *)(EEPROM_ADDRESS+(8*main_x));
}
v eeprom_write(){
FLASH_CR2_WPRG=1;//启用字(4字节)写入模式
FLASH_NCR2_NWPRG=0;//启用字(4字节)写入模式
*eep_addr++=HIGH(eeprom_buf1);
*eep_addr++=LOW(eeprom_buf1);
*eep_addr++=HIGH(eeprom_buf1)^0xAD;
*eep_addr++=LOW(eeprom_buf1)^0xB5;
}
#define eeprom_write_lock() FLASH_IAPSR_DUL=0
u1 t1,t3;
#pragma optimize=low
v main(){
CLK_CKDIVR_HSIDIV=0;//主时钟不分频
{//初始化TIM1(用于PWM输出,控制电压电流)
TIM1_PSCRH = 0;//计数器不分频
TIM1_PSCRL = 0;//计数器不分频
//初始化自动装载寄存器,决定PWM的频率,PWM频率=计数器频率/100
TIM1_ARRH = 0;
TIM1_ARRL = (100-1);
{//ch1
TIM1_CCMR1_OC1M=7;//PWM模式2(比较输出方式)
TIM1_CCER1_CC1P=1;//PWM极性(1=正相输出,0=反相输出)
TIM1_CCER1_CC1E=1;//开启输出引脚
//初始化比较寄存器,决定PWM的占空比
TIM1_CCR1H = 0;
TIM1_CCR1L = 0;
}
{//ch2
TIM1_CCMR2_OC2M=7;//PWM模式2(比较输出方式)
TIM1_CCER1_CC2P=1;//PWM极性(1=正相输出,0=反相输出)
TIM1_CCER1_CC2E=1;//开启输出引脚
//初始化比较寄存器,决定PWM的占空比
TIM1_CCR2H = 0;
TIM1_CCR2L = 0;
}
{//ch3
TIM1_CCMR3_OC3M=7;//PWM模式2(比较输出方式)
TIM1_CCER2_CC3P=1;//PWM极性(1=正相输出,0=反相输出)
TIM1_CCER2_CC3E=1;//开启输出引脚
//初始化比较寄存器,决定PWM的占空比
TIM1_CCR3H = 0;
TIM1_CCR3L = 0;
}
{//ch4
TIM1_CCMR4_OC4M=7;//PWM模式2(比较输出方式)
TIM1_CCER2_CC4P=1;//PWM极性(1=正相输出,0=反相输出)
TIM1_CCER2_CC4E=1;//开启输出引脚
//初始化比较寄存器,决定PWM的占空比
TIM1_CCR4H = 0;
TIM1_CCR4L = 0;
}
TIM1_BKR_MOE=1;//TIM1主输出使能
TIM1_CR1_CEN=1;//启动计数
}
{//初始化TIM2(用于PWM输出,控制风扇速度)
TIM2_PSCR = 0;//计数器不分频
//初始化自动装载寄存器,决定PWM的频率,PWM频率=计数器频率/255
TIM2_ARRH = 0xFF;
TIM2_ARRL = 0xFF;
{//ch1
TIM2_CCMR1_OC1M=7;//PWM模式2(比较输出方式)
TIM2_CCER1_CC1P=1;//PWM极性(1=正相输出,0=反相输出)
TIM2_CCER1_CC1E=1;//开启输出引脚
//初始化比较寄存器,决定PWM的占空比
TIM2_CCR1H = 0;
TIM2_CCR1L = 0;
}
TIM2_CR1_CEN=1;//启动计数
}
//*
{//初始化TIM4(用于时间基准)
TIM4_PSCR_PSC = 3;//8分频
TIM4_CNTR = 0; // 计数器初值
TIM4_ARR = 200-1;// 自动装载(每秒溢出1万次)
TIM4_IER_UIE = 1;// 启用更新中断
TIM4_CR1_CEN = 1; // 启动计数
// ITC_VECT23SPR=0;//TIM4中断优先级2/3
}
//*/
{//初始化ADC
ADC_TDRL=HEXTOBIT(0x01111000);//ch3、ch4、ch5、ch6关闭施密特输入
ADC_CR1_SPSEL=4;//ADC时钟8分频
//ADC_CR1_CONT=1;//连续模式
ADC_CR2_ALIGN=1;//数据右对齐
//ADC_CR3_DBUF=1;//使用缓存模式
//ADC_CSR=0x04;//选定ch4
ADC_CR1_ADON=1;//打开ADC电源
//ADC_CR1_ADON=1;//启动ADC
}
{//初始化74HC595
PBinit(A,1,1,1,0);//SCLK
PBinit(A,2,1,1,0);//CLK
PBinit(D,4,1,1,1);//DATA
PA1O=1;
PA2O=1;
PD4O=1;
HC595_data=0;
hc595_update();
}
{//初始化编码器、按键
PBinit(B,4,0,0,0);//编码器1
PBinit(B,5,0,0,0);//编码器2
PBinit(A,3,0,1,0);//按键
}//*
{//初始化其他IO
PBinit(C,5,1,1,0);//风扇控制
PC5O=0;
}//*/
asm("rim");//开全局中断
//goto factory_mode;
{//一秒钟内全亮数码管
showing_data[0]=Dpy_wei_0 & Dpy_duan_all;
showing_data[1]=Dpy_wei_1 & Dpy_duan_all;
showing_data[2]=Dpy_wei_2 & Dpy_duan_all;
showing_data[3]=Dpy_wei_3 & Dpy_duan_all;
showing_data[4]=Dpy_wei_4 & Dpy_duan_all;
showing_data[5]=Dpy_wei_5 & Dpy_duan_all;
showing_data[6]=Dpy_wei_6 & Dpy_duan_all;
user_timer1=40;
do{
}while(user_timer1);
}
if(PA3I==0){//按住编码器再开机的,跳到工厂模式
t3=0;
showing_data[0]=0x0000;
showing_data[1]=Dpy_wei_1 & Dpy_duan_null;
showing_data[2]=Dpy_wei_2 & Dpy_duan_null;
showing_data[3]=Dpy_wei_3 & Dpy_duan_null;
showing_data[4]=Dpy_wei_4 & Dpy_duan_null;
showing_data[5]=Dpy_wei_5 & Dpy_duan_null;
showing_data[6]=Dpy_wei_6 & Dpy_duan_null;
while(1){
t3=show_str(str_0,t3);
user_timer1=10;
do{
if(btn_event==0)continue;
switch(btn_event){
case 0x02://短按
goto factory_mode;
case 0x03://长按
if(PA3I){
btn_event=0;
goto factory_mode;
}
break;
default:
btn_event=0;
}
}while(user_timer1);
}
}
start_up:
{//读取EEPROM工厂模式的参数
main_x=15;
eeprom_read_addrx8();
PWM_V_bias=eeprom_buf1;
PWM_V_coefficient=eeprom_buf2;
main_x=16;
eeprom_read_addrx8();
PWM_I_bias=eeprom_buf1;
PWM_I_coefficient=eeprom_buf2;
main_x=17;
eeprom_read_addrx8();
ADC_V_bias=eeprom_buf1;
ADC_V_coefficient=eeprom_buf2;
main_x=18;
eeprom_read_addrx8();
ADC_I_bias=eeprom_buf1;
ADC_I_coefficient=eeprom_buf2;
}
{//读取EEPROM默认电压电流
main_x=0;
eeprom_read_addrx8();
setV=eeprom_buf1;
setI=eeprom_buf2;
output_PWM_update=1;
}
//flashing_style[0]=0;//灭<->亮闪烁模式
flashing_FSM=1;
UI_time_out=0;
showing_data[0]=0x0000;
main_x=2;//传参给下面这个函数
main_u2x=setV;//传参给下面这个函数
display_left_3_digital();
main_u2x=setI;//传参给下面这个函数
display_right_3_digital();
while(1){//开机延迟5秒再输出电压
if(flashing_FSM){//亮
HC595_data_mask[0]=0xFFFF;
HC595_data_mask[1]=0xFFFF;
}else{//灭
HC595_data_mask[0]=0x0000;
HC595_data_mask[1]=0x0000;
}
bmq_wait_event();
if(btn_event){
if(btn_event==0x02){//按钮短按
}
goto main_UI;
}
FSM_Reverse();
if(UI_timeout_timer()){
//5秒无动作,启动输出,跳到主菜单
is_output_ON=1;
output_PWM_update=1;
goto main_UI;
}
}
main_UI:
flashing_FSM=0;//闪烁状态机
flashing_style[0]=0;//灭<->亮闪烁模式
UI_time_out=0;
t3=0;
while(1){//默认主界面
showing_data[0]=0x0000;
main_x=2;//传参给下面这个函数
main_u2x=nowV;//传参给下面这个函数
display_left_3_digital();
if(is_output_ON){
flashing_FSM=1;
if(_setI!=setI){//限流保护状态,电流闪烁指示
t3++;
if(!(t3&0x05)){
flashing_FSM=0;
}
}
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
main_u2x=nowI;//传参给下面这个函数
display_right_3_digital();
}else{
showing_data[4]=Dpy_wei_4&Dpy_duan_o;
showing_data[5]=Dpy_wei_5&Dpy_duan_f;
showing_data[6]=Dpy_wei_6&Dpy_duan_f;
}
//HC595_data_mask[0]=0xFFFF;
//HC595_data_mask[1]=0xFFFF;
btn_event=0;
user_timer1=6;
do{
chkbmq();
if(btn_event==0)continue;
switch(btn_event){
case 0x01://编码器正转
goto set_I;
case 0x02://按钮短按 = 开启输出/关闭输出
is_output_ON=!is_output_ON;//打开输出/关闭输出
output_PWM_update=1;
goto main_UI;
case 0xFF://编码器反转
goto set_V;
case 0x03://按钮长按
goto seting_storage_write;
//default:
}
}while(user_timer1);
}
continuous_adjustment_mode_V:
showing_data[0]=0x0000;
is_output_ON=1;
UI_time_out=0;
t3=0;
flashing_FSM=1;//闪烁状态机
flashing_style[0]=1;//半亮<->全亮闪烁模式
bmq_turn_mgr_seting_data=setV;
bmq_turn_mgr_speed_coefficient=12;
bmq_turn_mgr_number_upper_limit=600;
bmq_turn_mgr_number_lower_limit=0;
while(1){
setV=bmq_turn_mgr_seting_data;
output_PWM_update=1;
main_x=2;
main_u2x=nowI;//传参给下面这个函数
display_right_3_digital();
fp_bmq_turn_mgr_display=display_left_3_digital;
if(++UI_time_out>=8){
UI_time_out=8;
fp_bmq_turn_mgr_display=NULL;
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
main_u2x=nowV;//传参给下面这个函数
display_left_3_digital();
}
bmq_turn_mgr();
switch(btn_event){
case 0x02://短按
main_x=0;
eeprom_write_unlock_addrx8();
eeprom_buf1=setV;
eeprom_write();
eeprom_write_lock();
goto main_UI;
}
}
continuous_adjustment_mode_I:
showing_data[0]=0x0000;
is_output_ON=1;
UI_time_out=0;
t3=0;
flashing_FSM=1;//闪烁状态机
flashing_style[0]=1;//半亮<->全亮闪烁模式
bmq_turn_mgr_seting_data=setI;
bmq_turn_mgr_speed_coefficient=12;
bmq_turn_mgr_number_upper_limit=500;
bmq_turn_mgr_number_lower_limit=0;
while(1){
setI=bmq_turn_mgr_seting_data;
output_PWM_update=1;
main_x=2;
main_u2x=nowV;//传参给下面这个函数
display_left_3_digital();
fp_bmq_turn_mgr_display=display_right_3_digital;
if(++UI_time_out>=8){
UI_time_out=8;
fp_bmq_turn_mgr_display=NULL;
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
main_u2x=nowI;//传参给下面这个函数
display_right_3_digital();
}
bmq_turn_mgr();
switch(btn_event){
case 0x02://短按
main_x=0;
eeprom_write_unlock_addrx8();
eep_addr+=4;
eeprom_buf1=setI;
eeprom_write();
eeprom_write_lock();
goto main_UI;
}
}
set_storage://选中存取位
main_x=2;//传参给下面这个函数
main_u2x=setV;//传参给下面这个函数
display_left_3_digital();
main_u2x=setI;//传参给下面这个函数
display_right_3_digital();
//showV(setV,0);
//showI(setI,0);
flashing_FSM=0;//闪烁状态机
flashing_style[0]=0;//灭<->亮闪烁模式
UI_time_out=0;
while(1){
main_u2x=10;
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
display_left_1_digital();
bmq_wait_event();
switch(btn_event){
case 0x01://编码器正转
goto set_V;
case 0xFF://编码器反转
goto set_I;
case 0x02://短按
goto seting_storage_read;
}
FSM_Reverse();
if(UI_timeout_timer()){
//5秒无动作
goto main_UI;
}
}
seting_storage_read:
showing_data[0]=
showing_data[1]=
showing_data[2]=
showing_data[5]=
showing_data[6]=0x0000;
t1=0;
t3=0;
while(1){//读取提示动画
switch(t3){//动画处理
case 0:
showing_data[3]=Dpy_wei_3&(~_Dpy_duan_C);
showing_data[4]=Dpy_wei_4&(~_Dpy_duan_E);
t3=1;
break;
case 1:
showing_data[3]=Dpy_wei_3&(~_Dpy_duan_B);
showing_data[4]=Dpy_wei_4&(~_Dpy_duan_F);
t3=2;
break;
case 2:
showing_data[3]=Dpy_wei_3&(~_Dpy_duan_A);
showing_data[4]=Dpy_wei_4&(~_Dpy_duan_A);
t3=3;
break;
case 3:
showing_data[3]=0x0000;
showing_data[4]=0x0000;
showing_data[3]=Dpy_wei_2&(~_Dpy_duan_A);
showing_data[4]=Dpy_wei_5&(~_Dpy_duan_A);
t3=4;
break;
case 4:
showing_data[2]=0x0000;
showing_data[5]=0x0000;
showing_data[3]=Dpy_wei_1&(~_Dpy_duan_A);
showing_data[4]=Dpy_wei_6&(~_Dpy_duan_A);
t3=5;
break;
default:
showing_data[1]=0x0000;
showing_data[6]=0x0000;
goto seting_storage_read2;
}
btn_event=0;
user_timer1=5;
do{
chkbmq();
if(btn_event==0)continue;
switch(btn_event){
case 0x01://编码器正转
case 0xFF://编码器反转
goto seting_storage_read2;
}
}while(user_timer1);
}
seting_storage_read2:
flashing_FSM=0;
flashing_style[0]=1;//半亮<->全亮闪烁模式
UI_time_out=0;
bmq_turn_mgr_seting_data=1;
bmq_turn_mgr_speed_coefficient=255;
bmq_turn_mgr_number_upper_limit=9;
bmq_turn_mgr_number_lower_limit=1;
fp_bmq_turn_mgr_display=display_left_1_digital;
while(1){
main_x=(u1)bmq_turn_mgr_seting_data;//传参给下面这个函数
eeprom_read_addrx8();
main_x=2;//传参给下面这个函数
main_u2x=eeprom_buf1;//传参给下面这个函数
display_left_3_digital();
main_u2x=eeprom_buf2;//传参给下面这个函数
display_right_3_digital();
bmq_turn_mgr();
switch(btn_event){
case 0x02://短按
setV=eeprom_buf1;
setI=eeprom_buf2;
output_PWM_update=1;
main_x=0;
eeprom_write_unlock_addrx8();
eeprom_write();
eeprom_buf1=eeprom_buf2;
eeprom_write();
eeprom_write_lock();
goto main_UI;
}
if(UI_timeout_timer()){
//5秒无动作
goto main_UI;
}
}
set_V://选中电压
showing_data[0]=Dpy_wei_0&Dpy_duan_negative;//横杠
main_u2x=setI;//传参给下面这个函数
main_x=2;//传参给下面这个函数
display_right_3_digital();
flashing_FSM=0;//闪烁状态机
flashing_style[0]=0;//灭<->亮闪烁模式
UI_time_out=0;
while(1){
main_u2x=setV;//传参给下面这个函数
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
display_left_3_digital();
bmq_wait_event();
switch(btn_event){
case 0x01://编码器正转
goto set_I;
case 0xFF://编码器反转
goto set_storage;
case 0x02://短按
goto seting_V;
case 0x03://长按
goto continuous_adjustment_mode_V;
}
FSM_Reverse();
if(UI_timeout_timer()){
//5秒无动作
goto main_UI;
}
}
seting_V://调节电压
flashing_FSM=1;//闪烁状态机
flashing_style[0]=1;//半亮<->全亮闪烁模式
UI_time_out=0;
bmq_turn_mgr_seting_data=setV;
bmq_turn_mgr_speed_coefficient=12;
bmq_turn_mgr_number_upper_limit=600;
bmq_turn_mgr_number_lower_limit=0;
fp_bmq_turn_mgr_display=display_left_3_digital;
while(1){
bmq_turn_mgr();
switch(btn_event){
case 0x02://短按
setV=bmq_turn_mgr_seting_data;
output_PWM_update=1;
main_x=0;
eeprom_write_unlock_addrx8();
eeprom_buf1=setV;
eeprom_write();
eeprom_write_lock();
goto main_UI;
}
if(UI_timeout_timer()){
//5秒无动作
goto main_UI;
}
}
set_I://选中电流
showing_data[0]=Dpy_wei_0&Dpy_duan_negative;//横杠
main_u2x=setV;//传参给下面这个函数
main_x=2;//传参给下面这个函数
display_left_3_digital();
//showV(setV,0);
flashing_FSM=0;//闪烁状态机
flashing_style[0]=0;//灭<->亮闪烁模式
UI_time_out=0;
while(1){
main_u2x=setI;//传参给下面这个函数
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
display_right_3_digital();
bmq_wait_event();
switch(btn_event){
case 0x01://编码器正转
goto set_storage;
case 0xFF://编码器反转
goto set_V;
case 0x02://短按
goto seting_I;
case 0x03://长按
goto continuous_adjustment_mode_I;
}
FSM_Reverse();
if(UI_timeout_timer()){
//5秒无动作
goto main_UI;
}
}
seting_I://调节电流
flashing_FSM=1;//闪烁状态机
flashing_style[0]=1;//半亮<->全亮闪烁模式
UI_time_out=0;
bmq_turn_mgr_seting_data=setI;
bmq_turn_mgr_speed_coefficient=12;
bmq_turn_mgr_number_upper_limit=500;
bmq_turn_mgr_number_lower_limit=0;
fp_bmq_turn_mgr_display=display_right_3_digital;
while(1){
bmq_turn_mgr();
switch(btn_event){
case 0x02://短按
setI=bmq_turn_mgr_seting_data;
output_PWM_update=1;
main_x=0;
eeprom_write_unlock_addrx8();
eep_addr+=4;
eeprom_buf1=setI;
eeprom_write();
eeprom_write_lock();
goto main_UI;
}
if(UI_timeout_timer()){
//5秒无动作
goto main_UI;
}
}
seting_storage_write:
showing_data[0]=
showing_data[2]=
showing_data[3]=
showing_data[4]=
showing_data[5]=0x0000;
t1=0;
t3=0;
while(1){//存储提示动画
switch(t3){//动画处理
case 0:
showing_data[1]=Dpy_wei_1&(~_Dpy_duan_A);
showing_data[6]=Dpy_wei_6&(~_Dpy_duan_A);
t3=1;
break;
case 1:
showing_data[1]=0x0000;
showing_data[6]=0x0000;
showing_data[2]=Dpy_wei_2&(~_Dpy_duan_A);
showing_data[5]=Dpy_wei_5&(~_Dpy_duan_A);
t3=2;
break;
case 2:
showing_data[2]=0x0000;
showing_data[5]=0x0000;
showing_data[3]=Dpy_wei_3&(~_Dpy_duan_A);
showing_data[4]=Dpy_wei_4&(~_Dpy_duan_A);
t3=3;
break;
case 3:
showing_data[3]=Dpy_wei_3&(~_Dpy_duan_B);
showing_data[4]=Dpy_wei_4&(~_Dpy_duan_F);
t3=4;
break;
case 4:
showing_data[3]=Dpy_wei_3&(~_Dpy_duan_C);
showing_data[4]=Dpy_wei_4&(~_Dpy_duan_E);
t3=5;
break;
default:
showing_data[3]=0x0000;
showing_data[4]=0x0000;
goto seting_storage_write2;
}
btn_event=0;
user_timer1=5;
do{
chkbmq();
if(btn_event==0)continue;
switch(btn_event){
case 0x01://编码器正转
case 0xFF://编码器反转
goto seting_storage_write2;
}
}while(user_timer1);
}
seting_storage_write2:
flashing_FSM=0;
flashing_style[0]=1;//半亮<->全亮闪烁模式
UI_time_out=0;
main_x=2;
main_u2x=setV;
display_left_3_digital();
main_u2x=setI;
display_right_3_digital();
bmq_turn_mgr_seting_data=1;
bmq_turn_mgr_speed_coefficient=255;
bmq_turn_mgr_number_upper_limit=9;
bmq_turn_mgr_number_lower_limit=1;
fp_bmq_turn_mgr_display=display_left_1_digital;
while(1){
bmq_turn_mgr();
switch(btn_event){
case 0x02://短按
main_x=(u1)bmq_turn_mgr_seting_data;
eeprom_write_unlock_addrx8();
eeprom_buf1=setV;
eeprom_write();
eeprom_buf1=setI;
eeprom_write();
eeprom_write_lock();
goto main_UI;
}
if(UI_timeout_timer()){
//5秒无动作
goto main_UI;
}
}
factory_mode://工厂模式
seting_data[0]=1;//最左边的数码管的数字
main_x=10;
eeprom_read_addrx8();
seting_data[1]=eeprom_buf1;
seting_data[2]=eeprom_buf2;
main_x=11;
eeprom_read_addrx8();
seting_data[3]=eeprom_buf1;
seting_data[4]=eeprom_buf2;
main_x=12;
eeprom_read_addrx8();
seting_data[5]=eeprom_buf1;
seting_data[6]=eeprom_buf2;
main_x=13;
eeprom_read_addrx8();
seting_data[7]=eeprom_buf1;
seting_data[8]=eeprom_buf2;
main_x=14;
eeprom_read_addrx8();
seting_data[9]=eeprom_buf1;
seting_data[10]=eeprom_buf2;
if(seting_data[3]<100 || seting_data[3]>600){
seting_data[3]=600;
}
if(seting_data[8]<100 || seting_data[8]>400){
seting_data[8]=100;
}
/*
seting_data[1]=0;//0.5V对应的PWM值
seting_data[2]=0;//0.5V对应的ADC值
seting_data[3]=600;//9-60V之间选中的参考电压(比例:600=60V)
seting_data[4]=0;//9-60V之间选中的参考电压对应的PWM值
seting_data[5]=0;//9-60V之间选中的参考电压对应的ADC值
seting_data[6]=0;//0.5A对应的PWM值
seting_data[7]=0;//0.5A对应的ADC值
seting_data[8]=100;//9-40A之间选中的参考电流(比例:400=40A)
seting_data[9]=0;//9-40A之间选中的参考电流对应的PWM值
seting_data[10]=0;//9-40A之间选中的参考电流对应的ADC值
//*/
flashing_style[0]=0;//灭<->亮闪烁模式
factory_mode2:
flashing_FSM=0;
factory_mode_:
showing_data[1]=Dpy_wei_1 & Dpy_duan_null;
showing_data[2]=Dpy_wei_2 & Dpy_duan_null;
showing_data[3]=Dpy_wei_3 & Dpy_duan_null;
showing_data[4]=Dpy_wei_4 & Dpy_duan_null;
showing_data[5]=Dpy_wei_5 & Dpy_duan_null;
showing_data[6]=Dpy_wei_6 & Dpy_duan_null;
t3=0;
while(1){
main_u2x=seting_data[0];//传参给下面这个函数
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
display_left_1_digital();
t3=show_str(str_list[LOW(seting_data[0])-1],t3);
bmq_wait_event();
switch(btn_event){
case 0x01://编码器正转
if(flashing_style[0]){//正在调节最左边的数码管
t3=0;
seting_data[0]++;
if(seting_data[0]>6)seting_data[0]=6;
flashing_FSM=1;
goto factory_mode_;
}else{
switch(LOW(seting_data[0])){
case 1:
factory_mode_setV_or_setI=0;
goto factory_mode_set_0_5v_or_0_5a_ref;
case 2:
factory_mode_setV_or_setI=0;
goto factory_mode_set_9_60v_or_9_40a_ref;
case 3:
factory_mode_setV_or_setI=5;
goto factory_mode_set_0_5v_or_0_5a_ref;
case 4:
factory_mode_setV_or_setI=5;
goto factory_mode_set_9_60v_or_9_40a_ref;
case 5:
factory_mode_setV_or_setI=5;//代表要存储参数
goto factory_mode_save_or_cansel;
default:
factory_mode_setV_or_setI=0;//代表要放弃参数
goto factory_mode_save_or_cansel;
}
}
break;
case 0xFF://编码器反转
if(flashing_style[0]){//正在调节最左边的数码管
t3=0;
seting_data[0]--;
if(seting_data[0]<1)seting_data[0]=1;
flashing_FSM=1;
goto factory_mode_;
}else{
switch(LOW(seting_data[0])){
case 1:
factory_mode_setV_or_setI=0;
goto factory_mode_set_0_5v_or_0_5a_ref;
case 2:
factory_mode_setV_or_setI=0;
goto factory_mode_set_9_60v_or_9_40a_ref2;
case 3:
factory_mode_setV_or_setI=5;
goto factory_mode_set_0_5v_or_0_5a_ref;
case 4:
factory_mode_setV_or_setI=5;
goto factory_mode_set_9_60v_or_9_40a_ref2;
case 5:
factory_mode_setV_or_setI=5;//代表要存储参数
goto factory_mode_save_or_cansel;
default:
factory_mode_setV_or_setI=0;//代表要放弃参数
goto factory_mode_save_or_cansel;
}
}
break;
case 0x02://短按
flashing_style[0]=!flashing_style[0];//切换:数值调整状态 <--> 项目选择状态
break;
default:
FSM_Reverse();
}
}
factory_mode_set_0_5v_or_0_5a_ref:
flashing_FSM=0;//闪烁状态机
showing_data[1]=0x0000;
showing_data[2]=0x0000;
flashing_style[0]=0;//灭<->亮闪烁模式
fp_display_PWM_value=NULL;
while(1){
main_u2x=seting_data[1+factory_mode_setV_or_setI];//传参给下面这个函数
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
display_PWM_value();
bmq_wait_event();
switch(btn_event){
case 0x02://短按
factory_mode_seting_PWM_PWMdata=seting_data[1+factory_mode_setV_or_setI];
factory_mode_seting_PWM();
if(factory_mode_setV_or_setI){//电流
seting_data[1+5]=factory_mode_seting_PWM_PWMdata;
seting_data[2+5]=nowI_16bit_ADC_result;
}else{//电压
seting_data[1]=factory_mode_seting_PWM_PWMdata;
seting_data[2]=nowV_16bit_ADC_result;
}
goto factory_mode_set_0_5v_or_0_5a_ref;
case 0x01://编码器正转
case 0xFF://编码器反转
goto factory_mode2;
default:
FSM_Reverse();
}
}
factory_mode_set_9_60v_or_9_40a_ref:
flashing_FSM=0;//闪烁状态机
if(factory_mode_setV_or_setI){//电流
showing_data[4]=Dpy_wei_4 & Dpy_duan_a;
}else{//电压
showing_data[4]=Dpy_wei_4 & Dpy_duan_v;
}
showing_data[5]=0x0000;
showing_data[6]=Dpy_wei_6 & (~_Dpy_duan_D);
flashing_style[0]=0;//灭<->亮闪烁模式
while(1){
main_u2x=seting_data[3+factory_mode_setV_or_setI];//传参给下面这个函数
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
display_left_3_digital();
bmq_wait_event();
switch(btn_event){
case 0x02://短按
goto factory_mode_set_9_60v_or_9_40a_ref_seting;
case 0x01://编码器正转
goto factory_mode_set_9_60v_or_9_40a_ref2;
case 0xFF://编码器反转
goto factory_mode2;
default:
FSM_Reverse();
}
}
factory_mode_set_9_60v_or_9_40a_ref_seting:
flashing_FSM=1;//闪烁状态机
flashing_style[0]=1;//半亮<->全亮闪烁模式
bmq_turn_mgr_seting_data=seting_data[3+factory_mode_setV_or_setI];
bmq_turn_mgr_speed_coefficient=12;
bmq_turn_mgr_number_upper_limit=600;
if(factory_mode_setV_or_setI){
bmq_turn_mgr_number_upper_limit=400;
}
bmq_turn_mgr_number_lower_limit=90;
fp_bmq_turn_mgr_display=display_left_3_digital;
while(1){
bmq_turn_mgr();
if(btn_event==0x02){
seting_data[3+factory_mode_setV_or_setI]=bmq_turn_mgr_seting_data;
goto factory_mode_set_9_60v_or_9_40a_ref;
}
}
factory_mode_set_9_60v_or_9_40a_ref2:
flashing_FSM=0;//闪烁状态机
showing_data[1]=Dpy_wei_1 & (~_Dpy_duan_D);
showing_data[2]=0x0000;
flashing_style[0]=0;//灭<->亮闪烁模式
fp_display_PWM_value=NULL;
while(1){
main_u2x=seting_data[4+factory_mode_setV_or_setI];//传参给下面这个函数
main_x=flashing_style[flashing_FSM];//传参给下面这个函数
display_PWM_value();
bmq_wait_event();
switch(btn_event){
case 0x02://短按
factory_mode_seting_PWM_PWMdata=seting_data[4+factory_mode_setV_or_setI];
factory_mode_seting_PWM();
if(factory_mode_setV_or_setI){//电流
seting_data[4+5]=factory_mode_seting_PWM_PWMdata;
seting_data[5+5]=nowI_16bit_ADC_result;
}else{//电压
seting_data[4]=factory_mode_seting_PWM_PWMdata;
seting_data[5]=nowV_16bit_ADC_result;
}
goto factory_mode_set_9_60v_or_9_40a_ref2;
case 0x01://编码器正转
goto factory_mode2;
case 0xFF://编码器反转
goto factory_mode_set_9_60v_or_9_40a_ref;
default:
FSM_Reverse();
}
}
factory_mode_save_or_cansel:
flashing_FSM=0;//闪烁状态机
flashing_style[0]=0;//灭<->亮闪烁模式
while(1){
if(flashing_FSM){
HC595_data_mask[0]=
HC595_data_mask[1]=0xFFFF;
}else{
HC595_data_mask[0]=
HC595_data_mask[1]=Dpy_wei_0;
}
bmq_wait_event();
switch(btn_event){
case 0x02://短按
if(factory_mode_setV_or_setI==5){//存储参数
main_x=10;
eeprom_write_unlock_addrx8();
t3=1;
do{
eeprom_buf1=seting_data[t3];
eeprom_write();
}while(++t3<=10);
calculation_factory_parameters();
eeprom_buf1=PWM_V_bias;
eeprom_write();
eeprom_buf1=PWM_V_coefficient;
eeprom_write();
eeprom_buf1=PWM_I_bias;
eeprom_write();
eeprom_buf1=PWM_I_coefficient;
eeprom_write();
eeprom_buf1=ADC_V_bias;
eeprom_write();
eeprom_buf1=ADC_V_coefficient;
eeprom_write();
eeprom_buf1=ADC_I_bias;
eeprom_write();
eeprom_buf1=ADC_I_coefficient;
eeprom_write();
eeprom_write_lock();
}
goto start_up;
case 0x01://编码器正转
case 0xFF://编码器反转
goto factory_mode2;
default:
FSM_Reverse();
}
}
}
0
回复
提示
@syf7150
#include"iostm8s103f3.h"#include"F:\学习笔记\单片机\stm8\my.h"/*【选项字节设置】需要激活:AFR0*//*【74HC595与数码管连接的脚位定义】第1级74HC595的Q0对应0x0001
本层是源代码,大家可以自己分享讨论。其中可自己改动的空间非常大。只要把PCB换种参数就能支持多种电源模块。不一定非要用2400电源。接下来准备改个0-120v,0-25A的2400。如果成功就移植到台达电源模块试试去。。大家动手多改造移植,才能保证电源不涨价,支持多种品牌型号的,避免技术屏蔽!
0
回复
提示












