NXP公司LPC21XX+PID实现稳定温度控制

news2024/11/26 8:46:47

本例使用的是LPC21XX系列芯片提供的PWM功能实现稳定的温度控制。首先我们获得当前环境温度之后,再用设定的温度与当前温度相减,通过PID算法计算出当前输出脉宽,并将其输出到L298N模块中,使加热丝发热,形成闭环,经过一段时间温度稳定在预设值。

概念说明

  • PWM:PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM输出的是周期信号,其中PWM频率指的是1秒内PWM的周期次数,占空比指的是一个脉冲周期内,高电平的时间与整个周期时间的比例。PWM可通过其不同的占空比配置来实现LED呼吸灯,电机转速等应用:

  •  PID算法:就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种常见的“保持稳定”控制算法,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正,是工业应用中最广泛算法之一。PID算法主要涉及三个最基本的参数,最终PID输出值是三部分调节增益之和Pout+Iout+Dout:
    • Kp比例增益:已知当前环境温度与用户设定值之间的差值Ek,Kp与Ek在Pout的计算中为乘法关系,其大小将直接影响系统的响应速度
    • Kd微分增益:两次差值之差E_{k}-E_{k-1}可表示Dk,Kd与Dk也是乘法关系,其作用有让其"变化速度"趋于0,即类似"阻尼"的作用。
    • Ki积分增益:Ki积分控制考虑过去误差,将误差值过去一段时间之和(误差和)乘以一个正值的常数Ki,其作用是减小静态情况下的误差,让受控物理量尽可能接近目标值。

  •  L298N:L298N是意法半导体集团旗下量产的一种电机驱动芯片,拥有工作电压高、输出电流大、驱动能力强、发热量低、抗干扰能力强等特点,通常用来驱动继电器、螺线管、电磁阀、直流电机以及步进电机。本例我们用来驱动一个加热丝来进行发热。

实现原理

嵌入式代码运行在LPC21XX系列芯片平台上,使用平台提供的PWM通道进行控制信号输出,实现原理如下图所示:


嵌入式程序

LPC21XX平台使用PWM功能涉及的步骤如下:

  1. 首先是配置 PLL以生成时钟,因为它根据程序员的需要设置 LPC2148 的系统时钟和外设时钟。LPC2148 的最大时钟频率为 60Mhz。
  2. 接下来是使用 PINSEL 寄存器选择 LPC2148 的 PWM 引脚和 PWM 功能。我们使用 PINSEL0,因为我们使用 P0.0 作为 LPC2148 的 PWM 输出。
  3. 接下来我们需要使用 PWMTCR(定时器控制寄存器)重置定时器,然后,设置决定 PWM 分辨率的预分频值。我将它设置为零。
  4. 接下来我们需要设置 PWMMCR(PWM 匹配控制寄存器),因为它设置了复位等操作,PWMMR0 的中断。
  5. 使用 PWMMR 设置 PWM 通道的最大周期。
  6. 接下来我们需要使用 PWMLER 将 Latch Enable 设置为相应的匹配寄存器。
  7. 要使 PWM 输出到引脚,我们需要使用 PWMTCR 来启用 PWM 定时器计数器和 PWM 模式。

代码如下,提供UpdatePWMDutyRatio接口可以实时调整占空比:

#include <lpc214x.h> 
#include <stdint.h>
#include <string.h>

unsigned int PWMvalue=0;

void initilizePLL(void);
void initilizePWM(unsigned int periodPWM);
void delaytime(uint16_t j);
void UpdatePWMDutyRatio();

void initilizePLL (void)     //Function to use PLL for clock generation
{

  PLL0CON = 0x01;           
  PLL0CFG = 0x24;
  PLL0FEED = 0xAA;
  PLL0FEED = 0x55;
  while(!(PLL0STAT & 0x00000400));
  PLL0CON = 0x03;
  PLL0FEED = 0xAA;
  PLL0FEED = 0x55;
  VPBDIV = 0x01;

} 

void delaytime(uint16_t j)      // fucntion to generate 1 milisecond delay

{
    uint16_t x,i;

    for(i=0;i<j;i++)
    {

        for(x=0; x<6000; x++);    
    }

}

void initilizePWM(unsigned int PWMvalue)        

{

  PINSEL0 = 0x00000002;         //Setting pin P0.0 for PWM output
  PWMTCR = (1<<1);              //Setting PWM Timer Control Register as counter reset
  PWMPR = 0X00;                 //Setting PWM prescale value
  PWMMCR = (1<<0)|(1<<1);       //Setting PWM Match Control Register
  PWMMR0 = PWMvalue;            //Giving PWM value Maximum value
  PWMLER = (1<<0);              //Enalbe PWM latch
  PWMTCR = (1<<0) | (1<<3);     //Enabling PWM and PWM counter

}
void UpdatePWMDutyRatio()
{
    PWMTCR = ~((1<<0) | (1<<3));     //Disable PWM and PWM counter
    PWMMR0 = PWMvalue;               //Giving PWM value 
    PWMTCR = (1<<0) | (1<<3);        //Enabling PWM and PWM counter
    
}

PID.h文件内是PID算法因子结构体定义,代码就不再往这里贴了。下面是PID算法实现的代码,代码中用中文帮助您理解:

#include "PID.h"

PID pid;
void PID_Init()
{
  	pid.Sv=38;//用户设定温度
	pid.Kp=30;
	pid.T=400;//PID计算周期
  	pid.Ti=4000000;//积分时间
	pid.Td=1000;//微分时间
	pid.pwmcycle=200;//pwm周期200
	pid.OUT0=1;
	pid.C1ms=0;
}
void PID_Calc()  //pid计算
{
 	float DelEk;
	float ti,ki;
	float td;
	float kd;
	float out;
 	if(pid.C1ms<(pid.T))  //计算周期未到
 	{
    	return ;
 	} 
 	pid.Ek=pid.Sv-pid.Pv;   //得到当前的偏差值
 	pid.Pout=pid.Kp*pid.Ek;      //比例输出
 	pid.SEk+=pid.Ek;        //历史偏差总和
 	DelEk=pid.Ek-pid.Ek_1;  //最近两次偏差之差
 	ti=pid.T/pid.Ti;
 	ki=ti*pid.Kp;
  	pid.Iout=ki*pid.SEk;  //积分输出
 	td=pid.Td/pid.T;
 	kd=pid.Kp*td;
  	pid.Dout=kd*DelEk;    //微分输出
 	out= pid.Pout+ pid.Iout+ pid.Dout;
 
 	if(out>pid.pwmcycle)
 	{
  		pid.OUT=pid.pwmcycle;
 	}
 	else if(out<=0)
 	{
			pid.OUT=pid.OUT0; 
 	}
 	else 
 	{
  		pid.OUT=out;
 	}
 	pid.Ek_1=pid.Ek;  //更新偏差
 	pid.C1ms=0;
}

下面是此例的main函数,通过上面封装的接口对温度进行控制,稳定的达到目标温度:

#include "PID.h"
#include "PWMOUT.h"

exyern unsigned int PWMvalue;

#define PERIOD    400


int main() 
{
	unsigned int num=0;
    PID_Init();
    initilizePLL(); 

	while(1)
	{
		while(获取当前温度,赋值到pid.pv中);
		PID_Calc();//计算PID的值
		num=(((pid.OUT*PERIOD)/pid.pwmcycle)-1);//获取当前的PWM脉冲占空比
		PWMvalue=num;
        UpdatePWMDutyRatio();                                                                                                                                                                              
	}       
}

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java核心技术 卷1-总结-18

Java核心技术 卷1-总结-18 同步Volatile域final变量原子性死锁线程局部变量锁测试与超时读/写锁 同步 Volatile域 多处理器的计算机能够暂时在寄存器或本地内存缓冲区中保存内存中的值。结果是&#xff0c;运行在不同处理器上的线程可能在同一个内存位置取到不同的值。编译器…

建仓价和持仓价的应用:如何开仓如何持仓

建仓、持仓&#xff0c;是交易中绕不开的话题&#xff0c;没有建仓、持仓&#xff0c;何来建仓价、持仓价呢&#xff1f;所以这也是基础问题。不过作为市场形式的表现来说&#xff0c;建仓、持仓到后来的平仓贯彻始终&#xff0c;虽然是基础问题&#xff0c;也是后面登堂入室、…

【图数据库实践教程】Ubuntu22.04-Neo4j中文版安装及导入owl文件(通用教程)

文章目录 0. 环境准备0.1 静态配置IP&#xff1a;192.168.1.54&#xff0c;及网卡类型&#xff1a;NAT模式0.2 激活root用户&#xff1a;0.3 更改apt国内镜像源&#xff08;下载快&#xff09;0.4 关闭相关防火墙等保证网络顺畅 1. 相关软件安装1.1 安装好服务器内的相关软件1.…

FL Studio2023中文版数字音频工作站(DAW)软件

FL Studio21水果软件能支持制作各种音乐类型&#xff0c;除了最擅长的电子音乐&#xff0c;还可以任意创作流行音乐、古典音乐、民族音乐、乡村音乐、爵士乐等等&#xff0c;没有音乐类型的限制&#xff0c;让你的音乐突破想象力的限制。 FL Studio 2023中文版是数字音频工作站…

LINUX的系统管理与维护命令

文章目录 一、LINUX的系统管理与维护命令总结 一、LINUX的系统管理与维护命令 - Linux ls命令:显示指定工作目录下的内容 Linux pwd命令:显示当前工作目录 Linux cd命令:切换工作目录 Linux date命令:显示或设置系统时间 Linux su命令:切换用户 Linux clear命令:清除屏幕 Li…

5种简单快速的方法解除PDF文件密码保护

PDF 文件已经成为了我们日常工作、学习中广泛使用的文档格式之一。为了对重要的 PDF 文件进行保护&#xff0c;我们有时需要添加密码保护功能来防止未授权访问或修改。但是&#xff0c;如果您的 PDF 文件已经有了密码保护&#xff0c;而您需要快速访问和编辑它们&#xff0c;那…

机器人工程师与孔乙己文学

本文内容严格按创作模板发布&#xff1a; 孔乙已是鲁迅笔下人物&#xff0c;穷困流倒还穿着象征读书人的长衫&#xff0c;迁腐、麻木。最近&#xff0c;大家自我调佩是“当代孔乙己”&#xff0c;学历成为思想负担&#xff0c;找工作时高不成低不就。你可以从以下几个角度说说…

static_cast、dynamic_cast和reinterpret_cast区别和联系

其实网上相关的资料不少&#xff0c;但是能够说清楚明白这个问题的也不多。 于是&#xff0c;我尝试着问了一下AI&#xff0c;感觉回答还可以&#xff0c;但是需要更多的资料验证。 让我们先看看AI是怎么回答这个问题的。 static_cast、dynamic_cast和reinterpret_cast都是C中…

“SCSA-T学习导图+”系列:路由技术之OSPF入门

本期引言&#xff1a; 路由技术是网络环境中&#xff0c;为不同的节点传输数据提供传输路径的技术&#xff0c;企业网络的拓扑一般会比较复杂&#xff0c;不同的部门或者总部和分支可能处于不同的网段中&#xff0c;此时就需要使用路由协议来连接不同的网段&#xff0c;实现数…

Parker机电产品(运动控制/伺服电机/直线电机)在FPD行业应用

Parker新控制器-PAC PAC集高级逻辑控制&#xff0c;多轴运动&#xff0c;信号处理和webpublished可视化功能。 采用工业主流的EtherCAT运动控制协议&#xff0c;I/O扩展和第三方设备链接&#xff0c;结合应用开发软件PARKERAutomation Manager &#xff0c; PAC能为OEM需要的…

微信仿真平台的设计和实现(设计+源码)_kaic

摘要 现如今&#xff0c;科技的发展带动着环保方式的更新&#xff0c;Internet是一个不断的开展和不停的扩充数据潮流&#xff0c;有了它&#xff0c;我们可以快速、容易地在世界的任何角落进行沟通&#xff0c;获取更多的信息与资料。Internet可以提供大量信息资源和文案数据库…

临近五一,游玩地点想好了吗,Python帮你查找旅游景点的详细数据

前言 好不容易没有了疫情&#xff0c;三年整整三年&#xff0c;都要把我憋死了&#xff0c;想到去年暑假的时候&#xff0c;准备去厦门&#xff0c;攻略做好了&#xff0c;厦门疫情来了&#xff0c;想着转去济南也是这样&#xff0c;去三亚&#xff0c;结果收到好几万人都被留…

5G网络切片路由选择策略介绍

终端保存的NSSP(Network Slice Selection Policy)策略来源于网络侧。 NSSP规则是将应用程序匹配到S-NSSAI(Single network slice selection assistance information),并将应用程序绑定到现有PDU会话或发起新的PDU会话。 NSSP功能 NSSP的作用就是为应用程序选择S-NSSAI和…

HashMap如何解决哈希冲突

HashMap如何解决哈希冲突 Hash算法和Hash表Hash冲突解决哈希冲突的方法开放地址法链式寻址法再hash法建立公共溢出区 Hash算法和Hash表 Hash算法就是把任意长度的输入通过散列算法编程固定长度的输出。这个输出结果就是一个散列值。 Hash表又称为“散列表”&#xff0c;它是通…

LVS负载均衡群集部署——DR直接路由

目录 一、LVS-DR模式二、LVS-DR模式的特点三、LVS-DR中的ARP问题 二、LVS负载均衡群集-DR模式部署1.配置nfs共享&#xff08;192.168.154.10&#xff09;2.部署第一台nginx服务&#xff08;192.168.154.11&#xff09;3.部署第二台nginx服务&#xff08;192.168.154.12&#xf…

React入门学习

参考资料&#xff1a;https://bright-boy.gitee.io/technical-notes/#/react/React%E5%85%A5%E9%97%A8 https://github.com/xzlaptt/React react学习01: https://docs.qq.com/doc/DSG1jdUJtQ3FYR1V1 react学习02: https://docs.qq.com/doc/DSGhGZk9PUm1KVldv React简介 框架定…

滚动数组-动态规划之-不同路径 II_20230421

DP动态规划之-滚动数组 前言 在学习 不同路径II 的动态规划过程中&#xff0c;从介绍资料中了解到 滚动数组可以进一步降低动态规划解空间的复杂度&#xff0c;更高效利用计算机的储存空间。动态规划中的滚动数组究竟能发挥哪些作用&#xff0c;在常规的动态规划中&#xff0…

SpringBoot+Vue 前后端分离 微服务项目 打包部署全流程(原始部署/宝塔部署)

前端打包部署 前端项目为vue项目&#xff0c;使用vue admin template作为后台管理模板进行开发。 前端打包 了解开发环境、生产环境&#xff0c;修改生产环境的配置 在开发的时候&#xff0c;往往使用本地电脑进行开发。但是项目上线的时候&#xff0c;需要部署到云服务器中…

基于二阶锥规划(SOCP)松弛和线性离流的配电网规划(DNP)方法示例(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 配电网最优潮流 Optimal Power Flow, OPF) 问题是指在满足一定约束条件的情况下&#xff0c;通过控制配电网中的可控变量&…

内网Nexus代理docker-ce(yum) 源私有仓库 + 内网设备配置(centos)

配置docker-ce源 这里也是以阿里云的docker-ce源为例。 源地址为&#xff1a;https://mirrors.aliyun.com/docker-ce/linux/centos 1、在nexus上配置代理 Nexus上创建Blob Stores 创建Repositories 点击设置 - -> Repositories -- > Create repository --> yum(p…