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

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

3天内不再提示

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

RTThread物联网操作系统 来源:未知 2023-01-06 03:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

这次继续填坑,本次我们将介绍PWM功能的使用,实现呼吸灯的功能。那么接下来就直接开始我们的实践部分。

创建工程


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

rt-thread/bsp/stm32/stm32f407-robomaster-c at master · RT-Thread/rt-thread (github.com)

但是这个bsp文件暂时还没有支持板上的所有外设,因此我计划随着教程的编写,我也会帮忙维护这个bsp文件,将我们使用到的外设增加支持。便于大家后续使用,也满足我希望告诉大家Kconfig配置的计划。下图是目前bsp文件的外设支持情况。

d96d7718-8d2a-11ed-bfe3-dac502259ad0.png

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

我们这里点击导入

d99eefbe-8d2a-11ed-bfe3-dac502259ad0.png

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

d9a91228-8d2a-11ed-bfe3-dac502259ad0.png

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

d9d01594-8d2a-11ed-bfe3-dac502259ad0.png

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

da05b4d8-8d2a-11ed-bfe3-dac502259ad0.png

PWM教程之呼吸灯


CubeMX配置

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

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

da133af4-8d2a-11ed-bfe3-dac502259ad0.png

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

da2b8c44-8d2a-11ed-bfe3-dac502259ad0.png

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

da5ff952-8d2a-11ed-bfe3-dac502259ad0.png

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

PWM简介

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

da8aef22-8d2a-11ed-bfe3-dac502259ad0.png

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

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

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

定时器触发频率计算

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

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

da9b3a30-8d2a-11ed-bfe3-dac502259ad0.png

接着我们就要看CubeMX上我们配置的时钟树了,在整个时钟树的最右端,可以看到 APB1 和 APB2 两个总线的时钟频率设置,其中 APBx peripheral clocks 为挂载在总线上的定时器以外的外设提供时钟源,APBx timer clocks 为挂载在总线上的定时器提供时钟源。那么这里我们就可以知道TIM5时钟源频率为84MHz,时钟树的配置在上篇文章有较为详细的解释,这里就不重复了。这里解释一下前面的倍频为何是2,这里可以看到STM32F4xx中文参考手册,我们这里APB1预分频器为4,所以定时器时钟频率等于APB域的频率的两倍,所以倍频为2

daaf6a50-8d2a-11ed-bfe3-dac502259ad0.png

dac5423a-8d2a-11ed-bfe3-dac502259ad0.png

确定时钟源频率之后,我们就开始计算定时器触发频率,我们前面设置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 输出引脚输出高电平,大于时则输出低电平。

dacc71b8-8d2a-11ed-bfe3-dac502259ad0.png

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

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

代码实践

首先我们选择使用PWM设备驱动程序

dad41148-8d2a-11ed-bfe3-dac502259ad0.png

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

dae18d00-8d2a-11ed-bfe3-dac502259ad0.png

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

daf6fa28-8d2a-11ed-bfe3-dac502259ad0.png

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

db132c84-8d2a-11ed-bfe3-dac502259ad0.png

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

db28d75a-8d2a-11ed-bfe3-dac502259ad0.png

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

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

db64b70c-8d2a-11ed-bfe3-dac502259ad0.png

关于基于开发板工程添加外设相关操作大家可以参考这篇文章。

rt-thread/STM32系列外设驱动添加指南.md at master · RT-Thread/rt-thread (github.com)

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

这里就是简单的修改了官方的PWM例程代码,我自己就不过多的说明了,大家可以看看注释以及官方文档PWM设备 (rt-thread.org)

 1/*
 2*Copyright(c)2006-2021,RT-ThreadDevelopmentTeam
 3*
 4*SPDX-License-Identifier:Apache-2.0
 5*
 6*ChangeLogs:
 7*DateAuthorNotes
 8*2018-11-06SummerGiftfirstversion
 9*2021-06-30craztmodifyforrobomasterCboard
10*/
11#include
12#include
13#include
14#definePWM_DEV_NAME"pwm5"/*PWM设备名称*/
15#definePWM_DEV_CHANNEL1/*PWM通道*/
16structrt_device_pwm*pwm_dev;/*PWM设备句柄*/
17intmain(void)
18{
19rt_uint32_tperiod,pulse,dir;
20period=500000;/*周期为0.5ms,单位为纳秒ns*/
21dir=1;/*PWM脉冲宽度值的增减方向*/
22pulse=0;/*PWM脉冲宽度值,单位为纳秒ns*/
23/*查找设备*/
24pwm_dev=(structrt_device_pwm*)rt_device_find(PWM_DEV_NAME);
25if(pwm_dev==RT_NULL)
26{
27rt_kprintf("pwmsamplerunfailed!can'tfind%sdevice!
",PWM_DEV_NAME);
28returnRT_ERROR;
29}
30/*设置PWM周期和脉冲宽度默认值*/
31rt_pwm_set(pwm_dev,PWM_DEV_CHANNEL,period,pulse);
32/*使能设备*/
33rt_pwm_enable(pwm_dev,PWM_DEV_CHANNEL);
34while(1)
35{
36rt_thread_mdelay(50);
37if(dir)
38{
39pulse+=5000;/*从0值开始每次增加5000ns*/
40}
41else
42{
43pulse-=5000;/*从最大值开始每次减少5000ns*/
44}
45if(pulse>=period/2)/*经过测试发现占空比超过50%后对于亮度的影响较小因此就设置死区*/
46{
47dir=0;
48}
49if(0==pulse)
50{
51dir=1;
52}
53/*设置PWM周期和脉冲宽度*/
54rt_pwm_set(pwm_dev,PWM_DEV_CHANNEL,period,pulse);
55}
56returnRT_EOK;
57}

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

后续有空的话,我会写一篇小文章扩展教大家PWM进行呼吸灯aRGB调色,以及蜂鸣器唱歌的。

本次教程就讲到这里谢谢大家。

———————End———————

版权声明:

本文为RT-Thread论坛用户「goldengrandpa」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://club.rt-thread.org/ask/article/2240be90085f3b35.html

你可以添加微信:rtthread2020 为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!

db884cb2-8d2a-11ed-bfe3-dac502259ad0.gif

爱我就给我点在看

点击阅读原文回看开发者大会


原文标题:基于RoboMasterC型开发板的RT-Thread使用分享(二)

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


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

    关注

    32

    文章

    1636

    浏览量

    45200

原文标题:基于RoboMasterC型开发板的RT-Thread使用分享(二)

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread 的灵魂伴侣 | 技术集结

    RT-Thread正式启动硬件产品生态共建计划"你有创意,我帮你推广",我们寻找那些藏在工作台、实验室和创客空间的嵌入式硬件创意——无论是一块开发板、一个智能工具,还是一套完整的解决方案。
    的头像 发表于 03-23 19:25 6447次阅读
    <b class='flag-5'>RT-Thread</b> 的灵魂伴侣 | 技术集结

    恩智浦亮相RT-Thread 20周年开发者大会

    日前,“开源向实·生产力进化启示录”全球峰会暨RT-Thread 20周年开发者大会在上海成功举办,恩智浦作为RT-Thread的紧密合作伙伴,在活动中重磅亮相,展示双方在共建RT-Threa
    的头像 发表于 01-26 09:07 740次阅读

    开发者的RT-Thread大会「实在」指南:技术、开发板与真诚的见面礼

    各位开发者感谢各位一直以来对RT-Thread社区的参与和支持,本周六我们将和大家一起迎来我们的20周年开发者大会。为了回馈一直以来与RT-Thread共同成长的
    的头像 发表于 01-13 17:38 548次阅读
    给<b class='flag-5'>开发</b>者的<b class='flag-5'>RT-Thread</b>大会「实在」指南:技术、<b class='flag-5'>开发板</b>与真诚的见面礼

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 1257次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型<b class='flag-5'>开发</b>平台正式上市!| 产品动态

    如何移植rt-thread到野火imx6ull开发板上?

    求助如何将rt-thread移植到野火imx6ull(coretex-A7)开发板上,官方的bsp中没有imx6ull
    发表于 09-29 06:25

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 2355次阅读
    2025年<b class='flag-5'>RT-Thread</b><b class='flag-5'>开发</b>者巡回培训报名正式启动!

    使用RT-Thread studio 开发RT-Thread Nano项目的时候 串口的驱动是要自己写吗?

    刚入坑。使用RT-Thread studio 开发RT-Thread 标准项目的时候直接使用里边的串口uart_dev=rt_device
    发表于 09-26 08:14

    RT-Thread生态再壮大!六大硬核新品,同步上线 | 产品动态

    六大好物上新!RT-Thread生态迎来重磅更新!从核心硬件到强大工具,我们为您准备了6件全方位的开发利器:RT-ThreadART-PiII开发板STM32H7R7核心
    的头像 发表于 09-12 18:49 1486次阅读
    <b class='flag-5'>RT-Thread</b>生态再壮大!六大硬核新品,同步上线 | 产品动态

    明晚!基于RT-Thread 的 PID 控制实践,从驱动到算法到监控,一次学会!| 问学直播

    RT-Thread简单PID控制实践》精彩直播!本次直播将基于RT-Thread实时操作系统与NXPFRDM-MCXA156开发板,围绕驱动配置、控制算法实现、远
    的头像 发表于 09-01 17:04 1443次阅读
    明晚!基于<b class='flag-5'>RT-Thread</b> 的 PID 控制实践,从驱动到算法到监控,一次学会!| 问学直播

    Windows上使用ENV工具开发基于先楫MCU的RT-Thread应用

    前言Env是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menuconfig提供了简单易用的配置剪裁
    的头像 发表于 08-29 12:22 1716次阅读
    Windows上使用ENV工具<b class='flag-5'>开发</b>基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用

    在Ubuntu上开发基于先楫MCU的RT-Thread应用指南

    1、前言RT-ThreadEnv是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menu
    的头像 发表于 08-29 12:22 2099次阅读
    在Ubuntu上<b class='flag-5'>开发</b>基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用指南

    开发板畅游网络:RT-Thread CherryUSB 驱动 RNDIS 模块详解 | 技术集结

    本文通过在RT-Thread操作系统上,使用CherryUSB软件包作为USBHost协议栈,驱动AIR780E4GCat.1模块的RNDIS功能,并成功接入lwIP网络协议栈,最终在开发板上实现了
    的头像 发表于 07-02 17:04 3773次阅读
    让<b class='flag-5'>开发板</b>畅游网络:<b class='flag-5'>RT-Thread</b> CherryUSB 驱动 RNDIS 模块详解 | 技术集结

    从驱动到应用:RT-Thread环境下的SDIO开发指南

    目录硬件介绍搭建开发环境配置SDIO驱动挂载文件系统文件读写测试演示视频源码工程总结本文主要讲述RT-Thread环境下的SDIO开发指南,基于MCXN947开发板。1硬件介绍本次测评
    的头像 发表于 06-28 09:02 3035次阅读
    从驱动到应用:<b class='flag-5'>RT-Thread</b>环境下的SDIO<b class='flag-5'>开发</b>指南

    人形机器人敏捷开发新路径:RT-Thread以软件底座破解复杂系统难题 | 新闻速递

    5月29日,2025机器人开发者大会在上海张江科学城拉开帷幕,RT-Thread睿赛德受邀参会,与宇树、智元、傅利叶等企业共话机器人行业解决方案。在人形机器人本体专题论坛上,RT-Thread睿赛德
    的头像 发表于 06-04 14:03 1416次阅读
    人形机器人敏捷<b class='flag-5'>开发</b>新路径:<b class='flag-5'>RT-Thread</b>以软件底座破解复杂系统难题 | 新闻速递

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1426次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进