打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、简介

  1. PWM是一种技术手段,PWM波是在这种技术手段控制下的脉冲波。
  2. 全称Pulse Width Modulation:脉冲宽度调制(简称脉宽调制,通俗的讲就是调节脉冲的宽度),是电子电力应用中非常重要的一种控制技术,在理解TA之前我们先来了解几个概念 。

二、计算方法

计算式:PWM_Out=100-(75-50)/0.223=10;//50–>正常温度 75–当前温度 通过计算75°时,PWM调整为10%。

/热敏管理任务/
xdata uint8_t CoefficientVaue = 100; //温度调节值%
HeatValue = AD_to_TEMP(Config_GMTemp_CH); //读取温度值
Temperture_Management(HeatValue, &CoefficientVaue); //温度管理

在这里插入图片描述
在这里插入图片描述
①PWM波其实就是一种脉宽可连续调节的矩形脉冲波;

②占空比其实就是描述脉宽与脉冲周期的比值,是量化值,便于分析研究,当我们用占空比来表达时,对脉宽就不那么关心了;

③占空比调节就是脉宽调节,表达不一样,但本质是一样的;

④PWM波满足伏秒积计算:U红(幅值) × 占空比 = U蓝,作用效果与直流电压一样。

三、示例代码

#include "GM_Temp.h"
#include "math.h"

xdata  uint8_t   CoefficientVaue  = 100;  //温度调节值%
xdata  float     Management_old   = 0;    //上次温度值
xdata  float     HeatValue        = 30;   //温度控制

/*********************************************
函数名:Temperture_Management
功  能:温度管理 根据对应温度控制PWM总体百分比
形  参:Management--当前温度   CoefficientVaue--温度调整值
返回值:
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
void Temperture_Management(const float Management, uint8_t *pCoefficientVaue)
{
    static uint8_t tiaozheng = 0;
    if (Management >= MAX_Temp_AD || Management <= RT_Temp_AD) //温度到80°极限了 || 热敏电阻开路
    {
        *pCoefficientVaue = 5; //占空比*0.05
        Management_old = Management;
        return;
    }
    if (Management <= Normal_Temp_AD) //<50°恢复正常
    {
        *pCoefficientVaue = 100;
        Management_old = Management;
        return;
    }
    else if (Management > High_Temp_AD) //>75°
    {
        *pCoefficientVaue = 10; //占空比*0.1
        Management_old = Management;
    }
    else if (Management >= Median_Temp_AD) //判断是否达到50°
    {
        if (Management_old == 0) //第一次上电,温度过高
        {
            *pCoefficientVaue = 100 - (fabs(Management - Median_Temp_AD) / 0.223);
            Management_old = Management;
            return;
        }
        else if (Management_old != Management && fabs(Management - Management_old) >= 0.2)
        {
            tiaozheng = 1; //开始动态调节温度
        }
    }
    /*动态调整温度   100-(75-50)/0.278*/
    if (tiaozheng == 1)
    {
        if (Management <= High_Temp_AD && Management >= Normal_Temp_AD) //假设在50-75度之间
        {
            *pCoefficientVaue = 100 - (fabs(Management - Median_Temp_AD) / 0.223);
//            printf("T-%2.2f° Co-%d old-%2.2f\n", HeatValue, (uint16_t)CoefficientVaue, Management_old);
            Management_old = Management;
            tiaozheng = 0;
        }
    }
}
#ifndef __TEMPGM_H
#define __TEMPGM_H
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------宏定义-----------------------------------------*/
//      <o> 极限高温值(单位:℃)
#define  MAX_Temp_AD     80
//      <o> 高温临界值(单位:℃)
#define  High_Temp_AD    (75)
//      <o> 高温中间值(单位:℃)触发值
#define  Median_Temp_AD  55
//      <o> 正常临界值(单位:℃)
#define  Normal_Temp_AD  54
//      <s.3> 热敏电阻开路值(单位:℃)
#define  RT_Temp_AD      atoi("-40")
/* -----------------------------------------结构体定义-------------------------------------*/

/* -----------------------------------------全局变量定义-----------------------------------*/
extern xdata  uint8_t   CoefficientVaue;
extern xdata  float     Management_old;
extern xdata  float     HeatValue;

/* -----------------------------------------应用程序---------------------------------------*/

void Temperture_Management(const float Management,uint8_t *pCoefficientVaue);
#endif

posted on 2020-04-10 16:36  xuejianqiang  阅读(18)  评论(0编辑  收藏  举报  来源
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033