文章目录
简言:巩固学习,分享思路,欢迎指正。一、整体设计思路二、具体实现流程2.1、所需硬件整理2.1.1 stm32单片机2.1.2 12v锂电池2.1.3 降压模块2.1.4 L298n驱动模块2.1.5 PTC加热片2.1.6 TEC制冷片2.1.7 DS18B20温度感知模块2.1.8 OLED显示屏2.1.9 面包板2.2.0 小部件
2.2、模块接线原理图2.3、主要代码实现2.3.1 main函数2.3.2 pid算法2.3.3 输出比较代码2.3.4 驱动加热片代码2.3.5 驱动制冷片代码
三、系统工作视频总结
简言:巩固学习,分享思路,欢迎指正。
一、整体设计思路
温控系统整体的供电采用12v锂电池并联到面包板上,分别给l298n驱动模块和stm32单片机供电。单片机根据反馈回来的信号结合pid算法控制L298n模块输出不同电压值给ptc加热片和tec制冷片,从而实现制冷和制热的效果。
二、具体实现流程
2.1、所需硬件整理
2.1.1 stm32单片机
stm32最小系统板一个,芯片型号:stm32f103c8t6。网上相关资料非常多这里不多赘述。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d994be14bc2b4a849454cce6bb29967d.jpeg#pic_center)
2.1.2 12v锂电池
系统的整体供电我选择的是12V锂电池,有一个原因是12V并联到面包板上方便直接给L298n驱动模块供电。(大家购买时记得买一个转接头如下图所示,会方便很多) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ebc716d0de204a4a91d651e50ae79b49.jpeg#pic_center)
2.1.3 降压模块
stm32f103c8t6工作电压在2.0到3.6V之间,5v电压也不耐受(由于商家将3.3v降压模块发错成5v,加上我没有用万用表检测,损失一枚芯片)。更不用说是12v电源直接供电了,故还需要一个降压模块。降压模块大家可以选择直接输出3.3v的也可以选择可调式输出的。图片放上 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/27c079c1d55b48b9a98bf9efa08902c2.jpeg#pic_center)
2.1.4 L298n驱动模块
常见的小型车电机驱动模块有两种——TB6612FNG和L298N驱动模块。这里我选择l298n作为驱动模块。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4b96b6abfe09495ab975e8b492128241.jpeg#pic_center)
2.1.5 PTC加热片
这里我选用的是12V,110度的PTC加热片,如图所示。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7c5b3556c61c4746991194de3f6b28e4.jpeg#pic_center)
2.1.6 TEC制冷片
也叫半导体制冷片,具体工作原理不和大家解释,想知道的小伙伴可以去网上搜索,网上讲的肯定比我详细。我是买了一个散装的套件需要自己动手。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dabdccd12a6e4a128f27be669826a940.jpeg#pic_center)
2.1.7 DS18B20温度感知模块
DS18B20温度传感器模块,大家也可以买一个带防水外壳的,我就直接用了最普通的。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2f5aaeace63e4f23a7c28ad9d93680ad.jpeg#pic_center)
2.1.8 OLED显示屏
这里我选用0.96寸四引脚的OLED显示屏。用啥显示屏都是可以的,作用是为了显示实时温度和其他一些数据。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e5a19e3b31174c9d9b8ad9cfd89a4ae9.jpeg#pic_center)
2.1.9 面包板
面包板我选用的是830孔的,我们现在是模块化制作,到后面可以进阶一下,绘制一个PCB,性能会稳定很多。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6d31d93693d949b8a41f63ef8f66f3c4.jpeg#pic_center)
2.2.0 小部件
杜邦线、跳线和按键。按键的购买如图所示即可。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/83ced5753c15430eaadaf0717d3cdaf5.jpeg#pic_center)
2.2、模块接线原理图
正负电源不要接反,接反即冒烟。 (1)stm32f103c8t6最小系统 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/63bc1384cbce441389e73844867538e5.png#pic_center)
(2)L298N电机驱动模块 //注意不要接反 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dcbd523b56d149ffb8f4324f965fd6d0.png#pic_center)
(3)DS18B20温度传感模块
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bb6be1d054ec4acdb763013b3dfbc1e5.png#pic_center)
(4)OLED显示屏 (5)按键 (6)蜂鸣器 其他的一些元器件自己可以任意添加配置,如LED小灯。
2.3、主要代码实现
2.3.1 main函数
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Cooling.h"
#include "Key.h"
#include "Buzzer.h"
#include "DS18B20.h"
#include "PID.h"
#include "PID2.h"
#include "Timer.h"
#include "LED.h"
//所需要的变量声明
uint8_t TEMP;
uint8_t SETTEMP;//目标温度
uint8_t flag100ms;
uint8_t flag500ms;
uint8_t KeyNum; //按键
uint8_t Hot_flag=0;//制热标志位
uint8_t Cool_flag=0;//制冷标志位
//主函数逻辑很简单
int main(void)
{
int8_t Speed;
int8_t Speed2;
uint16_t Temp;
SETTEMP=25;
//一些初始化
Motor_Init();
Cooling_Init();
Key_Init();
Buzzer_Init();
OLED_Init();
DS18B20_UserConfig();
PID_Init();
PID2_Init();
TIM3_Int_Init(10-1,7200);
//oled显示
OLED_ShowString(1, 1, "Speed:");//占空比显示
OLED_ShowString(2, 1,"Temp:");//实时温度
OLED_ShowString(3, 1,"Mode:");//工作模式
OLED_ShowString(4, 1,"SetTp:");//目标温度
while(1)
{
KeyNum=Key_GetNum();
if(KeyNum==2)
{
SETTEMP+=5;
if(SETTEMP>50)//这边可以根据你的加热片功率和幅值改变,这里我随便设置了一个
SETTEMP=25;
Hot_flag=1;
}
if(KeyNum==1)
{
SETTEMP-=5;
if(SETTEMP37||TEMPpid.Actual)
pid.err = pid.Set - pid.Actual; //实际温度与目标温度之间的差值
//else
//pid.err = pid.Actual - pid.Set;
pid.integral = pid.integral + pid.err;
pid.voltage = pid.Kp*pid.err //设定值与实际的偏差
+ pid.Ki*pid.integral/1000 //历史累计偏差
+ pid.Kd*(pid.err-pid.err_last); //前一次误差与此次为误差
pid.err_last = pid.err;
t=pid.voltage;
//限幅
if(t>99) t=99;
else if(tpid.Actual)
pid2.err = pid2.Set - pid2.Actual; //实际温度与目标温度之间的差值
//else
//pid.err = pid.Actual - pid.Set;
pid2.integral = pid2.integral + pid2.err;
//OLED_ShowSignedNum(4,6,pid2.integral,5);
pid2.voltage = pid2.Kp*pid2.err //设定值与实际的偏差
+ pid2.Ki*pid2.integral/1000 //历史累计偏差
+ pid2.Kd*(pid2.err-pid2.err_last); //前一次误差与此次为误差
pid2.err_last = pid2.err;
t=pid2.voltage;
//限幅
if(t>99) t=99;
else if(t=0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
PWM_SetCompare3(Speed);
}
}
2.3.5 驱动制冷片代码
#include "stm32f10x.h" // Device header
#include "PWM.h"
void Cooling_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
PWM_Init();
}
void Cooling_SetSpeed(int8_t Speed){
if(Speed>=0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
PWM_SetCompare4(Speed);
}
}
这里给出本项目的核心代码,未给出的代码部分根据需求可自行编写。
三、系统工作视频
基于STM32单片机的温控系统(PID算法)
总结
温控系统的调参和温度控制效果可通过上位机实现。整体设计实现相对简单。但其中蕴含的知识和原理十分值得学习。若有错误,欢迎大家指正。
|