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

【超详细】基于大疆RoboMaster开发板C型的BMI088数据读取 这里以博世传感器公司产出的BMI088型号的IMU为例,其里面有3轴高精度加速度计和3轴高精度陀螺仪,其他的特性不再介绍同时这里的IMU是安装在大疆公司出产的RoboMaster开发板C型,单片机芯片是STM32F407IGH6,其外围电路已经设计好,只需要读取IMU数据即可。本篇不会介绍SPI、I2C等嵌入式通信协议,需要有一定嵌入式开发基础的同学来看文章末附代码。 阅读详情

这次继续填坑,本次我们将介绍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文件的外设支持情况。

1c56de14028f67315c3f93f31da430b2.jpeg

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

我们这里点击导入

2e56e5f0f630dba0dbb0fec444f3452e.png

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

4948dfe84ed90f1ab614a46a0e06658c.jpeg

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

c272c72f67f75229ad7bf5a3806ca458.jpeg

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

bb2bdbb4718a4980bacfa963c73c2551.png

PWM教程之呼吸灯


CubeMX配置

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

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

95ea458073b8f70f8bc09f8764a0d322.jpeg

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

dd56ff875f9f46902b57963e775fc426.png

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

4cb83ab39efdb2e5b13178cd244c061a.png

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

PWM简介

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

2653dc3fe41d557bda984a85735695dd.png

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

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

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

定时器触发频率计算

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

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

dfb72e7389fe273fb85af1ae0c39ed7b.png

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

9a0eab1961f2540b8f69b846c832d151.png

a2ca41516e8ceebfc597e3771ec21307.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 输出引脚输出高电平,大于时则输出低电平。

209479adb12f4e059e3e1579671148e5.png

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

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

代码实践

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

0b8e9adf1ac386f61ba2d976f4867445.png

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

6ddb132e652572e968fc77a9b8af7fb4.png

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

f02774b0f89a3ff805622613fdcbc804.png

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

263a524a324f08d6a8880e7622520e57.png

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

c32a9c7580e562554b16530ba89feed2.png

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

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

2364eaa50cf3a335a30903e8351f58a9.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-Thread Development Team
 3 *
 4 * SPDX-License-Identifier: Apache-2.0
 5 *
 6 * Change Logs:
 7 * Date           Author       Notes
 8 * 2018-11-06     SummerGift   first version
 9 * 2021-06-30     crazt        modify for robomaster C board
10 */
11#include <rtthread.h>
12#include <rtdevice.h>
13#include <board.h>
14#define PWM_DEV_NAME        "pwm5"  /* PWM设备名称 */
15#define PWM_DEV_CHANNEL     1       /* PWM通道 */
16struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */
17int main(void)
18{
19    rt_uint32_t period, pulse, dir;
20        period = 500000;    /* 周期为0.5ms,单位为纳秒ns */
21        dir = 1;            /* PWM脉冲宽度值的增减方向 */
22        pulse = 0;          /* PWM脉冲宽度值,单位为纳秒ns */
23        /* 查找设备 */
24        pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
25        if (pwm_dev == RT_NULL)
26        {
27            rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
28            return RT_ERROR;
29        }
30        /* 设置PWM周期和脉冲宽度默认值 */
31        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
32        /* 使能设备 */
33        rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
34        while (1)
35        {
36            rt_thread_mdelay(50);
37            if (dir)
38            {
39                pulse += 5000;      /* 从0值开始每次增加5000ns */
40            }
41            else
42            {
43                pulse -= 5000;      /* 从最大值开始每次减少5000ns */
44            }
45            if (pulse >= period/2)  /* 经过测试发现占空比超过50%后对于亮度的影响较小因此就设置死区 */
46            {
47                dir = 0;
48            }
49            if (0 == pulse)
50            {
51                dir = 1;
52            }
53            /* 设置PWM周期和脉冲宽度 */
54            rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
55        }
56    return RT_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官方微信交流群!

1ac9d5a92b023523d03c8f30fa35a7ba.gif

爱我就给我点在看540e7a076d7068fd75b0b004aad8b7e5.gif

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

RoboMaster大疆开发板C型入门学习(1)配置加流水灯(循环亮灯 大疆RM开发型c版入门,流水灯实验,点亮三色LED灯HAL_GPIO_WritePin,HAL_Delay函数的入门使用cubemx简单配置 阅读详情

相关推荐

大疆 RoboMaster 开发板A:C++ 开发的全方位指南

大疆开发板A 是一款高性能、低功耗的嵌入式开发平台,特别适用于机器人与自动化控制系统的开发。高性能处理器:搭载 ARM Cortex-M 系列处理器,提供强大的计算能力。丰富的接口:包括 I2C、SPI、UART 等多种通信接口,方便与各种传感器和外设连接。易于上手:提供了完善的开发环境和丰富的库函数,适合不同层次的开发者使用。强大的社区支持:拥有大量的开发者社区资源,可以获取丰富的开发经验和技术支持。我们将使用超声波传感器(如 HC-SR04)检测障碍物,并通过电机控制实现机器人的避障功能。

qq_38334677的博客 3140

Robomaster电控组小白的学习经验分享(一)——用大疆C型开发板控制GM6020电机转动到既定角度

我们可以从Robomaster官网上下载C板的用户使用手册,在编写代码的时候用户开发手册往往非常重要。引脚配置、IO说明等信息都可以从用户手册上获得。

weixin_73037889的博客 3万+

robomaster的c板教程

c板教程

RT-Thread STM32F407 Robomaster开发板C型BSP说明

本文档为 STM32F407 Robomaster 开发板C型 的 BSP (板级支持包) 说明。开发板资源介绍BSP 快速上手进阶使用方法通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。Robomaster 开发板C型 是大疆创新科技有限公司推出的一款基于 ARM Cortex-M4 内核的开发板。

华为奋斗者精神 4303

RoboMaster开发板C型嵌入式软件教程文档.pdf

RoboMaster开发板C型嵌入式软件教程文档.pdf

RM开发板,rm开发板怎么烧,C,C++

大疆Robomaster开发板相关资料,专为Robomaster设计提供。

基于 RT-Thread 的 RoboMaster 电控框架(三)

由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包…很难不选择 RT-Thread 进行项目开发。但也正是因为这些优点的覆盖面较广,很多初学者会觉得无从下手,但只要步入 RT-Thread 的大门,你就发现她的美好。这系列文档将作为本人基于 RT-Thread 开发 RoboMaster 电控框架的记录与分享,希望能帮助到更多初识 RT-Thread 的小伙伴,也欢迎大家交流分享,指正不足,共同进步。

m0_59551305的博客 645

匈牙利算法解决指派问题清晰流程

匈牙利算法解决指派问题清晰流程 百度词条上,指派问题(Assignment problem)是这么定义的:在满足特定指派要求条件下,使指派方案总体效果最佳。如:有若干项工作需要分配给若干人(或部门)来完成;有若干项合同需要选择若干个投标者来承包:有若干班级需要安排在若干教室里上课等。   一、做减法(归约): 行归约:每行元素减去该行最小元素。 列归约:每行元素减去该行最小元素。

siss0siss的博客 6万+

RoboMaster——配置C型开发板的CLion+STM32CubeMX开发环境

在我自己配环境的时候,参考了很多大佬们写的开发环境配置教程,比如稚晖君的【教程】手把手教你用Clion进行STM32开发【如何优雅の进行嵌入式开发】,帮助很大。但是因为使用的STM32芯片不同以及时间上的滞后性,所以还是有一些步骤存在差异,曾带给我一些困扰。又因为网上直接针对大疆C型开发板的配置教程偏少,而这又是RMers的必经之路,所以特此写一篇博客记录。

少说话,多做事,苦心孤诣,厚积薄发 5048

Apache-Plc4x-Modbus-Tcp学习记录(一)

Apache-Plc4x-Modbus-Tcp学习记录(一)

weixin_45325423的博客 6985

GEO生信数据挖掘实战:从临床信息提取到多维分组可视化(聚类与PCA)

本文以GSE1297数据集为例,详细讲解了GEO生信数据挖掘中临床信息提取与分组构建的实战流程。通过R语言解析样本元数据,利用字符串处理技术从文本中精准构建疾病与对照分组,并强调使用层次聚类图和PCA图进行可视化验证,确保分组合理性与分析可靠性,为后续差异表达等高级分析奠定坚实基础。

cheese的博客 361

面向RoboMaster的FreeRTOS使用的快速入门教程

面向RoboMaster的stm32freeRTOS教程

su_tang_kai的博客 1200

【Unity】制作简易三维场景

本文介绍如何制作一个三维场景

CiNian_的博客 5331

Robomaster大疆遥控器DT7&DR16介绍与C型开发板通信教程

DR16接收机输出的信号为标准的DBUS协议数据,当遥控器与接收机建立连接 后,接收机每隔14ms通过DBUS发送一帧18字节数据。数据内容包括左右两个摇杆的数据,左右上角的两个开关拨杆,以及左侧上方的云台俯仰控制拨轮。

2302_80641606的博客 1万+

STM32CUBEIDE调试中HardFault_Handler崩溃的故障分析器实战解析

本文详细解析STM32CUBEIDE调试中HardFault_Handler崩溃问题的实战处理方法。通过内置故障分析器自动诊断硬件异常原因,如内存越界、堆栈溢出等,提供图形化界面简化调试流程,并分享配置步骤、典型案例及高级调试技巧,帮助开发者快速定位和解决嵌入式系统崩溃问题。

night的博客 643

Allegro如何导入芯片的Pin Delay?

Allegro在做等长时,需要导入芯片的Pin Delay才能做真正的等长。因为有些芯片内部的引脚本身就是不等长的,例如海思的部分芯片。在右栏找到芯片U1,然后在Pin Delay栏下找一个PIN脚随便输入一个数值,这一步的目的是导出Pin Delay.csv文件的格式。4、用这份文件的格式,重新编辑需要导入芯片的Pin Delay,然后选择菜单File→Import→Pin delay。2、回到PCB,选择菜单File→Export→Pin delay,导出Pin Delay。

bhxc809751502的博客 5138

Vue-Tailwind实战项目:从零开始构建响应式管理后台界面

Vue-Tailwind是一个基于Vue.js和TailwindCSS的UI组件库,提供了可配置类的组件,让开发者能够轻松构建美观且响应式的管理后台界面。本文将详细介绍如何使用Vue-Tailwind快速搭建一个功能完善的管理后台,从环境搭建到组件应用,让你从零开始掌握响应式界面开发技巧。 ## 一、快速上手:Vue-Tailwind环境搭建 ### 1.1 安装Vue-Tailwind 首

gitblog_00052的博客 731

1、符号回归:原理、应用与实践

本文全面介绍了符号回归(Symbolic Regression)的原理、发展历程、核心算法及其在科学与工程领域的广泛应用。文章从基本概念出发,详细阐述了基于遗传编程的符号回归机制,并探讨了其在游艇水动力学、化学过程、锂离子电池、生物医学等多个领域的实际应用。同时,博文还涵盖了高级技术如知识集成、系数优化、预测区间计算及微分方程发现等内容,对比了开源与商业软件工具,并展望了未来发展趋势,旨在为研究人员和从业者提供一本实用的符号回归指南。

ipfs8storage的博客 248

RoboMaster开发板C型学习笔记

https://github.com/RoboMaster/Development-Board-C-Examples keil配置 点击5工程设置,进行工程相关设置,选择Output,其中Create HEX file为是否生成HEX文件,Browse Information为是否增加浏览信息,选择是,可以使用鼠标右键点击函数进行跳转操作,但会增加编译时长; 点击C/C++,其中1方框为工程...

Ning Yang 的博客 6496

记住这两个纯净版Windows11各系列版本系统下载网站

记住这两个纯净版Windows11各系列版本系统下载网站 HelloWindows是一个完整极致的Windows纯净系统下载站,不夹带任何私货,系统全部来源于微软官方原版,本站只是收录官方发布的系统以及工具,方便大家下载,请放心使用。永久在线:www.hellowindows.cn。HelloWindows.cn - 精校 完整 极致 Windows系统下载仓储站。

拥抱具身智能,昇腾Ascend C 6994

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

从零开始,用CubeMX让M2006电机转起来,大疆C板控制M2006电机

硬件环境 Robomaster 开发板C型 STLink V2 XT30电源 M2006电机+C610电调 CubeMX配置 基本的配置请参考《RoboMaster开发板C型嵌入式软件教程文档》中第0章和第14章。 https://github.com/RoboMaster/Development-Board-C-Examples/blob/master/RoboMaster%E5%BC%80%E5%8F%91%E6%9D%BFC%E5%9E%8B%E5%B5%8C%E5%85%A5%E5

asdashhv的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【RoboMaster】从零开始控制RM电机(2)-CAN通信原理及电调通信协议

RoboMaster电机控制--CAN通信原理以及电机通信协议

weixin_54448108的博客 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【亲测免费】 大疆RoboMaster开发板C型:高性能机器人开发利器

大疆RoboMaster开发板C型:高性能机器人开发利器 【下载地址】大疆RoboMaster开发板C型用户手册分享 本资源文件为大疆RoboMaster开发板C型的用户手册,旨在为用户提供详细的使用指南和开发参考。RoboMaster开发板C型是一款高性能的开发板,适用于机器人比赛、科研教育、自动化设备等多个领域 ...

gitblog_06669的博客 1420

RoboMaster开发板C语言示例项目:从入门到实战的嵌入式开发指南

你是否曾面临这些开发痛点?硬件配置繁琐到劝退,例程碎片化难以串联,从基础控制到机器人功能的进阶无门。这个项目正是为解决这些问题而生——它像一套精心编排的嵌入式开发成长体系,让你避开"从 datasheet 到实战"的陡峭学习曲线。 **你将获得**: - 开箱即用的20+个功能模块,覆盖从LED控制到机器人底盘的全流程开发 - 经过工程验证的代码框架,避免重复造轮子 - 从裸机开发到RTOS多任

gitblog_00458的博客 1082

RoboMaster开发板C型嵌入式软件开发指南

欢迎阅读本指南,您将学习如何高效使用RoboMaster开发板C型进行嵌入式软件开发。作为连接硬件与应用的关键环节,嵌入式软件决定了机器人的感知能力、运动精度和任务执行效率。本模块将帮助您建立对项目的整体认知,为后续开发奠定基础。 ### 开发板与项目定位 RoboMaster开发板C型基于STM32F407微控制器构建,专为机器人应用优化设计。该开发板集成了丰富的外设接口,包括GPIO、UA

gitblog_01058的博客 1022

【亲测免费】 RoboMaster 开发板 C 语言示例项目教程

RoboMaster 开发板 C 语言示例项目(Development-Board-C-Examples)是一个开源项目,旨在为使用 RoboMaster 开发板的用户提供一系列 C 语言示例代码。这些示例代码涵盖了从基础的 LED 控制到复杂的机器人功能实现,帮助开发者快速上手并深入理解 RoboMaster 开发板的使用。 项目的主要特点包括: - **丰富的示例代码**:涵盖了从基础的硬件...

gitblog_00971的博客 1379
上一篇: 一起学习下RT-Thread的C语言编码规范
下一篇: RT-Thread操作系统的FreeRTOS兼容层
RT-Thread物联网操作系统
博客等级 码龄6年 2万+粉丝 392原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值