
温控设备1.0
简介
基于stm32的温控设备,带oled,a24c64存储,ch340e串口,tja1050 can通讯,pd12v诱骗等
简介:基于stm32的温控设备,带oled,a24c64存储,ch340e串口,tja1050 can通讯,pd12v诱骗等开源协议
:GPL 3.0
描述
仅供学习,不可商用
本项目是一个基于stm32f103cbt6与FreeRTOS系统的温控设备,用到的外设或者功能有spi oled屏幕、tja1050 can通讯、ch340e串口通讯、五向按键、adc、pid控制pwm输出、iic at24c64存储、ch224k pd12v诱骗、降压。
我这里用了一个3d打印的挤出头作为负载来演示功能,当然做这个项目的目的也主要是为了练习freertos、iic、spi、can等协议的使用。
代码链接
https://github.com/cnxft/Temperature_Control_Equipment/tree/main
一、总体设计框图
电源:
其他:
二、硬件电路组成
1.AT24C64存储部分,芯片和他IIC的上拉
2.12864OLED屏幕的SPI接线
3.pwm控制输出的大小电路
三、程序流程图
在启动freertos的任务调度器之前初始化或启动了以下内容
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&dmaadc, 3);
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_3);
NTC1save_init(ntc1save);
Key_Loading();
userShellInit();
CAN_SetFilters();
HAL_CAN_Start(&hcan);
u8g2Init(&u8g2);
随后oled屏幕上出现进度条,进度条的长度随着从at24c64获取参数的进度增加而增加
本项目用到了FreeRTOS系统,所以整个功能设计起来就比较简单,这里一共用到了7个任务
void AppTask_App(void *argument);
//读取ntc的值并计算
void AppTask_OutPut(void *argument);
//使用pid算法计算输出的pwm波形的占空比
void AppTask_MessSend(void *argument);
//发送can、串口消息、保存数据到at24c64
void AppTask_SerCom(void *argument);
//使用shell_letter开源库
void AppTask_CanCom(void *argument);
//轮询方式can接收消息
void AppTask_Key(void *argument);
//使用multi_button开源库,产生5ms的滴答
void AppTask_Menu(void *argument);
//驱动oled屏幕的程序
1、任务内容
各个任务写在了UserApp下的文件里了大家可以自行查看
2、oled菜单划分
oled屏幕用的b站大佬开源的程序,思路大概是做成链表,可以指向下一级菜单,也可以指向想要做成的界面(函数形式)
简单列写了一个菜单列表
3、u8g2初始化
4、菜单的切换

5、can
6、串口
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), out_state, Shell_OUT, Enable output 1 or 0);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), out_target, Shell_Target, Set target temp double);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), parameter_show, Shell_Parameter_Show, show pid wushen);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), pid_reset, Shell_PID_Reset, pid reset wushen);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), kp_set, Shell_Kp, Set Kp float);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), ki_set, Shell_Ki, Set Ki float);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), kd_set, Shell_Kd, Set Kd float);

7、adc采集
8、输出

9、数据的保存与读取
/****************在AT24C64保存数据的相对地址*******************/
#define DATE_FIRST_ADD 352 // 保存数据的第一个位置
#define Date_OUTSTATE_SUM 0 // 相对初始位置的差值
#define Date_NTCB_SUM 1 // 相对差值1
#define Date_NTCT25_SUM 3
#define Date_NTCMAXADC_SUM 7
#define Date_NTCR1_SUM 11
#define Date_NTCR2_SUM 15
#define Date_VADCMADC_SUM 19
#define Date_VDDA_SUM 21
#define Date_RESH_SUM 25
#define Date_RESL_SUM 29
#define Date_KP_SUM 33
#define Date_KI_SUM 41
#define Date_KD_SUM 49
#define Date_TARGET_SUM 57
#define Date_TIMEDELTA_SUM 65
#define Date_TOTAL_NUM 15
在SaveAndRead_func.c文件中,定义了两个函数:
HAL_StatusTypeDef Date_Init(uint8_t which_one);
HAL_StatusTypeDef Date_Save(uint8_t which_one);
10、进度条
11、问题与反思

四、实物展示
我的焊接顺序:第一步先焊接背面,可以用焊台焊接,第二步焊接芯片和两个type-c接口,确保焊接正确,第三步焊接其他,可用热风枪,但要注意type-c的位置。这一步也可先焊接pd12v诱骗部分,试试效果,成功诱骗灯会亮。再焊接5v转3.3v。最后焊接屏幕和插件。
温度曲线
输出设置(开关,目标温度,风扇的pwm占空比)
设置PID的kp
参数显示
五、演示视频
演示视频在附录中,演示了letter_shell的用法,同时也展示了修改参数和自动保存到at24c64的功能。
设计图

BOM


评论