标题: 单片机温度控制的逻辑判断代码怎么写? [打印本页]

作者: hjx5548    时间: 2024-1-24 21:03
标题: 单片机温度控制的逻辑判断代码怎么写?
三个温度参数:1、采集的实时温度temp,2、设置停止温度temp-off, 3、停机后温度降低到temp-on温度开机a、第一次开机,只要温度temp<temp-off  out停止加热;
b、当温度从temp-off降低到temp-on温度开机。
这个代码应该怎么写?

作者: 13872888583    时间: 2024-1-24 22:17
PID控制
作者: xmcolong    时间: 2024-1-24 23:42
看你这个需求, 只是三个判断点, 那么设置不同状态的flag值, 然后根据不同的状态值去做对应的逻辑判断即可.
作者: hjx5548    时间: 2024-1-25 03:29
xmcolong 发表于 2024-1-24 23:42
看你这个需求, 只是三个判断点, 那么设置不同状态的flag值, 然后根据不同的状态值去做对应的逻辑判断即可.

能不能具体点
作者: lkc8210    时间: 2024-1-25 07:53
temp = Read_Temp();
if(Temp<Temp_On)
{
Out = on;
}
if(Temp>Temp_Off)
{
Out=Off;
}
作者: Hephaestus    时间: 2024-1-25 10:11
lkc8210 发表于 2024-1-25 07:53
temp = Read_Temp();
if(TempTemp_Off)
{

没把滞回写出来。
作者: xmcolong    时间: 2024-1-25 13:43
#include "xxx.h" //看用的什么单片机, 选对应头文件
bit First_On_Flag;      //定义第一次开机标志
bit HeatOnOff_Flag;  //定义加热开关标志
unsigned char Temp,num; //定义全局变量temp,mode
define Temp_On 60;   //设置打开加热温度值为60
define Temp_Off 80;  //设置关闭加热温度值为80
//函数声明
void Read_Temp(); //温度读取函数
void Memory_Write(unsigned char Addr,unsigned int Value); //向地址Addr 写入数据Value
unsigned char Memory_Read(unsigned char Addr) //读地址Addr 的数据
void main(void)
{
//各种初始化函数;
First_On_Flag=0;
HeatOnOff_Flag=0;

while(1)
{
   Temp = Read_Temp();  //读取当前温度值

   mode= Memory_Read(0x20); //读取0x20数据到mode
  if(mode==0) //注意: 有些新的MCU没有写过的是0, 有的要用null
  {
      Memory_Write(0x20,10); //向地址20写入10
  }
  if((Temp<Temp_Off)&&(Temp>Temp_On)&&(num==10)) //温度低于temp_off 且 第一次开机
   {
         HeatOff(); //停止加热
   }
   if(Temp<Temp_On)
   {
        HeatOn();
        Memory_Write(20,11); //向地址20写入11, 这样再次开机后上面那个if将不再被执行
   }
   if(Temp>Temp_Off)
   {      
         HeatOff();      
   }
}

打字好辛苦, 给些黑币呗!
作者: hjx5548    时间: 2024-1-25 15:32
lkc8210 发表于 2024-1-25 07:53
temp = Read_Temp();
if(TempTemp_Off)
{

如果温度处于Temp-on和Temp-off之间,哪不是不能加温了?
作者: Hephaestus    时间: 2024-1-25 15:39
lkc8210 发表于 2024-1-25 07:53
temp = Read_Temp();
if(TempTemp_Off)
{

不对,滞回那部分写错了。
作者: coody_sz    时间: 2024-1-25 16:00
温度必须PID控制,否则会很难看。除非你要求很低,温度可以飘移很大。
作者: lkc8210    时间: 2024-1-25 16:09
hjx5548 发表于 2024-1-25 15:32
如果温度处于Temp-on和Temp-off之间,哪不是不能加温了?

b、当温度从temp-off降低到temp-on温度开机。
作者: hjx5548    时间: 2024-1-25 19:03
Hephaestus 发表于 2024-1-25 15:39
不对,滞回那部分写错了。

应该怎么写呢?
作者: taotie    时间: 2024-1-25 19:48
滞回     加个等待200ms
作者: xmcolong    时间: 2024-1-25 23:38
xmcolong 发表于 2024-1-25 13:43
#include "xxx.h" //看用的什么单片机, 选对应头文件
bit First_On_Flag;      //定义第一次开机标志
bit ...

感谢老大!
作者: Hephaestus    时间: 2024-1-26 01:53
hjx5548 发表于 2024-1-25 19:03
应该怎么写呢?

就拿5楼代码练手
  1. temp = Read_Temp();
  2. if(Temp<Temp_On)
  3. {
  4. Out = on;
  5. }
  6. if(Temp>Temp_Off)
  7. {
  8. Out=Off;
  9. }
复制代码

因为你是滞回控制,那么temp_on>temp_off,所以上面两个if同时成立,单片机不知所措。
你设立个条件让两者不同时成立就行了呗,自己动脑子想。
作者: hjx5548    时间: 2024-1-26 07:04
Hephaestus 发表于 2024-1-26 01:53
就拿5楼代码练手

因为你是滞回控制,那么temp_on>temp_off,所以上面两个if同时成立,单片机不知所措 ...

temp = Read_Temp();
if(Temp<Temp_On)
{
Out = on;
}
else if(Temp>Temp_Off)
{
Out=Off;
}
这样可以吗?
作者: yuan旺仔小馒头    时间: 2024-1-26 08:33
这种控制,可以定义两个参数,停止加热温度和回差温度两个参数,当实时温度小于停止加热温度减回差温度时开加热,当实时温度达到停止加热温度时停止加热,很简单的.
作者: lkc8210    时间: 2024-1-26 09:14
Hephaestus 发表于 2024-1-26 01:53
就拿5楼代码练手

因为你是滞回控制,那么temp_on>temp_off,所以上面两个if同时成立,单片机不知所措 ...

???
Temp_Off的值一定会大于Temp_On啊
所以if(Temp<Temp_On)和if(Temp>Temp_Off)只会成立其中一个


作者: hjx5548    时间: 2024-1-26 12:30
xmcolong 发表于 2024-1-25 13:43
#include "xxx.h" //看用的什么单片机, 选对应头文件
bit First_On_Flag;      //定义第一次开机标志
bit ...

单片机STC8H的呢?
作者: xmcolong    时间: 2024-1-26 17:22
hjx5548 发表于 2024-1-26 12:30
单片机STC8H的呢?

http://www.51hei.com/bbs/dpj-131249-1.html

这个帖子就是你说的STC8的头文件。
作者: hjx5548    时间: 2024-1-26 18:54
lkc8210 发表于 2024-1-26 09:14
???
Temp_Off的值一定会大于Temp_On啊
所以if(TempTemp_Off)只会成立其中一个

处于T_on和T_off之间单片机要怎么处理?
作者: hjx5548    时间: 2024-1-26 18:55
13872888583 发表于 2024-1-24 22:17
PID控制

PID对于可控硅可以的,如果是继电器呢?怎么调节?
作者: hjx5548    时间: 2024-1-26 19:00
xmcolong 发表于 2024-1-24 23:42
看你这个需求, 只是三个判断点, 那么设置不同状态的flag值, 然后根据不同的状态值去做对应的逻辑判断即可.

if(T_on<temp)
flag=1;
if(T_off>temp)
flag=2;
if(T_on>temp)&&(T_off<temp)
flag=3;
是不是这样做?
作者: Hephaestus    时间: 2024-1-26 21:45
hjx5548 发表于 2024-1-26 18:55
PID对于可控硅可以的,如果是继电器呢?怎么调节?

不做产品纯理论研究可控硅继电器没有区别啊!做具体产品才要考虑继电器动作过于频繁很快就会把机械寿命消耗干净的问题。
作者: lkc8210    时间: 2024-1-27 15:14
hjx5548 发表于 2024-1-26 18:54
处于T_on和T_off之间单片机要怎么处理?

Out输出保持,直到越过Temo-off/temp-on
作者: hjx5548    时间: 2024-1-29 00:07
yuan旺仔小馒头 发表于 2024-1-26 08:33
这种控制,可以定义两个参数,停止加热温度和回差温度两个参数,当实时温度小于停止加热温度减回差温度时开 ...

关键是停止温度和开机温度,可以调节显示的?应该怎样处理?
作者: Hephaestus    时间: 2024-1-30 17:34
hjx5548 发表于 2024-1-29 00:07
关键是停止温度和开机温度,可以调节显示的?应该怎样处理?

这个已经超过题目范围了,要写一本书才行,你先做,出问题再说。
作者: yuan旺仔小馒头    时间: 2024-1-31 08:10
hjx5548 发表于 2024-1-29 00:07
关键是停止温度和开机温度,可以调节显示的?应该怎样处理?

就设置两个参数就好了,停止温度和回差温度,到停止温度就关,当实时温度小于停止温度减回差就开机(回差一般最小1度)
作者: univers    时间: 2024-1-31 10:21
温度低了,加热,温度高了停止加热。就是温差控制在1-3度之间即可。
作者: lkc8210    时间: 2024-1-31 13:09
hjx5548 发表于 2024-1-29 00:07
关键是停止温度和开机温度,可以调节显示的?应该怎样处理?

用变量啊




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1