• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

中兴24004.3版电源用STM8单片机改装输出可调0-60V,0-50A

最近搞逆变,没有合适的电池供电。又没有大功率电源,关键是米不多,买不起大电源。。。所以就萌生了改装个通讯电源可调输出的想法。后来多次搜索终于确定了中兴2400的电源,把别人测绘的原理图看了看。这个电源用料真足。保护电路很完善,二手的一两百一台。后来看到很多改装方案,基本都是加电位器调节电压电流反馈基准电压形式。但是总感觉这个不是很靠谱,在想能不能用单片机直接控制不是更安全准确么。。那么废话不多说先上图
全部回复(76)
正序查看
倒序查看
syf7150
LV.3
2
2016-05-02 16:22

PCB板子,一个主板。另外那个凸起是风扇控制板,上面用的是双NMOS IC,控制风扇

花了几个小时才焊接完毕,用了0603封装,眼神不好焊起来有点困难。。。然后用个18V电源通电,显示默认值。

这个是降压模块3R33。输出5V,输入可以到7-23V,不过看你装的贴片滤波电容耐压而定。

这是拆掉的2400控制板,原理图网上可以找到。如果谁需要可以留下邮箱。

焊接线,一共8根。出去电源,就是电压AD,DA:电流AD,DA;风扇温度和控制。

NTC 10K热敏电阻,负温度系数,根据查表得到电阻值,然后计算电压

这是装到2400前面板下面,尺寸正好放进去!

初步调试,电压校准好还是比较准的。电流校准后大约有20mA误差。

本来拍了个调试视频,发不上来。。。只能看图了。昨晚上焊的时候,没拍几张照片,凑合看吧

0
回复
syf7150
LV.3
3
2016-05-02 16:29
@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
LV.3
4
2016-05-02 17:06
最重要说一点,这个成本很低。改装稳定可靠,显示准确。不过我还是喜欢写的代码。。
0
回复
2016-05-03 09:53
帖子不错哦,打赏5枚电源币
0
回复
ruohan
LV.9
6
2016-05-03 14:04
@syf7150
最重要说一点,这个成本很低。改装稳定可靠,显示准确。不过我还是喜欢写的代码。。

数码管的显示用的是什么芯片,

0
回复
syf7150
LV.3
7
2016-05-03 21:20
@ruohan
数码管的显示用的是什么芯片,
数码管用的74HC595,单片机用的STM8S103F3P,另外用了个风扇控制ME9926
0
回复
syf7150
LV.3
8
2016-05-03 21:31
@电源网-fqd
帖子不错哦,打赏5枚电源币
谢谢司令大驾光临,出入茅庐。。还需要司令指导“枪”怎么打的准,“炮”怎么打的远!以前混逆变专区的,在这儿我得吹一波,寿大师无私精神,祝愿他老人家身体健康!
0
回复
syf7150
LV.3
9
2016-05-03 21:37
搬来上个源代码,发现2000多行,像刷屏。。
0
回复
syf7150
LV.3
10
2016-05-03 22:16

刚把视频传上来了。

先电流测试(短路电流),再电压测试。最后是保存自定义电压电流测试。

0
回复
lizlk
LV.10
11
2016-05-04 08:22
@syf7150
刚把视频传上来了。先电流测试(短路电流),再电压测试。最后是保存自定义电压电流测试。
楼主相当有才,支持一个!
0
回复
bbb201105
LV.1
12
2016-05-04 09:20
能分享下资料吗,看你那视频我也想搞个出来玩玩
0
回复
yanggbx
LV.4
13
2016-05-04 13:01
@syf7150
[图片][图片]PCB板子,一个主板。另外那个凸起是风扇控制板,上面用的是双NMOSIC,控制风扇[图片][图片]花了几个小时才焊接完毕,用了0603封装,眼神不好焊起来有点困难。。。然后用个18V电源通电,显示默认值。[图片]这个是降压模块3R33。输出5V,输入可以到7-23V,不过看你装的贴片滤波电容耐压而定。[图片][图片][图片]这是拆掉的2400控制板,原理图网上可以找到。如果谁需要可以留下邮箱。[图片]焊接线,一共8根。出去电源,就是电压AD,DA:电流AD,DA;风扇温度和控制。[图片]NTC10K热敏电阻,负温度系数,根据查表得到电阻值,然后计算电压[图片]这是装到2400前面板下面,尺寸正好放进去![图片]初步调试,电压校准好还是比较准的。电流校准后大约有20mA误差。本来拍了个调试视频,发不上来。。。只能看图了。昨晚上焊的时候,没拍几张照片,凑合看吧
能分享一下软硬件吗?
0
回复
2016-05-04 14:32
@bbb201105
能分享下资料吗,看你那视频我也想搞个出来玩玩
关注,视频呢?
0
回复
2016-05-04 18:40
@心如刀割
关注,视频呢?
非常好,
0
回复
zhangjunhai
LV.6
16
2016-05-04 21:33
@syf7150
刚把视频传上来了。先电流测试(短路电流),再电压测试。最后是保存自定义电压电流测试。
楼主你是不是买电源的,你这么一搞2400电源要涨价呀
0
回复
syf7150
LV.3
17
2016-05-04 22:20
@yanggbx
能分享一下软硬件吗?
硬件就是个小PCB板子,上面贴了出来了。代码有,准备分享出来
0
回复
syf7150
LV.3
18
2016-05-04 22:22
@zhangjunhai
楼主你是不是买电源的,你这么一搞2400电源要涨价呀
没TB店,这个也是没事自己做着玩的,目前 没时间精力搞店铺啥的。。只是给大家分享下。。
0
回复
syf7150
LV.3
19
2016-05-04 22:25
#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
LV.3
20
2016-05-04 22:27
@syf7150
#include"iostm8s103f3.h"#include"F:\学习笔记\单片机\stm8\my.h"/*【选项字节设置】需要激活:AFR0*//*【74HC595与数码管连接的脚位定义】第1级74HC595的Q0对应0x0001
本层是源代码,大家可以自己分享讨论。其中可自己改动的空间非常大。只要把PCB换种参数就能支持多种电源模块。不一定非要用2400电源。接下来准备改个0-120v,0-25A的2400。如果成功就移植到台达电源模块试试去。。大家动手多改造移植,才能保证电源不涨价,支持多种品牌型号的,避免技术屏蔽!
0
回复
syf7150
LV.3
21
2016-05-04 22:30
@心如刀割
关注,视频呢?
10层有视频链接,可以先看看效果
0
回复
syf7150
LV.3
22
2016-05-04 22:44
@syf7150
本层是源代码,大家可以自己分享讨论。其中可自己改动的空间非常大。只要把PCB换种参数就能支持多种电源模块。不一定非要用2400电源。接下来准备改个0-120v,0-25A的2400。如果成功就移植到台达电源模块试试去。。大家动手多改造移植,才能保证电源不涨价,支持多种品牌型号的,避免技术屏蔽!
刚才问了一家卖2400的,说刚涨价了。。看来这个套件有一定影响价格!准备开始移植型号去。。
0
回复
release
LV.6
23
2016-05-05 15:01
@syf7150
#include"iostm8s103f3.h"#include"F:\学习笔记\单片机\stm8\my.h"/*【选项字节设置】需要激活:AFR0*//*【74HC595与数码管连接的脚位定义】第1级74HC595的Q0对应0x0001
不错,顶一个!
0
回复
lizlk
LV.10
24
2016-05-05 17:54
@syf7150
本层是源代码,大家可以自己分享讨论。其中可自己改动的空间非常大。只要把PCB换种参数就能支持多种电源模块。不一定非要用2400电源。接下来准备改个0-120v,0-25A的2400。如果成功就移植到台达电源模块试试去。。大家动手多改造移植,才能保证电源不涨价,支持多种品牌型号的,避免技术屏蔽!

支持!辛苦了楼主,这代码写的好辛苦,建议楼主 发个.C文件上来,不然一大楼啊,呵呵。

这个硬件接口是哪些呢?

0
回复
syf7150
LV.3
25
2016-05-05 18:58
@lizlk
支持!辛苦了楼主,这代码写的好辛苦,建议楼主发个.C文件上来,不然一大楼啊,呵呵。这个硬件接口是哪些呢?
不太会上传文件,说不支持.C格式。另外是这个单片机端口全部用完了。。没留下一个,没啥接口,全是检测和输出了。。要说控制也就是译码器和风扇,其他的端口是检测电压值。要不回头把SCH图整理下,主要是外围很简单。所以直接画的PCB图。。
0
回复
dobetter
LV.7
26
2016-05-05 19:42
@syf7150
不太会上传文件,说不支持.C格式。另外是这个单片机端口全部用完了。。没留下一个,没啥接口,全是检测和输出了。。要说控制也就是译码器和风扇,其他的端口是检测电压值。要不回头把SCH图整理下,主要是外围很简单。所以直接画的PCB图。。
这个其他论坛好像有人发过~
0
回复
av-rgb
LV.6
27
2016-05-05 20:14
@syf7150
#include"iostm8s103f3.h"#include"F:\学习笔记\单片机\stm8\my.h"/*【选项字节设置】需要激活:AFR0*//*【74HC595与数码管连接的脚位定义】第1级74HC595的Q0对应0x0001

楼主好人,能人,虽然我没有这个电源但也要感谢楼主!

估计奸商们会涨价。

0
回复
syf7150
LV.3
28
2016-05-05 20:40
@dobetter
这个其他论坛好像有人发过~
这个是我自己焊接测试的,程序原作者已经在卖套件了。我这算是搬运工吧。。个别东西添加了些自己的东东
0
回复
syf7150
LV.3
29
2016-05-05 20:42
@syf7150
这个是我自己焊接测试的,程序原作者已经在卖套件了。我这算是搬运工吧。。个别东西添加了些自己的东东
这帖子的图和视频是我自己拍的,个别参数有改动。程序有改动,大家也可以自己改改参数,满足自己需要
0
回复
6735
LV.5
30
2016-05-06 02:05
@av-rgb
楼主好人,能人,虽然我没有这个电源但也要感谢楼主!估计奸商们会涨价。

菜鸟一个,也感谢楼主无私分享,(本人只会改电阻改变电压),通讯电源家里也有好几个品种。

1
回复
xiucai147
LV.1
31
2016-05-06 08:17
@syf7150
这个是我自己焊接测试的,程序原作者已经在卖套件了。我这算是搬运工吧。。个别东西添加了些自己的东东
请问有这个套件的链接没啊
0
回复