pid算法速控风扇

基于PID算法控制的智能风扇系统


随着智能家居的快速发展,智能风扇以其自动调节风速、提供舒适环境的特点,逐渐成为家庭必备的智能家电之一。本文将详细介绍一个基于PID(比例-积分-微分)算法控制的智能风扇系统,该系统通过STM32F10x微控制器、DS18B20温度传感器、OLED显示屏以及电机驱动模块等硬件组件,实现了环境温度的实时监测与风扇转速的自动调整。

一、系统概述

智能风扇系统通过DS18B20温度传感器实时采集环境温度,并传输至STM32F10x微控制器进行处理。微控制器根据设定的目标温度与当前温度之间的差异,通过PID控制算法计算出合适的风扇转速,并通过电机驱动模块控制风扇的转速,以达到自动调节室内温度的目的。同时,系统通过OLED显示屏实时显示当前温度以及风扇的转速信息,方便用户随时了解室内环境状态。

二、硬件设计

1. STM32F10x微控制器

STM32F10x微控制器作为系统的核心,负责接收温度数据、执行PID控制算法以及输出控制信号。其强大的计算能力和丰富的外设接口,为系统的稳定运行提供了有力保障。

2. DS18B20温度传感器

DS18B20温度传感器采用一线制通信方式,与STM32F10x微控制器连接,实时采集环境温度数据。其高精度、高可靠性和低成本的特点,使其成为智能风扇系统的理想选择。

3. OLED显示屏

OLED显示屏用于实时显示当前温度以及风扇的转速信息。其高对比度、快速响应和低功耗的特点,使得用户能够清晰地了解室内环境状态。

4. 电机驱动模块

电机驱动模块采用PWM(脉宽调制)技术,通过改变PWM信号的占空比来控制风扇的转速。该模块具有输出电流大、稳定性好、控制精度高等优点,能够满足智能风扇系统的需求。

三、软件设计

1. 初始化配置

在程序开始时,首先进行初始化配置,包括设置USART通信参数、初始化DS18B20温度传感器、OLED显示屏以及电机驱动模块等。同时,还需设置PID控制算法的参数,如比例系数、积分系数和微分系数等。

2. 数据采集与处理

系统通过DS18B20温度传感器实时采集环境温度数据,并传输至STM32F10x微控制器进行处理。微控制器根据设定的目标温度与当前温度之间的差异,计算出需要调整的风扇转速。

3. PID控制算法

PID控制算法是智能风扇系统的核心部分。它根据当前温度与目标温度之间的偏差,通过比例、积分和微分三种控制策略计算出控制量。该控制量将作为PWM信号的占空比,通过电机驱动模块控制风扇的转速。PID控制算法能够有效地减少温度波动,提高系统的稳定性和舒适性。

4. 实时显示

系统通过OLED显示屏实时显示当前温度以及风扇的转速信息。这些信息可以帮助用户了解室内环境状态,并根据需要调整目标温度或风扇转速。

四、代码部分

1. PID参数初始化

在使用PID控制器之前,我们需要对控制器的参数进行初始化。这些参数包括目标值(vi_Ref)、反馈值(vi_FeedBack)、前一次误差(vi_PreError)、前一次微分误差(vi_PreDerror)、PID系数(v_Kpv_Kiv_Kd)以及上一次控制量(vl_PreU)等。

typedef struct {
    float vi_Ref;
    float vi_FeedBack;
    float vi_PreError;
    float vi_PreDerror;
    float v_Kp;
    float v_Ki;
    float v_Kd;
    float vl_PreU;
    // ... 可以添加其他辅助变量 ...
} PIDStruct;

void PID_Init(PIDStruct *pid) {
    pid->vi_Ref = 0;
    pid->vi_FeedBack = 0;
    pid->vi_PreError = 0;
    pid->vi_PreDerror = 0;
    pid->v_Kp = PID_VKP; // 比例系数
    pid->v_Ki = PID_VKI; // 积分系数
    pid->v_Kd = PID_VKD; // 微分系数
    pid->vl_PreU = 0;
    // ... 其他初始化代码 ...
}

2. PID控制计算

在控制循环中,我们调用PID控制计算函数来根据当前的目标值和反馈值计算出控制量。这个控制量将用于驱动电机,以调整风扇的转速。

float PID_Calculate(PIDStruct *pid) {
    float error = pid->vi_Ref - pid->vi_FeedBack;
    float p = pid->v_Kp * error;
    float i = pid->v_Ki * pid->vi_PreError;
    float d = pid->v_Kd * (error - pid->vi_PreDerror);

    pid->vi_PreError = error;
    pid->vi_PreDerror = error;

    float output = p + i + d;

    // 控制量限幅处理,防止积分饱和和微分过冲
    if (output > MOTOR_PWM_MAX) {
        output = MOTOR_PWM_MAX;
    } else if (output < MOTOR_PWM_MIN) {
        output = MOTOR_PWM_MIN;
    }

    pid->vl_PreU = output;
    return output;
}

3、电机初始化与控制

为了实现对风扇转速的控制,我们需要对电机进行初始化,并通过PWM信号来控制电机的转速。

1. 电机初始化

在电机初始化函数中,我们配置电机的GPIO引脚为输出模式,并设置其输出速度和引脚号。

void Motor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = Motor_IA;
	GPIO_Init(Motor_GPIO, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = Motor_IB;
	GPIO_Init(Motor_GPIO, &GPIO_InitStructure);
	
	TIM_TimeBaseInitTypeDef TIM_BaseInitStu;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	
	
	TIM_InternalClockConfig(TIM4);
	
	TIM_BaseInitStu.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_BaseInitStu.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_BaseInitStu.TIM_Prescaler = 36 - 1;    //预分频值  TIM_Period x TIM_Prescaler / 时钟频率
	TIM_BaseInitStu.TIM_Period = 100 - 1;    //自动装载值
	TIM_BaseInitStu.TIM_RepetitionCounter = 0;
	
	TIM_TimeBaseInit(TIM4,&TIM_BaseInitStu);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = ENABLE;
	TIM_OCInitStructure.TIM_Pulse = 50;
	TIM_OC3Init(TIM4,&TIM_OCInitStructure);
	
	TIM_Cmd(TIM4, ENABLE);
}

2. 电机控制

在控制电机转速时,我们根据PID控制器计算出的控制量来设置PWM信号的占空比。PWM信号的占空比决定了电机驱动电压的平均值,从而控制了电机的转速。

void Set_Motor_Speed(uint16_t speed)
{
	uint16_t value = 0;
	GPIO_ResetBits(Motor_GPIO, Motor_IA);
	value = speed + 50;
	PWM_SetCompare3(value);//(uint16_t)value
}

void vef_value(uint16_t vef_Temp,uint16_t Ref_Temp)
{
	if(vef_Temp >= 50)
	{
		vef_Temp = 50;
	}
	if(vef_Temp <= 0)
	{
		vef_Temp = 0;
	}
	pidStr.vi_FeedBack = vef_Temp;  //反馈值
	pidStr.vi_Ref = Ref_Temp; //   设定值
	Set_Motor_Speed(50-PID_MoveCalculate(&pidStr));  //PID_MoveCalculate(&pidStr));
}

4.主函数

#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "DS180b20.h"
#include "USART.h"
#include "OLED.h"
#include "Motor.h"
#include "bsp_tim.h"
#include "Pid.h"

uint16_t Time_Temp = 0;
int main(void)
{
	USART_Config();
	DS18B20_Init();
	OLED_Init();
	Motor_Init();
	Bsp_Time_Config();
	PID_Init();
	while (1)
	{
		OLED_Clear();
		OLED_ShowFloatNum(0, 20, Time_Temp, 2, 2, OLED_8X16);
		OLED_Update();
		vef_value(Time_Temp,28);
	}
}

五、总结与展望

本文介绍了一个基于PID算法控制的智能风扇系统。该系统通过STM32F10x微控制器、DS18B20温度传感器、OLED显示屏以及电机驱动模块等硬件组件,实现了环境温度的实时监测与风扇转速的自动调整。在实际应用中,该系统不仅提高了使用的便捷性,还为用户带来了更为舒适的使用体验。未来,我们可以进一步优化系统性能,如增加更多传感器以实现多参数控制、引入机器学习算法以实现智能预测等,以满足不同用户的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FightingLod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值