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

一个外包产品的设计过程

[复制链接]
1201|13
 楼主 | 2021-3-20 21:05 | 显示全部楼层 |阅读模式
本帖最后由 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,基本所有的外设都用上了。
748686055f3da82593.png
AC-DC电源部分TNY278为电源芯片,输出DC-12V,随后选用LDO输出DC-5V。虽然12V转3V3的压差毕竟大,但经过计算3V3的耗电50mA左右,LDO芯片功耗越过400mW左右,选用TO220的插件封装,再加装散热片可以满足要求。以下是电源部分的电路图
307376055f3e2811d3.png
关于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的开发工具进行代码的编写,借鉴原子哥的例程,在相关的原子哥的例程上面开发,相信很多人都有这经历,毕竟站在巨人的肩膀上面可以看得更远,哈哈;
693946055f3ec7d7d0.png
在这个产品中,用到ADC采样,PWM调节,数码管控制,按键扫描控制等相关功能,所以以下的子函数需要用到,具体的代码就不在帖子中就一一列出来,随后会作为附件呈现出来的,
920596055f3f16d8a1.png
对相关子函数进行调试,实现了对应功能后。就开始Main函数的编写,调用子函数实现软件控制逻辑中要求的功能。具体代码如帖子中呈现出来的,由于当时完全是仿照例程写的,所以写的不是很规范,但是最后产品是完整跑起来了,作为送样的产品也达到了要求的,哈哈!
  1. #include "seg.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "key.h"
  5. #include "pwm.h"
  6. #include "timer.h"
  7. #include "led.h"
  8. #include "adc.h"

  9. if(led_two_current>current_display_seg_ma)                                                           //电流大小大致范围要确定,以便处理起来乘1000,做整数处理
  10.                 {
  11.                                 current_compare_two=led_two_current-current_display_seg_ma;            
  12.                                 if(current_compare_two>100)
  13.                                 {
  14.                                     if(pwm_current_two<=0)
  15.                                           {
  16.                                                                 pwm_current_two-=pwm_current_two;
  17.                                                                 TIM_SetCompare2(TIM1,(float)pwm_cnt*pwm_current_two*0.01);                                                         
  18.                                           }   
  19.                                                 LED_BLUE_ONE=LED_DOWN;
  20.                                                 LED_BLUE_TWO=LED_DOWN;                              
  21.                                 }
  22.                                 else
  23.                                 {
  24.                                          LED_BLUE_ONE=LED_UP;
  25.                                          LED_BLUE_TWO=LED_UP;
  26.                                 }
  27.                 }
  28.                 else
  29.                 {
  30.                                 current_compare_two=current_display_seg_ma-led_two_current;            
  31.                                 if(current_compare_two>100)
  32.                                 {
  33.                                                 pwm_current_two+=pwm_current_two;
  34.                                                 if(pwm_current_two>=100)
  35.                                                 {
  36.                                                                 pwm_current_two=100;
  37.                                                                 TIM_SetCompare1(TIM2,(float)pwm_cnt*pwm_current_two*0.01);        
  38.                                                 }                       
  39.                                                 LED_BLUE_ONE=LED_DOWN;
  40.                                                 LED_BLUE_TWO=LED_DOWN;                              
  41.                                 }
  42.                                 else
  43.                                 {
  44.                                           LED_BLUE_ONE=LED_UP;
  45.                                     LED_BLUE_TWO=LED_UP;
  46.                     }  
  47.                 }
  48. }

  49. TIM_SetCompare1(TIM1,(float)pwm_cnt*pwm_current_one*0.01);          //使用PWM输出控制电流大小
  50.                 TIM_SetCompare2(TIM1,(float)pwm_cnt*pwm_current_two*0.01);
  51.                 TIM_SetCompare3(TIM1,(float)pwm_cnt*pwm_fan*0.01);                          // 风扇PWM控制是正逻辑
  52.                 TIM_SetCompare4(TIM1,(float)pwm_cnt*pwm_pump*0.01);                         //散热风扇,水冷泵,按照预定PWM波输出        

  53.                 //        TIM_SetCompare1(TIM1,200);          //使用PWM输出控制电流大小
  54.                 //        TIM_SetCompare2(TIM1,400);
  55.                 //        TIM_SetCompare3(TIM1,600);                  // 风扇PWM控制是反逻辑
  56.                 //        TIM_SetCompare4(TIM1,800);                         //散热风扇,水冷泵,按照预定PWM波输出

  57.                 while(1)
  58.                 {
  59.                     if(**_50ms==1)
  60.                                 {
  61.                                           **_50ms=0;
  62.                                                 led_one_temperature        = led_one_temp();           // led_one_temp()函数调用,可显示温度,已调整完成
  63.                                                 led_two_temperature = led_two_temp();          //
  64.                                                 led_one_current = Led_One_Current();           //获取功率负载1电流
  65.                                                 led_two_current = Led_Two_Current();           //获取功率负载1电流,此处还没有做AD值转电流的子函数
  66.                                 }
  67.                                 Temperature_low();
  68.                                 Temperature_high();
  69.                         
  70.                                 if(**_10ms==1)                   //每10ms检测按键是否按下
  71.                                 {
  72.                                           **_10ms=0;
  73.                                                 Current_pwm();
  74.                                           Key_Scan_Timer();
  75.                                           Key_value();                                 
  76.                                 }

  77.                                 if(**_100ms==1)
  78.                                 {
  79.       //      Key_value();       //放在这里就是1s按键读取一次
  80.                                 }
  81.                                 
  82.                                 if(**_1s==1)         //10s无操作, 按键inc,dec不起作用
  83.                                 {
  84.                                     **_1s=0;
  85.                                           Fan_pump_pwm();
  86.                                                 if(**_cnt_10s>0)
  87.                                                 {
  88.                                                                 **_cnt_10s--;
  89.                                                                 if(**_cnt_10s==0)
  90.                                                                 {
  91.                                                                                 dec_cnt=0;
  92.                                                                           inc_cnt=0;
  93.                                                                                 **_seg_flash=0;   //十秒结束后,数码管电流值停止闪烁
  94.                                                                 }
  95.                                                 }
  96.                                 }
复制代码

main函数也有些长,贴了三次完整的代码,网页都被卡死了,随便贴两端代码做个示例的,其他code只能作为附件上传的.还有相关的数码管,温度传感器的资料也附上,供有需要的小伙伴使用。
975356055f30cec612.png
完成代码的编写,烧录进电路板后,相关功能符合要求。生产了十几套产品,送给客户展示,符合要求了。
这个产品从硬件到软件的设计都不太复杂,在学校也有足够多的时间慢慢琢磨,所以做出来的产品没有出纰漏。但这仅仅是展示样机,还不能算消费的产品,所以有差距的。这里呈现仅仅给大家做一个参考的!



Code.zip

13.77 KB, 下载次数: 72

TM1620.pdf

909.38 KB, 下载次数: 51

数码管资料

NTC 100K 3950 T-V表.rar

273 Bytes, 下载次数: 46

使用特权

评论回复

打赏榜单

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

评分

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

相关帖子

| 2021-3-22 14:52 | 显示全部楼层
不要这样贴代码,很乱 看不清楚的 我记得好像有个选项可以添加后不乱

使用特权

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

使用特权

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

使用特权

评论回复
| 2021-3-22 15:04 | 显示全部楼层
本帖最后由 feihufuture 于 2021-3-22 15:19 编辑

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


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


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


使用特权

评论回复
| 2021-3-22 15:11 | 显示全部楼层
代码帖的非常不专业,一看就是新用户
9094860584330e245d.png

使用特权

评论回复
 楼主 | 2021-3-22 15:24 | 显示全部楼层
帖子中的代码是一个示例,详细的在附件中都包含了

使用特权

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

使用特权

评论回复
| 2021-3-23 19:46 | 显示全部楼层
谢谢楼主无私分享!

使用特权

评论回复
 楼主 | 2021-3-23 20:36 | 显示全部楼层
lvyunhua 发表于 2021-3-22 16:52
谢谢楼主的分享,个人感觉二姨家的外包平台,竞争还是很大,发包的少,接包的很多,有的是公司,还有的是团 ...

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

使用特权

评论回复
| 2021-3-30 08:37 | 显示全部楼层
不错,就是可以把原理图以PDF的格式共享一下。

使用特权

评论回复
| 2021-4-12 15:15 | 显示全部楼层
能不能发原理图和PCB参考一下下呀?

使用特权

评论回复
 楼主 | 2021-4-12 15:22 | 显示全部楼层
xqq123 发表于 2021-4-12 15:15
能不能发原理图和PCB参考一下下呀?

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

使用特权

评论回复
| 2021-4-12 15:34 | 显示全部楼层
kk的回忆 发表于 2021-4-12 15:22
PCB找不到了,是以前很老的AD软件画的,电脑重装系统,就只留下PDF版本了

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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
返回列表 发新帖 本帖赏金 110.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表