打印
[其他ST产品]

STM32 脉宽调制 (PWM):控制直流风扇的速度

[复制链接]
238|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在之前的文章中,我们已经了解了使用 STM32 进行 ADC 转换。现在,我们将了解STM32 中的 PWM(脉冲宽度调制)以及如何使用 PWM 技术控制 LED 的亮度或直流风扇的速度。

我们知道有两种类型的电路信号:模拟和数字。模拟信号有3V、3.1V、2V...等电压信号,而数字信号只有1 和 0。

传感器输出的是模拟信号,这些模拟信号使用 ADC 转换为数字信号,因为微控制器只理解数字信号。处理完这些 ADC 值后,需要再次将输出转换为模拟形式以驱动模拟设备。为此,我们使用某些方法,如 PWM、数模 (DAC) 转换器等。

使用特权

评论回复
评论
wailian1265k 2022-12-31 22:16 回复TA
———————————————— 版权声明:本文为CSDN博主「大华工控上位机」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_67034740/article/details/123650613 
沙发
wailian1265k|  楼主 | 2022-12-31 22:17 | 只看该作者
什么是 PWM(脉冲宽度调制)?(前面的文章也有相关介绍)
PWM可以让数字值控制模拟设备,例如控制电机的速度,LED的亮度等。我们知道电机和LED工作在模拟信号上。但是PWM不提供纯模拟输出,PWM看起来像是由短脉冲产生的模拟信号。

使用特权

评论回复
板凳
wailian1265k|  楼主 | 2022-12-31 22:18 | 只看该作者
PWM 的占空比

PWM 信号保持高电平(ON Time)的时间百分比称为占空比。如果信号始终打开,则占空比为 100%,如果始终关闭,则占空比为 0%。

占空比 = ON Time /(ON Time + OFF Time)

使用特权

评论回复
地板
wailian1265k|  楼主 | 2022-12-31 22:19 | 只看该作者
STM32中的PWM
STM32F103C8 有 15 个 PWM 引脚和 10 个 ADC 引脚。它具有 16 位 PWM 分辨率(2^16)。

所以 65535 的值为100% 占空比,平均电压=总电压;

同样,32767 的值为50% 占空比,平均电压=50%总电压;

13107 的值为20% 占空比,平均电压=20%总电压。

这里我们使用电位器和 STM32 通过 PWM 技术来改变 LED 的亮度和直流风扇的速度。1602 LCD用于显示 ADC 值 (0-4095) 和输出的PWM 值 (0-65535) 。

直流风扇:这里使用的直流风扇是PC 的 BLDC 风扇。它需要额外提供电源,所以我们使用 9V 直流电池。

使用特权

评论回复
5
wailian1265k|  楼主 | 2022-12-31 22:24 | 只看该作者
ULN2003电机驱动IC:用于单向驱动电机。下面是ULN2003的图片图:

使用特权

评论回复
6
wailian1265k|  楼主 | 2022-12-31 22:25 | 只看该作者
引脚(IN1 到 IN7)是输入引脚,(OUT 1 到 OUT 7)是相应的输出引脚。COM 是负载的正极电压。

使用特权

评论回复
7
wailian1265k|  楼主 | 2022-12-31 22:26 | 只看该作者
电位器:使用两个电位器,一个用于分压器,用于模拟输入到 ADC,另一个用于控制 LED 的亮度。

使用特权

评论回复
8
wailian1265k|  楼主 | 2022-12-31 22:27 | 只看该作者

使用特权

评论回复
9
wailian1265k|  楼主 | 2022-12-31 22:27 | 只看该作者
我们可以看到 PWM 引脚以波浪线(~) 表示,有 15 个这样的引脚;有 10 个 ADC 引脚用于模拟输入,ADC 引脚以绿色标出。

使用特权

评论回复
10
wailian1265k|  楼主 | 2022-12-31 22:28 | 只看该作者
电路图和连接

使用特权

评论回复
11
wailian1265k|  楼主 | 2022-12-31 22:29 | 只看该作者
STM32 与各种组件的连接说明如下:

> STM32的模拟(ADC)输入

靠近ST32开发板的电位器的中心引脚连接到STM32 的ADC引脚(PA4),该电位器用来调节输入ADC的电压。

使用特权

评论回复
12
wailian1265k|  楼主 | 2022-12-31 22:32 | 只看该作者
>STM32连接LED

STM32 PWM 输出引脚(PA9)通过串联电阻连接到 LED 的正极引脚,LED并联一个电容。

使用特权

评论回复
13
wailian1265k|  楼主 | 2022-12-31 22:33 | 只看该作者
STM32 连接ULN2003 和 ULN2003连接风扇

STM32 PWM 输出引脚(PA8)连接到 ULN2003 IC 的输入引脚(IN1),ULN2003 的相应输出引脚(OUT1)连接到 直流风扇的负极线。

使用特权

评论回复
14
wailian1265k|  楼主 | 2022-12-31 22:34 | 只看该作者
直流风扇的正极引脚连接到 ULN2003 IC 的 COM 引脚,外部电池(9V DC)也连接到 ULN2003 IC 的相同 COM 引脚。ULN2003 的GND、 STM32的GND、电池负极连接到电路相同的 GND。

使用特权

评论回复
15
wailian1265k|  楼主 | 2022-12-31 22:35 | 只看该作者
STM32 连接LCD (1602)

使用特权

评论回复
16
wailian1265k|  楼主 | 2022-12-31 22:36 | 只看该作者
整体电路

使用特权

评论回复
17
wailian1265k|  楼主 | 2022-12-31 22:36 | 只看该作者
编程STM32
#include <LiquidCrystal.h> // LCD库

//声明LCD连接到STM32的哪个引脚
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化 LCD
const int analoginput = PA4; //电位器输入
const int led = PA9; // LED PWM输出
const int fan = PA8; // 风扇 输出
void setup()
{
  lcd.begin(16,2); //16*2LCD
  lcd.clear(); //LCD清屏
  lcd.setCursor(0,0); //将光标设置在第0行和第0列
  lcd.print("Hello World");
  lcd.setCursor(0,1); //设置光标在第二行第一列
  lcd.print("PWM USING STM32"); //LCD显示 PWM using STM32
  delay(2000); // 延时2秒
  lcd.clear(); // LCD清屏
  pinMode(analoginput, INPUT); // 设置为模拟输入
  pinMode(led, PWM); // 设置为PWM输出 控制led
  pinMode(fan, PWM); // 设置为PWM输出 控制风扇
}
void loop()
{
  int valueadc = analogRead(analoginput); //从引脚 PA4 读取 ADC 值 (电位 器值)
  int result = map(valueadc, 0, 4095, 0, 65535); //把valueadc 从0-4095映射转为0-65535映射
                                                   并存储到result中

  pwmWrite(led, result); //以PWM波控制LED
  pwmWrite(fan, result);
  lcd.setCursor(0,0); //设置光标位置
  lcd.print("ADC value= "); // LCD 显示ADC value=
  lcd.print(valueadc); //显示电位器ADC值
  lcd.setCursor(0,1); //设置光标位置
  lcd.print("Output = "); //LCD 显示Output =
  lcd.print(result); //显示电位器映射0-65535的值
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

383

帖子

0

粉丝