stm32 pwm输出_STM32 上使用 PWM

c8902f07737084c4c569d7dd08f06ec9.png本文描述了如何在搭载了 RT-Thread 操作系统的平台上使用 PWM 输出波形,包括 PWM 的应用、配置和驱动的添加等。并给出了在正点原子 STM32L475 pandora 开发板上验证的代码示例。

硬件平台简介

本文基于正点原子 STM32L475 pandora 开发板,给出了 PWM 的具体应用示例代码,由于 RT-Thread 上层应用 API 的通用性,因此这些代码不局限于具体的硬件平台,用户可以轻松将它移植到其它平台上。 STM32L475 pandora 是正点原子推出的一款基于 ARM Cortex-M4 内核的开发板,最高主频为 80Mhz,该开发板具有丰富的板载资源,可以充分发挥 STM32L475 的芯片性能。

fb577f6def7df30ac5fa62abd6b728dc.png

使用 PWM

在 menuconfig 中打开 PWM 通道
打开 Env 工具,使用 menuconfig 工具配置工程,在 Env 命令行中输入 menuconfig 进入配置界面。 在 menuconfig 配置界面依次选择 Hardware Driver Config ---> On-chip Peripheral Drivers ---> Enable pwm ---> Enable timer2 output pwm 如下图所示:

6fa8cf45cfafe692e5b161c19372f3ea.png

选中需要使用的 PWM 通道后保存退出,使用 scons --target=mdk5 生成 mdk5 工程,打开工程进行编译并下载程序,在终端输入 list_device 命令可以看到 PWM2 设备已经成功添加了,如下图所示:

be2c306c1034c47ecf48723bdc088e82.png

使用 PWM 输出波形

应用程序可以通过 RT-Thread 提供的设备管理接口来访问 PWM 设备硬件,相关接口如下所示:

04f34ed1c3abdf5a232a0b6c911e4cb3.png

接口参数的具体描述请参考官网 PWM 设备

?链接:

https://www.rt-thread.org/document/site/programming-manual/device/pwm/pwm/

(以上链接请复制至外部浏览器打开)

PWM 设备使用步骤

PWM 设备的具体使用方式可以参考如下步骤:
  1. 初始化 PWM 设备。 ⚪使用 rt_device_find 查找指定的 PWM 设备。 ⚪使用 rt_pwm_set 设置通道的默认 PWM 周期和脉冲宽度。 ⚪使用 rt_pwm_enable 使能需要输出波形的 PWM 通道。
  2. 使用 PWM 设备输出波形。 ⚪使用 rt_pwm_set 输出特定的波形。
  3. 关闭 PWM 输出通道。 ⚪当不再需要使用 PWM 通道输出波形时,可以调用 rt_pwm_disable 关闭对应的输出通道。
代码如下所示: 向?滑动查看全部
 1#define PWM_DEV_NAME            "pwm2"  /* PWM设备名称 */
2#define PWM_DEV_CHANNEL         3       /* PWM通道 */
3#define THREAD_PRIORITY         25      /* 线程优先级 */
4#define THREAD_STACK_SIZE       512     /* 线程栈大小 */
5#define THREAD_TIMESLICE        5       /* 线程时间片大小 */
6
7static rt_thread_t tid1 = RT_NULL;      /* 线程句柄 */
8struct rt_device_pwm *pwm_dev;          /* PWM设备句柄 */
9static rt_uint32_t period = 500000;     /* 周期为0.5ms,单位为纳秒ns */
10static rt_uint32_t pulse = 0;           /* PWM脉冲宽度值的增减方向 */
11
12/* 线程 pwm_entry 的入口函数 */
13static void pwm_entry(void *parameter)14{
15    rt_uint32_t count = 0;
16
17    while (count++ 1000)
18    {
19        rt_thread_mdelay(50);
20        /* step 2、设置 PWM 周期和脉冲宽度,输出特定的波形 */
21        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse++);
22    }
23    /* step 3、如果不再使用该通道,可以关闭 PWM 通道的输出 */
24    rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL);
25}
26
27static int pwm_test(int argc, char *argv[])28{
29    /* step 1.1、查找 PWM 设备 */
30    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
31    if (pwm_dev == RT_NULL)
32    {
33        rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
34        return RT_ERROR;
35    }
36
37    /* step 1.2、设置 PWM 周期和脉冲宽度默认值 */
38    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
39    /* step 1.3、使能 PWM 设备的输出通道 */
40    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
41
42    /* 创建线程,名称是 pwm_thread ,入口是 pwm_entry*/
43    tid1 = rt_thread_create("pwm_thread",
44                             pwm_entry,
45                             RT_NULL,
46                             THREAD_STACK_SIZE,
47                             THREAD_PRIORITY,
48                             THREAD_TIMESLICE);
49
50    /* 如果获得线程控制块,启动这个线程 */
51    if (tid1 != RT_NULL)
52        rt_thread_startup(tid1);
53
54    return RT_EOK;
55}
56/* 导出到 msh 命令列表中 */
57MSH_CMD_EXPORT(pwm_test, pwm sample);
编译、下载程序,在终端输入 help 命令可以看到 pwm_test 命令已经成功导出,如下图所示:

55e5950908358d6379b1d89cd0d06fc3.png

运行 PWM 测试程序

要运行 PWM 测试程序,需要在终端输入 pwm_test 由于此 BSP 的 PWM2 通道 3 的输出并没有连接到外设上,无法直观的看到现象,所以这里使用逻辑分析仪来抓取 PWM 输出的波形,波形输出如下图所示: b58a7ea7ef754f2e0bce1983d3ade653.png 从逻辑分析仪抓取的波形可以看到,PWM 波形已经成功输出。

添加 PWM 驱动

如果使用的 BSP 在 menuconfig 中没有给出 PWM 通道的配置项,那么就需要自己添加 PWM 的驱动,下面就如何自己添加 PWM 驱动展开讲解。
检查驱动文件是否支持 PWM
进入 rt-thread\bsp\stm32\libraries\HAL_Drivers 目录检查 drv_pwm.c 文件是否支持相应的 PWM 外设输出。 检查驱动文件是否支持相应的 PWM 外设(PWM1、2、n)

9910f9429e5f5e969518f9b27315b62d.png

检查驱动文件是否支持相应的 PWM 输出通道(1、2、3、4)

e3d2cedfe8715788dcb32d976e0b7397.png

初始化 PWM 通道引脚

进入 rt-thread\bsp\stm32l475-atk-pandora\board\CubeMX_Config 目录,双击打开 STM32L475VE.ioc 文件初始化 PWM 通道对应的引脚,这里以 PWM2 通道 3 为例,如下图所示:

4e47d8e6a78df10280c8616599292fd7.png

点击 GENERATE CODE 按钮生成代码,虽然 STM32CubeMX 生成了多个文件用来初始化外设,但 RT-Thread 只使用了 STM32CubeMX 生成的 stm32fxx_hal_msp.c 文件和 stm32fxx_hal_conf.h 文件,生成的 PWM 代码如下所示: 39280af07235d39c161f8365196771c6.png

配置 Kconfig 文件

进入 rt-thread\bsp\stm32l475-atk-pandora\board 目录,添加 Kconfig 选项,如下图所示:

4ddea25c3922702442ab3b42dab642b0.png

使用 scons --target=mdk5 命令生成 mdk5 工程,打开工程并编译,如果工程提示 PWMn_CONFIG 未定义。 可以在 stm32/libraries/HAL_Drivers/config/f4/pwm_config.h 中进行定义,如下图所示:

ba502dd14f57345d44dc7bd534ba41a1.png

完成以上步骤就可以在 menuconfig 菜单中添加支持的 PWM 输出通道,至于如何使用 PWM 通道输出波形请参考上一章节。 到这一步为止,如何在搭载了 RT-Thread 操作系统的平台上如何使用 PWM 的介绍就结束了。

推荐阅读:

  • 你眼里的嵌入式工程师是这样的吗?

  • 模块化编程到底有多重要?

  • 硬件工程师日常崩溃图鉴

  • 33岁入行嵌入式软件开发晚不晚啊?

  • 干货||稀里煳涂学习STM32完整版

  • 【视频】教你DC-DC及做一个开关电源,不信你学不会!

  • 什么是PWM“死区”?

  • 这2个单片机编程的思想,请你掌握

  • 长文:嵌入式程序员的编程修养

  • 485通信自动收发电路 历史上最详细的解释

  • 多个单片机的通信方式【详细】

  • 10个单片机电路设计中的难点,你都解决了吗?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值