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

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

3天内不再提示

基于RoboMasterC板的RT-Thread使用分享—PWM使用

冬至子 来源:goldengrandpa 作者:goldengrandpa 2023-10-13 16:46 次阅读

创建工程

在上篇文章中我是使用基于芯片创建的,我原本想着不通过BSP文件在教程中教大家一步一步的通过Kconfig+CubeMX配置出可以驱动整个开发板所有外设的工程的。在社区前辈的提醒后才知道通过基于芯片创建工程是没有办法Kconfig配置的。

因此我在之后的教程中我会基于RT-Thread提供的BSP文件stm32f407_robomaster_c来创建工程

但是这个bsp文件暂时还没有支持板上的所有外设,因此我计划随着教程的编写,我也会帮忙维护这个bsp文件,将我们使用到的外设增加支持。

便于大家后续使用,也满足我希望告诉大家Kconfig配置的计划。下图是目前bsp文件的外设支持情况。

1.jpg

下面就正式开始创建工程。

我们这里点击导入

1.jpg

之后选择RT-Thread BSP到工作空间中

1.jpg

BSP根目录选择从Github下载下来的bsp文件路径,点击完成,即可创建工程。

1.jpg

点击编译,下载后根据BSP文件提供规范,下载后将实现LED灯闪烁的功能。如下图LED_B闪烁说明工程创建成功。

1.jpg

PWM教程之呼吸灯

CubeMX配置

首先我们来看一下开发板原理图,来看看LED引脚连接着哪一个定时器输出引脚。

通过原理图我们可以看到是TIM5的1、2、3通道。

1.jpg

接下来我们就在CubeMX中查看相关引脚的配置。我们需要把TIM5的通道1、2、3设置为PWM模式,并且勾选Internal Clock。

1.jpg

设置重载值为65535。这里设置的原因我会在后面进行频率计算的时候再说明。

1.jpg

原理讲解(计算部分新手可视情况略过)

PWM简介

PWM即脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

1.jpg

例如上图中,矩形脉冲是 stm32 输出的数字信号,当这个信号接到外设上时,效果可以等效为这个正弦波。

一个周期内高电平的持续时间占总周期的比例成为占空比,通过修改占空比,可以改变输出的等效模拟电压。例如输出占空比为 50%,频率为 10Hz 的脉冲,高电平为 3.3V.则其输出的模拟效果相当于输出一个 1.65V 的高电平。此外 PWM 输出的频率也会影响最终的 PWM输出效果,PWM 输出的频率越高,最终输出的“连续性”越好,越接近模拟信号的效果,频率低则会增强离散性,最终的输出效果会有比较强的“突变”感。

脉冲调制有两个重要的参数,第一个就是输出频率,频率越高,则模拟的效果越好。第二个就是占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。

定时器触发频率计算
接下来给大家简单的讲解一下定时器触发频率,以及PWM信号的周期和占空比的计算。

首先是定时器的触发频率,这里我们首先需要查看datasheet,看我们的TIM5是挂载在哪一条总线的。这里我们可以看到他是在APB1上的。

1.jpg

接着我们就要看CubeMX上我们配置的时钟树了,在整个时钟树的最右端,可以看到 APB1 和 APB2 两个总线的时钟频率设置,其中 APBx peripheral clocks 为挂载在总线上的定时器以外的外设提供时钟源,APBx timer clocks 为挂载在总线上的定时器提供时钟源。那么这里我们就可以知道TIM5时钟源频率为84MHz,时钟树的配置在上篇文章有较为详细的解释,这里就不重复了。

这里解释一下前面的倍频为何是2,这里可以看到STM32F4xx中文参考手册,我们这里APB1预分频器为4,所以定时器时钟频率等于APB域的频率的两倍,所以倍频为2

1.jpg

确定时钟源频率之后,我们就开始计算定时器触发频率,我们前面设置TIM5_PSC为0,因此分频值为1,因为分频值为 TIMx_PSC 中的分频值+1(毕竟分频不可能为0),所以我们进入的84MHz的频率信号分频后还是84MHz。

当 TIMx_CNT 的值增长到 TIMx_ARR 中的值后,就会发生重载,并触发中断信号,相当于使用 TIMx_ARR 中的值又进行了一次分频。因此产生这个中断信号的频率应该为84MHz/(ARR+1)(需要加 1 是因为 CNT 是从0开始计数的)。我们上面设置的重载值为65535。

因此定时器触发频率为84000000/65536=1281.7Hz,相当于0.78ms会触发一次中断信号。这个中断信号我们还可以用来做一些比如LED灯定时器亮灭等操作,由于篇幅原因中断相关知识这里就不过多的展开了。这里定时器中断触发时间也就是PWM信号周期。

占空比的计算
上文我们讲到了PWM一大重要参数就是占空比,而我们设置占空比的重要方式就是设置比较寄存器的值。毕竟我们不能随便重设重载值,这样子PWM周期也会发生变化。那么比较值是起到怎样的作用呢?下图就可以解释,下图为递增计数模式的示意图,当定时器以 PWM 模式工作时,会自动将 TIMx_CCRx 的值与 TIMx_CNT(计数寄存器)中的值做比较,当 TIMx_CNT 中的值小于 TIMx_CCRx 的值时,PWM 输出引脚输出高电平,大于时则输出低电平。

1.jpg

那么我们就可以知道占空比的计算公式为CCRX/ARR*100%,比如重载值为50000,比较寄存器值为25000,那么占空比为50%。

原理部分就到此为止下面就讲一下在RT-Thread Studio中的操作。

代码实践
首先我们选择使用PWM设备驱动程序

1.jpg

然后我们需要在硬件中选择使能PWM并且选择相应的定时器与通道,但是我们发现并没有我们需要的timer5,这时候我们就需要修改Kconfig文件了。

1.jpg

我们在board/Kconfig中添加如下代码,这里我们简单的修改其他PWM配置即可。

1.jpg

之后我们使用Env工具进入工程所在目录后输入scons --pyconfig即可进入编辑界面。

1.jpg

这里我们就可以看到我们在Kconfig中添加的外设,点击使能,保存修改。

1.jpg

之后输入scons --target=eclipse重新构建工程,等号后面的参数取决于你使用的IDE,比如我原来使用的是Clion那么就输入scons --target=cmake,RT-Thread Studio是基于eclipse的所以这里选择scons --target=eclipse

回到RT-Thread Setting可以看到我们增加的外设了。

1.jpg

之后我们就可以在main函数中编写代码,实现呼吸灯的功能了。

这里就是简单的修改了官方的PWM例程代码

/*

Copyright (c) 2006-2021, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2018-11-06 SummerGift first version
2021-06-30 crazt modify for robomaster C board
/
#include
#include
#include
#define PWM_DEV_NAME "pwm5" /
PWM设备名称 /
#define PWM_DEV_CHANNEL 1 /
PWM通道 */
struct rt_device_pwm pwm_dev; / PWM设备句柄 /
int main(void)
{
rt_uint32_t period, pulse, dir;
period = 500000; /
周期为0.5ms,单位为纳秒ns /
dir = 1; /
PWM脉冲宽度值的增减方向 /
pulse = 0; /
PWM脉冲宽度值,单位为纳秒ns /
/
查找设备 */
pwm_dev = (struct rt_device_pwm )rt_device_find(PWM_DEV_NAME);
if (pwm_dev == RT_NULL)
{
rt_kprintf("pwm sample run failed! can't find %s device!n", PWM_DEV_NAME);
return RT_ERROR;
}
/
设置PWM周期和脉冲宽度默认值 /
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
/
使能设备 /
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
while (1)
{
rt_thread_mdelay(50);
if (dir)
{
pulse += 5000; /
从0值开始每次增加5000ns /
}
else
{
pulse -= 5000; /
从最大值开始每次减少5000ns /
}
if (pulse >= period/2) /
经过测试发现占空比超过50%后对于亮度的影响较小因此就设置死区 /
{
dir = 0;
}
if (0 == pulse)
{
dir = 1;
}
/
设置PWM周期和脉冲宽度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
}
return RT_EOK;
}

最终烧录效果为蓝灯进行呼吸灯操作。

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

    关注

    22

    文章

    1437

    浏览量

    106569
  • 定时器
    +关注

    关注

    23

    文章

    2874

    浏览量

    111255
  • PWM波
    +关注

    关注

    0

    文章

    79

    浏览量

    16604
  • STM32F407
    +关注

    关注

    15

    文章

    169

    浏览量

    28736
  • RT-Thread
    +关注

    关注

    29

    文章

    1012

    浏览量

    38403
收藏 人收藏

    评论

    相关推荐

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT-Thread实时操作系统的编程指南文档,它旨在说明如何在RT-Thread实时操作系统上进行编程、把它使用到具体的应用中去。
    发表于 11-26 16:06 137次下载

    Rt-Thread】STM32输出PWM

    Rt-Thread 中STM32 输出PWM配置过程,通过设置不同频率PWM使蜂鸣器发出不同音调
    发表于 12-16 16:57 15次下载
    【<b>Rt-Thread</b>】STM32输出<b>PWM</b>

    RT-Thread Studio驱动SD卡

    RT-Thread ART-Pi STM32H750XBH6开发 H750开发开发软件:RT-Thread Studio参考博客:RT-Thread Studio使用SDIO驱动SD卡挂载文件系统官方资料:虚拟文件系统实验目的:使用开发上的SD卡接口,
    发表于 12-27 19:13 20次下载
    <b>RT-Thread</b> Studio驱动SD卡

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 4次下载
    <b>RT-Thread</b>文档_<b>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 4次下载
    <b>RT-Thread</b>文档_<b>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 4次下载
    <b>RT-Thread</b>文档_<b>RT-Thread</b> SMP 介绍与移植

    RT-Thread文档_PWM 设备

    RT-Thread文档_PWM 设备
    发表于 02-22 18:35 1次下载
    <b>RT-Thread</b>文档_<b>PWM</b> 设备

    RT-Thread全球技术大会:萤石研发团队使用RT-Thread的技术挑战

    RT-Thread全球技术大会:研发团队使用RT-Thread的技术挑战         审核编辑:彭静
    的头像 发表于 05-27 11:36 801次阅读
    <b>RT-Thread</b>全球技术大会:萤石研发团队使用<b>RT-Thread</b>的技术挑战

    RT-Thread全球技术大会:Kconfig在RT-Thread中的工作机制

    RT-Thread全球技术大会:Kconfig在RT-Thread中的工作机制               审核编辑:彭静
    的头像 发表于 05-27 14:49 975次阅读
    <b>RT-Thread</b>全球技术大会:Kconfig在<b>RT-Thread</b>中的工作机制

    RT-Thread全球技术大会:RT-Thread测试用例集合案例

    RT-Thread全球技术大会:RT-Thread测试用例集合案例           审核编辑:彭静
    的头像 发表于 05-27 16:34 1509次阅读
    <b>RT-Thread</b>全球技术大会:<b>RT-Thread</b>测试用例集合案例

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 3537次阅读
    <b>RT-Thread</b>学习笔记 <b>RT-Thread</b>的架构概述

    基于RoboMasterC型开发RT-Thread使用分享(一)

    C型上RT-Thread使用,本系列文章计划是给刚接触STM32和RT-Thread的同学看的,讲的会稍微基础一点。 硬件与开发环境
    的头像 发表于 01-05 12:10 1010次阅读

    基于RoboMasterC型开发RT-Thread使用分享(二)

    所有外设的工程的。在社区前辈的提醒后才知道通过基于芯片创建工程是没有办法Kconfig配置的。因此我在之后的教程中我会基于RT-Thread提供
    的头像 发表于 01-06 03:05 350次阅读

    基于RT-Thread Studio学习

    RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 1292次阅读
    基于<b>RT-Thread</b> Studio学习

    基于RoboMasterCRT-Thread使用分享—PWM扩展实验

    PWM5 CH1/2/3的部分已经提交PR了,各位之后导入工程时可以先看一下RT-Thread Setting中是否已经显示。
    的头像 发表于 10-13 15:39 466次阅读
    基于<b>RoboMasterC</b><b>板</b>的<b>RT-Thread</b>使用分享—<b>PWM</b>扩展实验