基于STM32温控系统的设计概述

基于STM32温控系统的设计

一、系统功能描述

利用STM32系列芯片,作为本温控系统的主控芯片。同过RS232通信协议实现下位机与计算机的通信,通过XTR105和PT100铂热电阻组合转化为稳定的模拟信号量,然后通过AD7705将模拟量转变为数字量输入主控芯片,这样主控芯片通过计算就可以得到当前温度的值。然后,主控芯片经过PID算法,计算出需要输出电流大小,写到MAX538芯片中,该芯片将数字量转化为模拟量输入XTR110,从而得到稳定的电流输出。


二、硬件电路设计

1、硬件电路设计包括PT100铂电阻的信号调理电路、AD7705的使用、MAX538的使用、XTR110的使用。其中AD、DA的使用按照芯片说明书,    连接电路,并配置主控芯片即可。这里仅仅阐述测温的信号调理电路。


根据TI提供的芯片的使用信息,这里实际的测温范围为0-500度,计算出上述电路中的电阻。

2、USB转串口电路设计


选用该芯片的好处:开发电路成熟,开发速度快,尤其是有配套驱动,基本不需在开发对应的驱动程序。

三、软件层的设计

1、 上位机软件开发

需求分析:上位机需要先设置串口通讯的基本参数,然后打开串口,设置温控的参数,设置完成后点击开始温控,最后接受下位机发出来的串口信息。

2、 下位机软件开发

需求分析:下位机需要完成与上位机的通讯,同时当开始温控时还要完成温控功能。下位机采用uC/OSII嵌入式实时操作系统,建立两个任务。


串口通讯任务通过任务解析模块对上位机发出来的指令进行解析,启动温控任务。温控任务将测量出来的温度通过Message的方式把内部的数据发送给串口通讯任务。串口通讯任务在将这些任务发送给上位机。

任务解析模块需要处理的事件有,串口参数设置、温控任务启动、温控任务结束。

3、 PID温度控制算法

参考博客

http://www.cnblogs.com/cj695/p/3276400.html

http://www.cnblogs.com/cj695/p/3274798.html#2758143

Kp可以说是PID算法中必不可少的一个量。没有它控制就不可能实现。它的作用是根据当前量与设定量的差值按照一定比例放大后得到控制量。

//pid.h

#ifndef __PID__

#define __PID__

/*PID = Uk +KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)

函数入口: RK(设定值),CK(实际值),KP,KI,KD

函数出口: U(K)*/

typedef struct PIDValue

{

    int8 KP;

    int8 KI;

    int8 KD;

    int8 F;

    int8 BITMOV;

    int EK[3];

     

    int UK;

    int RK;

    int CK;

    int UK_REAL;

 

}pid_str;

//PIDValueStr  PID;

void    pid_exe(pid_str*PID)  ;

#endif

 

//pid.c

/*PID = PID->UK_REAL +PID->KP*[E(k)-E(k-1)]+PID->KI*E(k)+PID->KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)

函数入口:PID->RK(设定值),PID->CK(实际值),PID->KP,PID->KI,PID->KD

函数出口: U(K)*/

#include"defines.h"

#include"pid.h"

#define MAXOUT 0xff

//#define MAXGAP 100

 

void pid_exe(pid_str*PID)

{

    PID->EK[2]=PID->EK[1];

    PID->EK[1]=PID->EK[0];

    PID->EK[0]=PID->RK-PID->CK;

    PID->UK_REAL=PID->UK_REAL

        +PID->KP*(PID->EK[0]-PID->EK[1])//微分一次后积分即原数

        +(float)PID->KI*PID->EK[0]/PID->F//直接积分

        +(float)PID->KD*(PID->EK[0]-2*PID->EK[1]+PID->EK[2])*PID->F;//二阶微分后积分即一阶微分

    if((PID->UK_REAL>>PID->BITMOV)>=MAXOUT)

    {

        PID->UK=MAXOUT;

    }elseif(PID->UK_REAL>>PID->BITMOV<=-MAXOUT)

    {

        PID->UK=-MAXOUT;

    }else

    {

        PID->UK=PID->UK_REAL>>PID->BITMOV;

    }

         

}

这里我写的代码用到的是增量型的PID(即UK_REAL +PID->KP*[E(k)-E(k-1)]+PID->KI*E(k)+PID->KD*[E(k)-2E(k-1)+E(k-2)];这句话所对应的是pid控制量在之前pid控制量的基础上增加的值,相当于求了一次导)。最终输出的结果将每一次运算的值累加输出就行了。

基于STM32单片机的水控制系统设计通常涉及到温度的采集、处理、显示以及控制执行器件等多个部分。在设计代码时,通常会使用到以下步骤: 1. 初始化硬件:配置STM32的ADC(模数转换器)以读取温度传感器的模拟值,配置GPIO(通用输入输出)引脚用于控制加热器或冷却器,以及配置定时器用于周期性地检查温度。 2. 读取温度传感器数据:通过ADC读取传感器的模拟值,并将其转换为温度值。这通常需要根据传感器的规格书进行适当的校准和转换计算。 3. 控制逻辑:根据读取到的温度值,与设定的目标温度进行比较,并决定是否需要启动加热器或冷却器。这可能涉及到PID控制算法来平滑调节温度变化,避免过冲和振荡。 4. 显示温度值:将当前温度值显示在LCD或其他显示模块上,以便用户观察和调整设定温度。 5. 用户界面:接收用户的输入,如设定温度,以及启动或停止系统的指令。 下面是一个简化的伪代码示例,用于说明基于STM32单片机的水控制系统的代码逻辑: ```c // 初始化硬件模块 void hardware_init() { // 初始化ADC模块 // 初始化GPIO模块 // 初始化定时器模块 // 初始化LCD显示模块 } // 读取温度传感器的函数 float read_temperature() { // 启动ADC转换 // 等待转换完成 // 读取ADC值 // 根据传感器特性转换为温度值 return temperature; } // 控制水的函数 void control_water_temperature() { float current_temperature = read_temperature(); if (current_temperature < target_temperature) { // 如果当前温度低于目标温度,则打开加热器 turn_on_heater(); } else if (current_temperature > target_temperature) { // 如果当前温度高于目标温度,则打开冷却器 turn_on_cooler(); } } int main() { // 硬件初始化 hardware_init(); // 主循环 while(1) { control_water_temperature(); // 显示温度 display_temperature(read_temperature()); // 延时或等待下一个定时器中断 } } ``` 请注意,上述代码是一个非常简化的示例,实际实现时需要根据具体的硬件配置和需求进行详细的编程。STM32的开发通常使用HAL库或者直接操作寄存器,而且在实际应用中可能需要实现更复杂的控制算法和用户交互。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大牛攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值