本帖最后由 kk的回忆 于 2021-3-22 15:42 编辑
#申请原创#@21小跑堂
@21小跑堂
@21小跑堂
二姨的外包平台越来越规范化了,很多小伙伴都希望在工作之余的空闲时间做一些外包项目。几年前大学时候曾经帮导师做过一款工程样品的小设备,是有关工业电源产品检测OCP,OTP方面的应用,花了差不多两个月的时间完成软硬件的调试。在这里将整个设计流程和小伙伴们一起分享的,可以给论坛小伙伴们接外包项目作为参考的。这个设备需要对工业电源的输出进行OCP,OVP,OTP检测等相关功能,并对相关测试量的信息实时显示在数码管(由于是几年前的设备,液晶比较贵,只能选择数码管的)。由于客户给出的信息比较宽泛,所以设计起来比较自由,首先完成基本参数的定义,完成原理图和PCB的设计。
一,基本参数1.额定电压:220V 2.额定频率:50Hz 3.额定功率:20W 4.输入信号:由连接器接到相应的检测负载 CN1:电源负载1温度传感器 CN2:电源负载2温度传感器 CN3:电源负载1电流检测信号 CN4:电源负载2电流检测信号 KEY1:Stop按键 KEY2:Dec按键 KEY3:Inc按键 KEY4:Star按键 5.输出控制: SEG1:温度显示数码管 SEG2:电流显示数码管 CN5:电源负载1 PWM控制信号 CN6:电源负载2 PWM控制信号 CN7:散热风扇PWM控制信号 CN8:水冷泵PWM控制信号 led1:关断指示灯(红色) led2:电源负载1正常工作指示灯(绿色) led3:电源负载2过热指示灯(黄色) led4:电源负载1正常工作指示灯(绿色) led5:电源负载2过热指示灯(黄色) 相关的输出控制单元,比如散热风扇,水冷泵,数码显示管,都是安装在客户工业电源的外观结构上面,用线束和开发的控制板连接到一起,随后和客户定义了这些控制单元的DC电压,开始进行原理如的设,使用AD绘制。根据相关功能的需求,使用STM32F103C8可以满足需求,而且也没有overdesign,基本所有的外设都用上了。
AC-DC电源部分TNY278为电源芯片,输出DC-12V,随后选用LDO输出DC-5V。虽然12V转3V3的压差毕竟大,但经过计算3V3的耗电50mA左右,LDO芯片功耗越过400mW左右,选用TO220的插件封装,再加装散热片可以满足要求。以下是电源部分的电路图
关于layout图纸参考意义就不是很大,由于我们是小样产品,不会有EMC和安规认证方面的要求,所以画的图纸就很粗糙,就不在这里展示了,哈哈。完成了layout后,发到大家都喜欢打板的厂家-嘉立创,五天后就收到了板子,手工焊接完成,由于电源是很成熟的方案,只要元件不焊接错误,基本可以保证一次输出成功。果然测试输出电压12V,5V,3V3,一次过,没有什么问题。客户也不对纹波,动态响应性,环路稳定性有指标性的要求,只要求功能正常就可以。所以对硬件就没有过多的调试,就开始进行软件的编写。 关于软件怎么实现,这就要安装客户的要求详细实现,通过和客户多次讨论,了解到这个控制板需要实现的控制逻辑。
二,控制逻辑以下是相关外设对软件的定义: 1. 控制芯片:STM32F103C8T6 2. 温度检测: (1)温度传感器CN1和CN2实时检测功率负载1和功率负载2散热片的温度,通过AD采样转换后,对应R-T表计算温度,将当前较高温度显示在数码管SEG2。 (2)温度传感器CN1和CN2实时检测功率负载1和功率负载2散热片的温度。当采集温度高于设定安全温度(85℃),对应路黄色指示灯亮(led3、led5),对应路PWM输出为0,对应路绿色指示灯灭(负载2、led4),进行过热报警和保护,并将当前较高温度显示在数码管SEG2,数码管SEG2按照亮0.5秒关0.5秒的频率闪烁提示。 (3)当温度降低至安全窗口之下(55℃),取消报警状态,PWM按之前设定输出,数码管和指示灯恢复正常显示。 (4)根据CN1、CN2所检测当前温度,应在CN7、CN8输出适当PWM波,调节散热风扇和水冷泵转速,以维持功率负载1和功率负载2温度在适当范围。 3.电流输出: (1)按KEY4,CN5、CN6按照设定电流值和“PWM-电流对应表”,输出一定占空比PWM波。 (2)定期(10ms)检测输入CN3、CN4当前电流值。当某路电流和设定电流值有偏差(超过±100mA),将提高或者减少该路(CN5、CN6)输出PWM波占空比,从而保证电源芯片输出恒定电流。 (3)按键KEY2提高功率负载1和功率负载2电流设定值,数码管SEG1以0.5s间隔闪烁显示设定电流值,CN5、CN6输出仍按照之前设定电流进行输出和反馈调节,然后按下KEY4,修改CN5、CN6 PWM输出,同时开始反馈调节。 (4)按键KEY3降低功率负载1和功率负载2电流设定值,数码管SEG1以0.5s间隔闪烁显示设定电流值,CN5、CN6输出仍按照之前设定电流进行输出和反馈调节,然后按下KEY4,修改CN5、CN6 PWM输出,同时开始反馈调节。 (5)KEY2或KEY3最后一次按键后,10秒内不按下按键KEY4,当前按键KEY2和KEY3设定无效,数码管SEG1停止闪烁,显示之前设定值。 (6)按下按键KEY1,停止CN4、CN5输出PWM波,也即无电流输出,负载1点亮,负载2、led4灭,led3、led5仍按照温度检测规则显示。 (7)关闭电流输出后,按下按键KEY4,将按照当前设定值,CN5、CN6再次输出PWM波,同时开始反馈调节。 俗话说工欲善其事必先利其器,完成了软件控制逻辑的定义,就可以具体进行软件代码的编写。
三 软件编写 使用STM32的开发工具进行代码的编写,借鉴原子哥的例程,在相关的原子哥的例程上面开发,相信很多人都有这经历,毕竟站在巨人的肩膀上面可以看得更远,哈哈;
在这个产品中,用到ADC采样,PWM调节,数码管控制,按键扫描控制等相关功能,所以以下的子函数需要用到,具体的代码就不在帖子中就一一列出来,随后会作为附件呈现出来的,
对相关子函数进行调试,实现了对应功能后。就开始Main函数的编写,调用子函数实现软件控制逻辑中要求的功能。具体代码如帖子中呈现出来的,由于当时完全是仿照例程写的,所以写的不是很规范,但是最后产品是完整跑起来了,作为送样的产品也达到了要求的,哈哈! #include "seg.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "pwm.h"
#include "timer.h"
#include "led.h"
#include "adc.h"
if(led_two_current>current_display_seg_ma) //电流大小大致范围要确定,以便处理起来乘1000,做整数处理
{
current_compare_two=led_two_current-current_display_seg_ma;
if(current_compare_two>100)
{
if(pwm_current_two<=0)
{
pwm_current_two-=pwm_current_two;
TIM_SetCompare2(TIM1,(float)pwm_cnt*pwm_current_two*0.01);
}
LED_BLUE_ONE=LED_DOWN;
LED_BLUE_TWO=LED_DOWN;
}
else
{
LED_BLUE_ONE=LED_UP;
LED_BLUE_TWO=LED_UP;
}
}
else
{
current_compare_two=current_display_seg_ma-led_two_current;
if(current_compare_two>100)
{
pwm_current_two+=pwm_current_two;
if(pwm_current_two>=100)
{
pwm_current_two=100;
TIM_SetCompare1(TIM2,(float)pwm_cnt*pwm_current_two*0.01);
}
LED_BLUE_ONE=LED_DOWN;
LED_BLUE_TWO=LED_DOWN;
}
else
{
LED_BLUE_ONE=LED_UP;
LED_BLUE_TWO=LED_UP;
}
}
}
TIM_SetCompare1(TIM1,(float)pwm_cnt*pwm_current_one*0.01); //使用PWM输出控制电流大小
TIM_SetCompare2(TIM1,(float)pwm_cnt*pwm_current_two*0.01);
TIM_SetCompare3(TIM1,(float)pwm_cnt*pwm_fan*0.01); // 风扇PWM控制是正逻辑
TIM_SetCompare4(TIM1,(float)pwm_cnt*pwm_pump*0.01); //散热风扇,水冷泵,按照预定PWM波输出
// TIM_SetCompare1(TIM1,200); //使用PWM输出控制电流大小
// TIM_SetCompare2(TIM1,400);
// TIM_SetCompare3(TIM1,600); // 风扇PWM控制是反逻辑
// TIM_SetCompare4(TIM1,800); //散热风扇,水冷泵,按照预定PWM波输出
while(1)
{
if(**_50ms==1)
{
**_50ms=0;
led_one_temperature = led_one_temp(); // led_one_temp()函数调用,可显示温度,已调整完成
led_two_temperature = led_two_temp(); //
led_one_current = Led_One_Current(); //获取功率负载1电流
led_two_current = Led_Two_Current(); //获取功率负载1电流,此处还没有做AD值转电流的子函数
}
Temperature_low();
Temperature_high();
if(**_10ms==1) //每10ms检测按键是否按下
{
**_10ms=0;
Current_pwm();
Key_Scan_Timer();
Key_value();
}
if(**_100ms==1)
{
// Key_value(); //放在这里就是1s按键读取一次
}
if(**_1s==1) //10s无操作, 按键inc,dec不起作用
{
**_1s=0;
Fan_pump_pwm();
if(**_cnt_10s>0)
{
**_cnt_10s--;
if(**_cnt_10s==0)
{
dec_cnt=0;
inc_cnt=0;
**_seg_flash=0; //十秒结束后,数码管电流值停止闪烁
}
}
}
main函数也有些长,贴了三次完整的代码,网页都被卡死了,随便贴两端代码做个示例的,其他code只能作为附件上传的.还有相关的数码管,温度传感器的资料也附上,供有需要的小伙伴使用。 完成代码的编写,烧录进电路板后,相关功能符合要求。生产了十几套产品,送给客户展示,符合要求了。 这个产品从硬件到软件的设计都不太复杂,在学校也有足够多的时间慢慢琢磨,所以做出来的产品没有出纰漏。但这仅仅是展示样机,还不能算消费的产品,所以有差距的。这里呈现仅仅给大家做一个参考的!
|