STM32学习-基于STM32F1具有控制菜单的温控小风扇

该文介绍了如何使用STM32通过ADC读取环境温度并利用PWM控制FAN转速。系统包括MCU、NTC温变电阻、电位器和L298N电机驱动模块。软件部分涉及定时器设置PWM、ADC读取温度以及DMA中断处理,硬件上则讲解了L298N的连接与电机控制逻辑。此外,文中还提到了按键电路和手动控制转速的设计,以及简单的菜单系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

本文仅作个人学习记录,非教程,内容不完整,仅供参考,请勿用于商业用途。

二、概述

使用ADC读取环境温度,根据环境温度设置PWM占空比,从而控制FAN转速。控制菜单功能:1.设置特定转速,2.切换为手动模式任意控制FAN转速。

三、系统框图

整个系统并不复杂:MCU负责运行代码并输出信号;NTC是温变电阻,阻值随温度变化;电位器用于手动任意控制FAN转速;按键;L298N是电机驱动模块,单片机IO口无法直接驱动Motor;Motor。

四、软硬件设计

4.1 设置定时器输出PWM&驱动电机

4.1.1 软件设置

使用TIM3的CH1输出PWM

频率计算公式:

占空比计算公式:

__HAL_TIM_SetCompare(&htimx,TIM_CHANNEL_x,xx);    //占空比设置函数

这里频率设很高是因为低于16kHz时电机的电感会响并且无法工作

只设置PSC & ARR & 初始占空比,其他默认即可

4.1.2 硬件连接

L298N共4个逻辑输入& 2个输出通道,IN1、IN2控制A OUT,IN3、IN4控制B OUT,

控制逻辑如下,B同,输入接12V位置,IN2接地,只用高电平接IN1控制正转

Note:L298N与MCU要共地以获得相同的参考电位,否则会异常,例如MCU输出100%占空比的PWM,但实际电压却不到

L298N输出电压计算公式:

 

IN1

IN2

OUT

A Channel

0

0

制动

1

0

正转

0

1

反转

1

1

制动

信泰微电子淘宝截图,侵删

4.1.3 控制代码

HAL_ADCEx_Calibration_Start(&hadc3);               //使用前先校正
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);           //使能TIM3的PWM输出
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,Duty);   //设置占空比为Duty

4.2 读取MCU温度传感器温度,自动控制FAN

4.2.1 软件设置

温度传感器也是一个温变电阻,使用ADC读取其电压值,根据官方公式转化为温度值。

ADC设置方法:【STM32】HAL库 STM32CubeMX教程九---ADC

使用ADC1的温度传感器,使用扫描模式,使用DMA传输,这样可以将读取到的电压值全部保存到一个数组里,在中断服务函数里输出;开启传输完成中断。

Note:DMA Request Mode需设置为Normal,否则会陷入中断里一直读电压值出不来

4.2.2 代码

ADC实际电压值计算公式: (12位ADC,3.3V参考电压)

内部温度传感器温度计算公式:

V25:Vsence在25℃时的数值,典型值1.43

Avg_Slope:温度与Vsence曲线的平均斜率,mv/℃,典型值4.3 mv/℃

uint16_t ADC_Voltage[1];             //储存读取的ADC值
float Voltage=0;                     //ADC值转化后的电压值
float Temp=0;                        //转化后的温度值
uint16_t PWMValue = 0;               //初始化占空比

HAL_ADCEx_Calibration_Start(&hadc1);                    //校准ADC
int main()
{
     while(1)
      {
         HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Voltage,1); //读取ADC值,读完会跳到中断处理函数
      }
}

//ADC DMA传输完成中断回调函数
//DMA Request Mode要设置为Normal,否则陷入中断
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
 {
     //内部温度传感器
     if(hadc == &hadc1)
     {
         Voltage = (float)ADC_Voltage[0]*3.3/4096;                 //计算电压值,实际读出来1.42
         Temp = ((1.43-Voltage)/0.0043+25);                        //计算温度值
         printf("Temp=%.2f C\r\n",Temp); 
     }
 }

到这里,自动读温控制已经完成

4.3 按键电路

4.3.1 电路原理图

将IO口设置为上拉模式,直接接开关,按键识别低电平有效。

上拉电阻:上电高电平 下拉电阻:上电低电平

4.3.2 代码

HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5);         //读取IO口点评状态

4.4 手动控制转速设计

串联电阻分压原理,通过ADC读取电位器的电压值判断此时设置了多少转速。

4.5 菜单设计

采用索引法,具体实现方法:STM32简易多级菜单(数组查表法)

菜单设计这方面没有特别的好讲,方法的差异而已

五、最后效果

总览

上电初始菜单,自动读温控速

进入菜单

选择特定转速

使用电位器任意改变转速

手上没有电位器,直接接高电平了

嵌入式小白,有错请大佬指正,respect

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值