STM32电子实战项目(一)记录:BLDC kitchen prep centre

在这里插入图片描述

产品目的:

解决搅拌机食材粘壁问题。

产品功能及需求分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需求分析及实现可能性:

从项目需求看,该项目要实现的功能并不复杂,控制电机的正反转及对应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
### STM32实战项目示例 #### 使用MDK进行STM32开发的优势与挑战 对于初学者而言,使用MDK进行STM32开发具有较低的学习门槛[^1]。然而,由于缺乏图形化配置工具和自动代码生成功能,开发者需要手动编写初始化代码,这对深入理解底层机制非常有益。 #### 基于STM32的摄像头图像采集实例 个典型的实战项目涉及利用STM32微控制器完成摄像头图像采集功能。此项目的实施流程包括但不限于摄像头模块选型、硬件电路设计、软件环境搭建以及核心算法实现[^2]。具体来说: - **硬件部分** 需要选择合适的摄像头模块并与STM32建立通信接口(如I2C或SPI)。同时,确保电源供应稳定并满足信号完整性要求。 - **软件部分** 开发环境中需配置GPIO引脚、时钟树及时序参数,并加载驱动程序来控制外设工作状态。以下是简化版的初始化函数: ```c void Camera_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 /* 配置PA8作为输出 */ GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` #### 图像处理基础操作 基于上述采集的数据流,可进步执行多种图像预处理技术以提取有用特征[^3]。下面列举几个常见方法及其对应源码片段: - **灰度转换** 将彩色像素映射至单通道亮度值以便后续计算效率提升。 ```c uint8_t RGB_to_Gray(uint8_t R, uint8_t G, uint8_t B){ return (R * 77 + G * 151 + B * 28) >> 8; // 加权平均法近似Luminance } ``` - **高斯滤波降噪** 应用卷积核平滑随机噪声干扰项从而改善视觉质量。 ```c #define GAUSSIAN_KERNEL_SIZE 3 float Gaussian_Kernel[GAUSSIAN_KERNEL_SIZE][GAUSSIAN_KERNEL_SIZE]={ {1/16.0f, 2/16.0f, 1/16.0f}, {2/16.0f, 4/16.0f, 2/16.0f}, {1/16.0f, 2/16.0f, 1/16.0f}}; // 卷积运算逻辑省略... ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值