找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 918|回复: 29
收起左侧

单片机温度控制的逻辑判断代码怎么写?

[复制链接]
ID:72649 发表于 2024-1-24 21:03 | 显示全部楼层 |阅读模式
三个温度参数:1、采集的实时温度temp,2、设置停止温度temp-off, 3、停机后温度降低到temp-on温度开机a、第一次开机,只要温度temp<temp-off  out停止加热;
b、当温度从temp-off降低到temp-on温度开机。
这个代码应该怎么写?
回复

使用道具 举报

ID:731755 发表于 2024-1-24 22:17 来自手机 | 显示全部楼层
PID控制
回复

使用道具 举报

ID:13282 发表于 2024-1-24 23:42 | 显示全部楼层
看你这个需求, 只是三个判断点, 那么设置不同状态的flag值, 然后根据不同的状态值去做对应的逻辑判断即可.
回复

使用道具 举报

ID:72649 发表于 2024-1-25 03:29 来自手机 | 显示全部楼层
xmcolong 发表于 2024-1-24 23:42
看你这个需求, 只是三个判断点, 那么设置不同状态的flag值, 然后根据不同的状态值去做对应的逻辑判断即可.

能不能具体点
回复

使用道具 举报

ID:161164 发表于 2024-1-25 07:53 | 显示全部楼层
temp = Read_Temp();
if(Temp<Temp_On)
{
Out = on;
}
if(Temp>Temp_Off)
{
Out=Off;
}
回复

使用道具 举报

ID:883242 发表于 2024-1-25 10:11 | 显示全部楼层
lkc8210 发表于 2024-1-25 07:53
temp = Read_Temp();
if(TempTemp_Off)
{

没把滞回写出来。
回复

使用道具 举报

ID:13282 发表于 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();      
   }
}

打字好辛苦, 给些黑币呗!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:72649 发表于 2024-1-25 15:32 来自手机 | 显示全部楼层
lkc8210 发表于 2024-1-25 07:53
temp = Read_Temp();
if(TempTemp_Off)
{

如果温度处于Temp-on和Temp-off之间,哪不是不能加温了?
回复

使用道具 举报

ID:883242 发表于 2024-1-25 15:39 | 显示全部楼层
lkc8210 发表于 2024-1-25 07:53
temp = Read_Temp();
if(TempTemp_Off)
{

不对,滞回那部分写错了。
回复

使用道具 举报

ID:1034262 发表于 2024-1-25 16:00 | 显示全部楼层
温度必须PID控制,否则会很难看。除非你要求很低,温度可以飘移很大。
回复

使用道具 举报

ID:161164 发表于 2024-1-25 16:09 | 显示全部楼层
hjx5548 发表于 2024-1-25 15:32
如果温度处于Temp-on和Temp-off之间,哪不是不能加温了?

b、当温度从temp-off降低到temp-on温度开机。
回复

使用道具 举报

ID:72649 发表于 2024-1-25 19:03 | 显示全部楼层
Hephaestus 发表于 2024-1-25 15:39
不对,滞回那部分写错了。

应该怎么写呢?
回复

使用道具 举报

ID:342822 发表于 2024-1-25 19:48 | 显示全部楼层
滞回     加个等待200ms
回复

使用道具 举报

ID:13282 发表于 2024-1-25 23:38 | 显示全部楼层
xmcolong 发表于 2024-1-25 13:43
#include "xxx.h" //看用的什么单片机, 选对应头文件
bit First_On_Flag;      //定义第一次开机标志
bit ...

感谢老大!
回复

使用道具 举报

ID:883242 发表于 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同时成立,单片机不知所措。
你设立个条件让两者不同时成立就行了呗,自己动脑子想。
回复

使用道具 举报

ID:72649 发表于 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;
}
这样可以吗?
回复

使用道具 举报

ID:367624 发表于 2024-1-26 08:33 | 显示全部楼层
这种控制,可以定义两个参数,停止加热温度和回差温度两个参数,当实时温度小于停止加热温度减回差温度时开加热,当实时温度达到停止加热温度时停止加热,很简单的.
回复

使用道具 举报

ID:161164 发表于 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)只会成立其中一个 WhatsApp Image 2024-01-26 at 09.13.17.jpeg

回复

使用道具 举报

ID:72649 发表于 2024-1-26 12:30 来自手机 | 显示全部楼层
xmcolong 发表于 2024-1-25 13:43
#include "xxx.h" //看用的什么单片机, 选对应头文件
bit First_On_Flag;      //定义第一次开机标志
bit ...

单片机STC8H的呢?
回复

使用道具 举报

ID:13282 发表于 2024-1-26 17:22 | 显示全部楼层
hjx5548 发表于 2024-1-26 12:30
单片机STC8H的呢?

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

这个帖子就是你说的STC8的头文件。
回复

使用道具 举报

ID:72649 发表于 2024-1-26 18:54 | 显示全部楼层
lkc8210 发表于 2024-1-26 09:14
???
Temp_Off的值一定会大于Temp_On啊
所以if(TempTemp_Off)只会成立其中一个

处于T_on和T_off之间单片机要怎么处理?
回复

使用道具 举报

ID:72649 发表于 2024-1-26 18:55 | 显示全部楼层

PID对于可控硅可以的,如果是继电器呢?怎么调节?
回复

使用道具 举报

ID:72649 发表于 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;
是不是这样做?
回复

使用道具 举报

ID:883242 发表于 2024-1-26 21:45 | 显示全部楼层
hjx5548 发表于 2024-1-26 18:55
PID对于可控硅可以的,如果是继电器呢?怎么调节?

不做产品纯理论研究可控硅继电器没有区别啊!做具体产品才要考虑继电器动作过于频繁很快就会把机械寿命消耗干净的问题。
回复

使用道具 举报

ID:161164 发表于 2024-1-27 15:14 来自手机 | 显示全部楼层
hjx5548 发表于 2024-1-26 18:54
处于T_on和T_off之间单片机要怎么处理?

Out输出保持,直到越过Temo-off/temp-on
回复

使用道具 举报

ID:72649 发表于 2024-1-29 00:07 | 显示全部楼层
yuan旺仔小馒头 发表于 2024-1-26 08:33
这种控制,可以定义两个参数,停止加热温度和回差温度两个参数,当实时温度小于停止加热温度减回差温度时开 ...

关键是停止温度和开机温度,可以调节显示的?应该怎样处理?
回复

使用道具 举报

ID:883242 发表于 2024-1-30 17:34 | 显示全部楼层
hjx5548 发表于 2024-1-29 00:07
关键是停止温度和开机温度,可以调节显示的?应该怎样处理?

这个已经超过题目范围了,要写一本书才行,你先做,出问题再说。
回复

使用道具 举报

ID:367624 发表于 2024-1-31 08:10 | 显示全部楼层
hjx5548 发表于 2024-1-29 00:07
关键是停止温度和开机温度,可以调节显示的?应该怎样处理?

就设置两个参数就好了,停止温度和回差温度,到停止温度就关,当实时温度小于停止温度减回差就开机(回差一般最小1度)
回复

使用道具 举报

ID:382454 发表于 2024-1-31 10:21 | 显示全部楼层
温度低了,加热,温度高了停止加热。就是温差控制在1-3度之间即可。
回复

使用道具 举报

ID:161164 发表于 2024-1-31 13:09 | 显示全部楼层
hjx5548 发表于 2024-1-29 00:07
关键是停止温度和开机温度,可以调节显示的?应该怎样处理?

用变量啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表