产品目的:
解决搅拌机食材粘壁问题。
产品功能及需求分析:
需求分析及实现可能性:
从项目需求看,该项目要实现的功能并不复杂,控制电机的正反转及对应LED显示即可,同时也没必要控制电机转速,不过由于是锂电产品,所以还要考虑充电和低功耗问题以及产品均需要注意的安全性问题。
1.锂电池:
从电机特性表中得到负载电流也不大,但仍需考虑启动时电流会稍大,所以选择18650锂电池时要对其输出电流能力留有一定余量,一般除了看电池容量外,还需要看其标准充放电,最大充放电参数。
2.充电设计:
TYPE-C充电口,本来应设计成兼容各类TYPE-C适配器,但由于项目进度较赶,若设计成TYPE-C标准的话除了需要加协议诱导芯片外,还要MCU对不同适配器所能输出的最大功率进行调整,所以经过商议后决定直接买现成的带TYPE-C口的15V/2A输出适配器;
三串锂电池满电电压约为12.6V,由于考虑使用DC-DC降压方案,所以电池管理芯片选择了如韵公司的CN3763芯片;
3.电机正反转:
可以使用分立元件搭H桥电路来实现,但是程序方面就要进行死区保护,防止上下管直通烧毁,也可以直接使用电机专用IC,其内部基本都会加入过热保护、过流保护、短路保护及死区保护等,该项目我选择了RZ7886对电机进行控制;
4.电量显示:
通过一个红蓝双色LED灯显示电量情况,锂电池充电情况可以通过电池管理芯片CN3763的CHRG和DONE脚状态来进行是否充满电的判断;而当产品进行工作时,需要通过MCU的ADC功能来检测电池电压判断电量情况,一般单节锂电池的电量判断低于3V时则为低电量,电池电量检测电路如下:
分别对3串,2串,单节锂电池的电量进行测量,通过相减便可以分别得出3节锂电池的电量,同时使用三极管在产品处于充电或工作状态时才打开电量检测,可以缩小产品待机休眠时的功耗。
5.锂电池产品的低功耗及安规设计
对于锂电池产品,我们公司的功耗要求为待机时小于20uA,实测产品的待机功耗为11uA:
低功耗的关键点在于硬件电路耗电的地方在满足正常工作条件的情况下电阻值尽量选大,或者使用三极管、MOS管对其进行控制;在MCU方面在休眠前将无关的IO引脚置为高阻输入。
锂电池产品一般要对电池充放电做双重保护,保护方案包括:电池充电管理芯片(BMS)、电池保护IC、过流保护保险丝、NTC监测锂电池温度等。
开发环境:
硬件电路绘制:立创eda(标准版)
软件程序:STM32CUBEMX、Keil-arm
开发过程:
1.使用立创EDA进行原理图绘制:
部分功能电路介绍:
这里的作用是当有充电插入时,通过该电路能实现对IO口过压保护的同时,消除部分触发干扰,也能将外部中断的触发边沿延长使单片机能稳定读取到外部中断源。
该电路位于电池充电管理芯片之前,用于在充电时若检测到电池异常情况(过热、过充)时,而充电管理芯片不起作用时,可以关断充电,实现双重充电保护的作用。
该电路用于在电池过放之后,充电时由于锂电池已经不够电量支持单片机工作时使用,此时接入充电,VBUS会直接到达LDO处稳压后供MCU工作,而又不至于直接倒灌入电池正极VBAT+。而在正常工作时,VBAT+又因为D1二极管的存在不会流入VBUS,而是正常的流向LDO稳压后供MCU工作。
此电路为采用NTC+MCU的ADC功能实现温度的监测,监测时将NTC紧贴锂电池才可测量出锂电池的真实温度,我一般设置在超过60℃则禁止其充放电。
此电路为使用RZ7886实现的电机正反转驱动电路,同时在芯片的接地端接入100mΩ电流采样电阻作为多一重的堵转过流保护。其原理为当电机工作电流为1A时,会有1A电流通过芯片流入采样电阻到地,此时在电阻上就会产生100mV的压降,通过MCU的ADC读取到100mV的电压则可以反推出来此时电机的工作电流为1A。
此部分作为调试或维修PCB板时断开锂电池连接使用,由于产品化后拆卸锂电池较为麻烦,而又要对电路进行断电,防止焊接时短路锂电池,一般锂电池产品的电路板上都会画为锯齿状,这样焊接时更容易直接用焊锡连接上跳线处,实物如下:
2.PCB绘制
PCB的尺寸和固定孔一般由公司的结构部门提供,我们只需让其提供对应的DXF格式文件,我们在将其导入到立创EDA的边框层即可,如下:
最后完成元器件的布局及走线等,标注好版本日期丝印等,就可完成PCB的绘制了:
同时立创EDA也支持3D模型的查看,让我们看一下到时候的成品PCBA大致样子吧:
此时可以将该3D模型输出为obj格式(立创EDA专业版支持输出step格式)供结构部门进行板子尺寸及元器件位置的比对,看是否合适其制作的产品外壳。
3.PCB板打样下单及元器件购买
在结构部门确认好3D模型没问题之后,这边也就可以检查DRC后就开始PCB板的打样了;PCB打样下单成功后紧接着就要对着原理图查找是否有公司元件仓缺失的元件,有的话就要及时下单购买,防止板子回来之后却元器件影响项目进度。
4.使用STM32CUBEMX搭建程序框架
一般PCB板打样不加急的话时间大概为3天左右,在这段等待的时间内,也不能无所事事,可以先进行程序框架的搭建。
对着原理图将各部分外设配置好,配置好时钟树等等:
在生成工程的时候,记得勾选Set all free pins as analog,可以将没有配置功能的IO口置为高阻态降低功耗。
5.样板焊接
等PCB样板及元器件都送到后,就可以焊接样板了,这里没什么好写的,拿起烙铁直接动手就行,成品如下图:
6.程序编写
首先新建一个.h头文件,将所有输入输出IO口的操作进行重新定义,这样进行程序工作逻辑编写时才不容易乱:
#ifndef __centre_ctrl_H
#define __centre_ctrl_H
#include "stm32f1xx.h"
#include "main.h"
#include "stdbool.h"
enum mode
{
stop=0,
cw_work=1,
ccw_work=2,
cw=3,
ccw=4,
charing=5,
re_stop=6
};
enum CE
{
off=0,
on=1
};
#define LED_CW_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET)
#define LED_CW_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET)
#define LED_CCW_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET)
#define LED_CCW_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET)
#define LED_BAT_RED_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,GPIO_PIN_RESET)
#define LED_BAT_RED_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,GPIO_PIN_SET)
#define LED_BAT_BLUE_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET)
#define LED_BAT_BLUE_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET)
#define motor_BI_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET)
#define motor_BI_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET)
#define motor_FI_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)
#define motor_FI_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)
#define charge_CE_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET)
#define charge_CE_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)
#define NTC_VC_ON HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET)
#define NTC_VC_OFF HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET)
#define VC3_ON HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET)
#define VC3_OFF HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET)
#define VC2_ON HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET)
#define VC2_OFF HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)
#define VC1_ON HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET)
#define VC1_OFF HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)
#define CW_key HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)
#define CCW_key HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12