首页

如何在STM32F103C8T6中使用PWM ?STM32 PWM教程

在本教程中,我将向您展示如何使用基于STM32蓝丸板的STM32F103C8T6单片机中的PWM。利用STM32单片机中的脉宽调制(PWM)控制一个小型5V直流风扇的转速。你也可以使用PWM技术来控制LED的亮度。

介绍

我们在这里看到了许多与PWM相关的项目。我们知道,所有的微控制器工作在数字领域,访问或产生模拟信号是不可能的直接。PWM是脉宽调制(Pulse Width Modulation)的简称,是一种利用数字手段产生模拟信号的技术。

这是通过使数字输出引脚高和低在一定的频率,以产生方波。但是这个纯方波是没有用的。为了利用数字控制,我们可以在固定的时间周期内改变方件波的高时间和低时间。

通过改变开关的宽度的方波,我们可以模拟电压全(0 V)和全之间(5 V或3.3 V)。时间的脉冲持续时间被称为脉冲的宽度或简单的脉冲宽度。由于我们正在改变或“调制”这个宽度,这项技术被称为脉宽调制。

一个脉冲的开启时间与总时间周期的比值称为PWM信号的占空比。

占空比=开时间/(开时间+关时间)

对于占空比为50%的信号,ON和OFF时间是相等的。因此,输出是一个带平均电压电平2.5 V(如果VDD是5V)。如果我们将占空比增加到100%,则ON持续时间是最大的(即ON脉冲占据整个脉冲长度)。因此,信号产生满5V。

通过控制占空比,我们可以在PWM信号的输出产生一个精确的电压水平,然后可以用来控制电机的速度或调整LED的亮度超过固定伺服电机的位置,以及许多其他事情。

在PWM STM32F103C8T6

如果你还记得开始使用STM32F103C8T6教程,我已经指出,STM32蓝色药丸板有15个引脚能够产生脉宽调制信号.STM32F103C8T6的PWM分辨率为16位,即最大计数器值为216,等于65535。

因此,如果计数器值设置为65535,我们可以实现100%的占空比。如果LED和直流风扇连接,则LED的亮度最大,风扇的转速最大。

对于50%占空比,计数器值必须设置为32767。这将导致一半的最大亮度和一半的最大速度。

下图显示的是Arduino的analogWrite函数中必须写入的各种占空比的PWM信号和对应的计数器值。

如何在STM32F103C8T6占空比中使用PWM

组件的要求

在这个简单的STM32F103C8T6单片机的PWM演示中,我将控制一个简单的直流风扇的速度和LED的亮度。因此,下面提到了这个项目所需的完整组件列表。

线路图

下图为项目电路图。

STM32F103C8T6电路图中如何使用PWM

连接解释

由于我们需要控制直流电机的速度,这是一个大电流设备,我们不应该直接将电机连接到STM32 MCU,而是通过一个电机驱动器。您可以使用专用的电机驱动IC,如L293D或L298N,但我们可以使用ULN2003 IC,这是一个达林顿阵列IC。

使用ULN2003 IC驱动电机的限制是不能反转电机的旋转方向。引脚1 ~ 7为输入(IN1 ~ IN7),引脚10 ~ 16为输出(OUT7 ~ OUT1)。

由于我们只控制一个电机,电机的负端连接到OUT1引脚,而IN1引脚连接到PWM引脚PA8。电机正端连接外接5V电源。

LED的阳极连接到另一个PWM引脚PA9,阴极通过220Ω系列电阻连接到GND。

为了改变输入模拟电压,然后将其转换为PWM信号,10KΩ POT连接到ADC引脚PA0。POT的另外两个端子分别连接3.3V和GND。

您可以使用16×2 LCD显示屏显示ADC值和占空比值。我还没有实现这一点,但如果遵循我的接口16×2 LCD与STM32F103C8T6教程,那么您可以轻松实现这一点。

编程STM32蓝色药丸PWM

首先,将引脚PA0、PA8和PA9分别分配给POT、Motor PWM和LED PWM。初始化引脚作为输入和输出基于他们的功能,即POT引脚是输入,而电机引脚和LED引脚都是输出。

现在,使用ADC函数analogRead读取电位器的值。将这个值存储在一个变量中。现在使用另一个变量,将ADC的范围(0到4095)映射到PWM占空比范围(0到65535)。这将确保我们在PWM信号上获得全范围的电压。

利用analogWrite函数,生成PWM信号,并将其映射值作为占空比值发送到LED和电机。

代码

const int potPIN = PA0;
const int ledPIN = PA9;
const int motorPIN = PA8;

无效的设置()

pinMode (potPIN、输入);
pinMode (ledPIN、输出);
pinMode (motorPIN、输出);

无效循环()

int adcValue = analogRead(potPIN);
int dutyCycle = map(adcValue, 0, 4095, 0, 65535);
analogWrite (ledPIN dutyCycle);
analogWrite (motorPIN dutyCycle);

结论

一个简单的演示如何在STM32蓝丸板的STM32F103C8T6单片机中使用脉冲宽度调制或PWM。

留下一个回复

您的电子邮件地址将不会被公布。必填字段已标记

Electronicshub图标
<\/i>","library":""}}" data-widget_type="nav-menu.default">
Baidu