中兴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
回复
提示