发新帖本帖赏金 110.00元(功能说明)我要提问
返回列表
打印

一个外包产品的设计过程

[复制链接]
2035|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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只能作为附件上传的.还有相关的数码管,温度传感器的资料也附上,供有需要的小伙伴使用。
完成代码的编写,烧录进电路板后,相关功能符合要求。生产了十几套产品,送给客户展示,符合要求了。
这个产品从硬件到软件的设计都不太复杂,在学校也有足够多的时间慢慢琢磨,所以做出来的产品没有出纰漏。但这仅仅是展示样机,还不能算消费的产品,所以有差距的。这里呈现仅仅给大家做一个参考的!



Code.zip

13.77 KB

TM1620.pdf

909.38 KB

数码管资料

NTC 100K 3950 T-V表.rar

273 Bytes

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 110.00 元 2021-03-22
理由:恭喜通过原创奖文章审核!请多多加油哦!

评分
参与人数 2威望 +20 收起 理由
呐咯密密 + 5 赞一个!
tyw + 15 赞一个!

相关帖子

沙发
hobbye501| | 2021-3-22 14:52 | 只看该作者
不要这样贴代码,很乱 看不清楚的 我记得好像有个选项可以添加后不乱

使用特权

评论回复
板凳
呐咯密密| | 2021-3-22 14:58 | 只看该作者
和楼上意见一致,贴代码有专用的代码插件,直接复制粘贴看的太乱。但是逻辑清晰。希望可以贴控制和数据采集的代码,大佬的项目基本都是逻辑控制,很难突出重点。但是第二节的逻辑控制写的真详细,很用心。

使用特权

评论回复
地板
yangjiaxu| | 2021-3-22 14:58 | 只看该作者
首先,接外包建议先约定功能,价格等问题,最好要落实到纸面上,这样会对自己对他人都有负责之心。其次,设计产品的时候,要随时记录,随时与需方沟通进度,如果遇到问题也需要及时沟通,不要耽误双方的计划。最后,总结归档,文件要规范化,这样对自己后续交接会很省事儿。

使用特权

评论回复
5
feihufuture| | 2021-3-22 15:04 | 只看该作者
本帖最后由 feihufuture 于 2021-3-22 15:19 编辑

谢谢分享的精神,我就说下几点,希望别介意:
1)**展出的代码格式不够规范,摆列错乱;



2)代码总感觉就是直接丢出来一样,没有循序渐进,一一对应的感觉,建议好好修改;


3)记得上传实物图或者操作视频


使用特权

评论回复
6
gaoyang9992006| | 2021-3-22 15:11 | 只看该作者
代码帖的非常不专业,一看就是新用户

使用特权

评论回复
7
kk的回忆|  楼主 | 2021-3-22 15:24 | 只看该作者
帖子中的代码是一个示例,详细的在附件中都包含了

使用特权

评论回复
8
lvyunhua| | 2021-3-22 16:52 | 只看该作者
谢谢楼主的分享,个人感觉二姨家的外包平台,竞争还是很大,发包的少,接包的很多,有的是公司,还有的是团队,还有个人的,相对来说,个人的机会非常少。楼主是属于个人接的项目吗,如何提高个人竞选发包方的项目,有何妙招啊,能否再与大家分享下竞标的过程呢?

使用特权

评论回复
9
xt1973| | 2021-3-23 19:46 | 只看该作者
谢谢楼主无私分享!

使用特权

评论回复
10
kk的回忆|  楼主 | 2021-3-23 20:36 | 只看该作者
lvyunhua 发表于 2021-3-22 16:52
谢谢楼主的分享,个人感觉二姨家的外包平台,竞争还是很大,发包的少,接包的很多,有的是公司,还有的是团 ...

这个是以前导师给我做的,也不算自己接单的呢

使用特权

评论回复
11
songchenping| | 2021-3-30 08:37 | 只看该作者
不错,就是可以把原理图以PDF的格式共享一下。

使用特权

评论回复
12
xqq123| | 2021-4-12 15:15 | 只看该作者
能不能发原理图和PCB参考一下下呀?

使用特权

评论回复
评论
kk的回忆 2021-4-27 13:02 回复TA
以后有空多交流的 这里有参加的一个活动,帮忙投票,哈哈 https://huodong.21ic.com/pi-power/ 基于PI Expert online平台的12V18W某型号冰箱AC-DC开关电源设计 
13
kk的回忆|  楼主 | 2021-4-12 15:22 | 只看该作者
xqq123 发表于 2021-4-12 15:15
能不能发原理图和PCB参考一下下呀?

PCB找不到了,是以前很老的AD软件画的,电脑重装系统,就只留下PDF版本了

使用特权

评论回复
14
xqq123| | 2021-4-12 15:34 | 只看该作者
kk的回忆 发表于 2021-4-12 15:22
PCB找不到了,是以前很老的AD软件画的,电脑重装系统,就只留下PDF版本了

那请问PDF有分享出来吗,可以让我学习一下吗?谢谢

使用特权

评论回复
发新帖 本帖赏金 110.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

561

帖子

6

粉丝