STM32脉宽调制PWM控制直流风扇

北京中科白癜风医院门诊靠谱吗 https://mjbk.familydoctor.com.cn/bjbdfyy/pj/

在之前的文章中,我们已经了解了使用STM32进行ADC转换。现在,我们将了解STM32中的PWM(脉冲宽度调制)以及如何使用PWM技术控制LED的亮度或直流风扇的速度。

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

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

什么是PWM(脉冲宽度调制)?(前面的文章也有相关介绍)

PWM可以让数字值控制模拟设备,例如控制电机的速度,LED的亮度等。我们知道电机和LED工作在模拟信号上。但是PWM不提供纯模拟输出,PWM看起来像是由短脉冲产生的模拟信号。

PWM的占空比

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

占空比=ONTime/(ONTime+OFFTime)

STM32中的PWM

STM32FC8有15个PWM引脚和10个ADC引脚。它具有16位PWM分辨率(2^16)。

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

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

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

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

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

ULN电机驱动IC:用于单向驱动电机。下面是ULN的图片图:

引脚(IN1到IN7)是输入引脚,(OUT1到OUT7)是相应的输出引脚。COM是负载的正极电压。

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

STM32的管脚细节

我们可以看到PWM引脚以波浪线(~)表示,有15个这样的引脚;有10个ADC引脚用于模拟输入,ADC引脚以绿色标出。

电路图和连接

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

STM32的模拟(ADC)输入

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

STM32连接LED

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

STM32连接ULN和ULN连接风扇

STM32PWM输出引脚(PA8)连接到ULNIC的输入引脚(IN1),ULN的相应输出引脚(OUT1)连接到直流风扇的负极线。

直流风扇的正极引脚连接到ULNIC的COM引脚,外部电池(9VDC)也连接到ULNIC的相同COM引脚。ULN的GND、STM32的GND、电池负极连接到电路相同的GND。

STM32连接LCD()

整体电路

编程STM32

#includeLiquidCrystal.h//LCD库

//声明LCD连接到STM32的哪个引脚

constintrs=PB11,en=PB10,d4=PB0,d5=PB1,d6=PC13,d7=PC14;

LiquidCrystallcd(rs,en,d4,d5,d6,d7);//初始化LCD

constintanaloginput=PA4;//电位器输入

constintled=PA9;//LEDPWM输出

constintfan=PA8;//风扇输出

voidsetup()

{

lcd.begin(16,2);//16*2LCD

lcd.clear();//LCD清屏

lcd.setCursor(0,0);//将光标设置在第0行和第0列

lcd.print("HelloWorld");

lcd.setCursor(0,1);//设置光标在第二行第一列

lcd.print("PWMUSINGSTM32");//LCD显示PWMusingSTM32

delay();//延时2秒

lcd.clear();//LCD清屏

pinMode(analoginput,INPUT);//设置为模拟输入

pinMode(led,PWM);//设置为PWM输出控制led

pinMode(fan,PWM);//设置为PWM输出控制风扇

}

voidloop()

{

intvalueadc=analogRead(analoginput);//从引脚PA4读取ADC值(电位器值)

intresult=map(valueadc,0,,0,);//把valueadc从0-映射转为0-映射并存储到result中

pwmWrite(led,result);//以PWM波控制LED

pwmWrite(fan,result);

lcd.setCursor(0,0);//设置光标位置

lcd.print("ADCvalue=");//LCD显示ADCvalue=

lcd.print(valueadc);//显示电位器ADC值

lcd.setCursor(0,1);//设置光标位置

lcd.print("Output=");//LCD显示Output=

lcd.print(result);//显示电位器映射0-的值

}



转载请注明:http://www.abuoumao.com/hyls/4492.html

网站简介| 发布优势| 服务条款| 隐私保护| 广告合作| 网站地图| 版权申明

当前时间: 冀ICP备19029570号-7