0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用PWM技术控制LED的亮度或直流风扇的速度

科技观察员 来源:circuitdigest 作者:Pramoth Thangavel 2022-11-07 17:00 次阅读

在本教程中,我们将了解STM32中的PWM(脉宽调制),以及如何使用PWM技术控制LED的亮度或直流风扇的速度。

我们知道有两种类型的信号模拟和数字。模拟信号具有(3V,1V...等)和数字信号有(1'和0)。传感器输出为模拟信号,这些模拟信号使用ADC转换为数字信号,因为微控制器只能理解数字信号。处理完这些ADC值后,需要再次将输出转换为模拟形式以驱动模拟器件。为此,我们使用某些方法,例如PWM,数模(DAC转换器等。

什么是PWM(带调制的脉冲)?

PWM是一种使用数字值控制模拟设备的方法,例如控制电机的速度,LED的亮度等。我们知道电机和LED在模拟信号上工作。但是PWM不提供纯模拟输出,PWM看起来像由短脉冲产生的模拟信号,而短脉冲是由占空比提供的。

PWM 的占空比

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

Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)

采用STM32封装的PWM

STM32F103C8具有15个PWM引脚和10个ADC引脚。有 7 个定时器,每个 PWM 输出由连接到 4 个定时器的通道提供。它具有 16 位 PWM 分辨率 (216),即计数器和变量可以大到 65535。在 72MHz 时钟速率下,PWM 输出的最大周期约为 1 毫秒。

因此,值 65535 给出了 LED 的全亮度和直流风扇的全速(100% 占空比)

同样,32767 的值给出了 LED 的一半亮度和直流风扇的一半速度(50% 占空比)

值 13107 给出 (20%) 亮度和 (20%) 速度(20% 占空比)

poYBAGNoyRiAHKUCAACpcLDsLvQ538.png

在本教程中,我们使用电位计和STM32通过PWM技术改变LED的亮度和直流风扇的速度。16x2 LCD用于显示ADC值(0-4095)和输出的修改变量(PWM值)(0-65535)。

以下是其他微控制器的几个PWM示例:

使用带有MPLAB和XC8的PIC微控制器生成PWM

树莓派伺服电机控制

基于 Arduino 的 LED 调光器,使用 PWM

使用 MSP430G2 的脉宽调制 (PWM)

在此处查看所有与PWM相关的项目。

所需组件

STM32F103C8

直流风扇

ULN2003 电机驱动器 IC

指示灯(红色)

液晶显示器 (16x2)

电位计

面包板

电池 9V

跳线

直流风扇:这里使用的直流风扇是来自旧PC的BLDC风扇。它需要外部电源,因此我们使用 9V 直流电池。

ULN2003 电机驱动器 IC:它用于在一个方向上驱动电机,因为电机是单向的,风扇也需要外部电源。在此处了解有关基于 ULN2003 的电机驱动器电路的更多信息。以下是ULN2003的图片图:

pYYBAGNoyRqANRCIAABZRY0PjR0313.png

引脚(IN1 到 IN7)是输入引脚,(OUT 1 到 OUT 7)是相应的输出引脚。COM 被赋予输出设备所需的正源电压。

发光二极管:使用红色 LED 发出红光。可以使用任何颜色。

电位器:使用两个电位器,一个用于ADC模拟输入的分压器,另一个用于控制LED的亮度。

STM32的引脚详细信息

STM32-Pin-Details_0.png

正如我们所看到的,PWM引脚以波形格式(~)表示,有15个这样的引脚,ADC引脚以绿色表示,10个ADC引脚用于模拟输入。

电路图和连接

pYYBAGNoySmASZpOAAD2csxrtks715.png

STM32与各种组件的连接说明如下:

STM32,带模拟输入(ADC)

电路左侧的电位计用作稳压器,用于调节来自3.3V引脚的电压。电位计的输出,即电位计的中心引脚连接到STM32的ADC引脚(PA4)。

STM32 带指示灯

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

电阻器电容器的LED

串联电阻和并联电容器与 LED 连接,以从 PWM 输出产生正确的模拟波,因为模拟输出与直接从 PWM 引脚生成时不是纯净的。

STM32 带 ULN2003 和 ULN2003 带风扇

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

直流风扇的正极引脚连接到 ULN2003 IC 的 COM 引脚,外部电池 (9V DC) 也连接到 ULN2003 IC 的同一 COM 引脚。ULN2003的接地引脚连接到STM32的接地引脚,电池负极连接到同一接地引脚。

STM32 带液晶显示器 (16x2)

液晶屏引脚编号 液晶屏引脚名称 STM32 引脚名称
1 地面(锭) 地面 (G)
2 可变资本公司 5V
3 维伊 电位计中心的引脚
4 寄存器选择 (RS PB11
5 读/写 (RW) 地面 (G)
6 启用 (英文) PB10
7 数据位 0 (DB0) 无连接(常闭)
8 数据位 1 (DB1) 无连接(常闭)
9 数据位 2 (DB2) 无连接(常闭)
10 数据位 3 (DB3) 无连接(常闭)
11 数据位 4 (DB4) PB0
12 数据位 5 (DB5) PB1
13 数据位 6 (DB6) 电脑13
14 数据位 7 (DB7) 电脑14
15 正极指示灯 5V
16 负极指示灯 地面 (G)

右侧的电位计用于控制LCD显示屏的对比度。上表显示了LCD和STM32之间的连接。

poYBAGNoySyANLJnAAEMYGWvx4Y956.jpg

在此编码中,我们将从连接到左电位计中心引脚的ADC引脚(PA4)获取输入模拟值,然后将模拟值(0-3.3V)转换为数字或整数格式(0-4095)。该数字值进一步作为PWM输出提供,以控制LED亮度和直流风扇的速度。16x2 LCD用于显示ADC和映射值(PWM输出值)。

首先,我们需要包含LCD头文件,声明LCD引脚并使用以下代码初始化它们。

#include // include the LCD library

const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to

LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD

接下来使用STM32的引脚声明和定义引脚名称

const int analoginput = PA4; // Input from potentiometer

const int led = PA9; // LED output

const int fan = PA8; // fan output

现在在setup()中,我们需要显示一些消息并在几秒钟后清除它们,并指定输入引脚和PWM输出引脚

lcd.begin(16,2); //Getting LCD ready

lcd.clear(); //Clears LCD

lcd.setCursor(0,0); //Sets cursor at row0 and column0

lcd.print("CIRCUIT DIGEST"); //Displays Circuit Digest

lcd.setCursor(0,1); //Sets Cursor at column0 and row1

lcd.print("PWM USING STM32"); //Displays PWM using STM32

delay(2000); // Delay Time

lcd.clear(); // Clears LCD

pinMode(analoginput, INPUT); // set pin mode analoginput as INPUT

pinMode(led, PWM); // set pin mode led as PWM output

pinMode(fan, PWM); // set pin mode fan as PWM output

模拟输入引脚(PA4)通过引脚模式(模拟输入,输入)设置为输入,LED引脚设置为PWM输出由引脚模式(led,PWM),风扇引脚设置为PWM输出由引脚模式(风扇,PWM)设置。此处,PWM 输出引脚连接到 LED (PA9) 和风扇 (PA8)。

接下来在void loop()函数中,我们从ADC引脚(PA4)读取模拟信号并将其存储在一个整数变量中,该整数变量使用以下代码将模拟电压转换为数字整数值(0-4095) int valueadc = analogRead(analoginput);

这里需要注意的重要一点是PWM引脚,即STM32的通道具有16位分辨率(0-65535),因此我们需要使用如下所示的映射功能将其与模拟值进行映射

int result = map(valueadc, 0, 4095, 0, 65535).

如果不使用映射,我们将无法通过改变电位计来获得风扇的全速或LED的全亮度。

然后,我们使用pwmWrite(led,结果)将PWM输出写入LED,并使用pwmWrite(风扇,结果)函数将PWM输出写入风扇。

最后,我们使用以下命令在LCD显示屏上显示模拟输入值(ADC值)和输出值(PWM值)

lcd.setCursor(0,0); //Sets cursor at row0 and column0

lcd.print("ADC value= "); // prints the words “”

lcd.print(valueadc); //displays valueadc

lcd.setCursor(0,1); //Sets Cursor at column0 and row1

lcd.print("Output = "); //prints the words in ""

lcd.print(result); //displays value result

#include // include the LCD library

const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to

LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD


const int analoginput = PA4; // Input from potentiometer

const int led = PA9; // LED output

const int fan = PA8; // fan output



void setup()

{

lcd.begin(16,2); //Getting LCD ready

lcd.clear(); //Clears LCD

lcd.setCursor(0,0); //Sets cursor at row0 and column0

lcd.print("CIRCUIT DIGEST"); //Displays Circuit Digest

lcd.setCursor(0,1); //Sets Cursor at column0 and row1

lcd.print("PWM USING STM32"); //Displays PWM using STM32

delay(2000); // Delay yime

lcd.clear(); // Clears LCD

pinMode(analoginput, INPUT); // set pin mode analoginput as INPUT

pinMode(led, PWM); // set pin mode led as PWM output

pinMode(fan, PWM); // set pin mode fan as PWM output

}




void loop()


{

int valueadc = analogRead(analoginput); //gets analog value from pot and store in variable,converts to digital

int result = map(valueadc, 0, 4095, 0, 65535); //maps the (0to4095 into 0to65535) and stores in result variable

pwmWrite(led, result); //puts resultin PWM form

pwmWrite(fan, result); //puts resultin PWM form

lcd.setCursor(0,0); //Sets cursor at row0 and column0

lcd.print("ADC value= "); // prints the words in ""

lcd.print(valueadc); //displays value

lcd.setCursor(0,1); //Sets Cursor at column0 and row1

lcd.print("Output = "); //prints the words in ""

lcd.print(result); //displays value result

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4901

    浏览量

    209907
  • STM32
    +关注

    关注

    2239

    文章

    10672

    浏览量

    348768
  • 脉宽调制
    +关注

    关注

    3

    文章

    204

    浏览量

    38048
收藏 人收藏

    评论

    相关推荐

    温控直流风扇电路图分享

    温控直流风扇是一种结合了温度控制技术直流风扇。它通常内置有温度传感器和控制电路,能够根据设备或环境的温度变化自动调整
    的头像 发表于 02-22 17:25 1611次阅读
    温控<b class='flag-5'>直流风扇</b>电路图分享

    PWM是如何控制LED亮度

    学习:4. PWM控制LED亮度1.基础知识1.1 PWM基本知识1.21.基础知识1.1 PWM
    发表于 08-09 08:45

    典型的直流风扇控制电路有哪几种形式

    直流风扇运转的基本原则是什么?何谓直流无刷风扇?有何优点?典型的直流风扇控制电路有哪几种形式?
    发表于 08-27 06:13

    如何利用PWM控制LED亮度直流电机的速度

    什么是PWM?怎么样才能产生一个PWM波呢?如何利用PWM控制LED亮度
    发表于 12-21 07:12

    DX9087 内置霍尔单相全波无刷直流风扇驱动芯片

    DX9612单相全波无刷直流风扇驱动芯片 概要DX9612是一款单相直流无刷马达驱动芯片,其通过PWM直接输入模式高效控制直流无刷
    发表于 02-17 15:45

    基于DSP的小型直流风扇自动化测试系统

    针对目前我国小型直流风扇产品出厂检测设备落后的现状,采用现代微处理器检测与控制技术开发了基于DSP控制器TMS320F2812A的新型直流风扇
    发表于 07-16 15:20 25次下载

    采用FanSense TM技术PWM风扇速度控制

    TC642 是一款开关模式风扇速度控制器,用于控制直流无刷风扇
    发表于 11-20 18:26 49次下载

    抗电磁干扰的PWM风扇控制器原理及应用

    抗电磁干扰的PWM风扇控制器原理及应用 微芯科技(Microchip )公司提供一种工作于PWM模式的风扇制冷
    发表于 03-12 15:42 3833次阅读
    抗电磁干扰的<b class='flag-5'>PWM</b><b class='flag-5'>风扇</b><b class='flag-5'>控制</b>器原理及应用

    pwm控制led亮度原理图,单片机PWM控制LED亮度

    对EN端子施加PWM信号,白光LED会以某种速度做ON/OFF模式运行,进而实现LED亮度控制
    发表于 10-30 11:51 6.1w次阅读
    <b class='flag-5'>pwm</b><b class='flag-5'>控制</b><b class='flag-5'>led</b><b class='flag-5'>亮度</b>原理图,单片机<b class='flag-5'>PWM</b><b class='flag-5'>控制</b><b class='flag-5'>LED</b><b class='flag-5'>亮度</b>

    直流风扇和交流风扇的基本组成结构?

    、磁环、磁环外框及油圈。直流风扇和交流风扇的组成3----定子包括电机、外框、轴承、扣环等。直流风扇和交流风扇的组成4----扇框扇框可以对扇叶所带动的气流进行“约束”,
    发表于 05-21 16:17 1107次阅读

    如何使用Arduino生成的PWM控制流风扇速度

    在这个项目中,我们将演示使用 TRIAC 的 Arduino 交流风扇速度控制。这里使用交流信号的相位控制方法来控制
    的头像 发表于 08-18 16:26 9633次阅读
    如何使用Arduino生成的<b class='flag-5'>PWM</b>来<b class='flag-5'>控制</b>交<b class='flag-5'>流风扇</b>的<b class='flag-5'>速度</b>

    基于Arduino制作直流风扇速度控制

    如何使用Arduino和IR Remote制作直流风扇速度控制器。硬件部件:Arduino nano R3×1个直流电机,RE40×1个JustBoom红外遥控器×1个红外接收器(通用
    发表于 01-05 16:22 0次下载

    用Arduino和红外遥控器制作直流风扇速度控制

    电子发烧友网站提供《用Arduino和红外遥控器制作直流风扇速度控制器.zip》资料免费下载
    发表于 02-02 14:19 4次下载
    用Arduino和红外遥控器制作<b class='flag-5'>直流风扇</b><b class='flag-5'>速度</b><b class='flag-5'>控制</b>器

    使用Arduino和晶闸管(TRIAC)控制流风扇速度

    在许多基于Arduino的自动化项目中,使用开关或使用某种控制很容易打开或关断家用电器。但是在很多应用中,我们需要控 制交流电源,例如,控制风扇速度或灯的
    发表于 03-06 14:57 3次下载
    使用Arduino和晶闸管(TRIAC)<b class='flag-5'>控制</b>交<b class='flag-5'>流风扇</b>的<b class='flag-5'>速度</b>

    风扇控制的进步:考虑风扇速度调节

    无刷直流风扇电机可以使用多种方法进行控制。最简单的方法是使用单个晶体管进行开/关开关。针对风扇速度的可变控制,Maxim提供多种产品,包括用
    的头像 发表于 05-17 11:34 1306次阅读
    <b class='flag-5'>风扇</b><b class='flag-5'>控制</b>的进步:考虑<b class='flag-5'>风扇</b><b class='flag-5'>速度</b>调节