STM32脉宽调制PWM控制直流风扇
在之前的文章中,我们已经了解了使用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