当前位置: 首页 > news >正文

利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验

前两周做基于STM32F407芯片的嵌入式系统设计的实验,主要完成利用超声波测距(电脑上用串口显示超声波所测距离,障碍物近于20cm时,使LED灯闪烁,并且可以通过串口更改报警距离)和利用编码器读取电机转速(利用串口显示)并调节电机转速稳定在800r/min左右。整个过程利用STM32CubeMX生成基本代码,自己所需要写的程序很少,很快就可以做完。
首先将STM32CubeMX和KEIL升级到最新版本。
首先打开STM32CubeMX,找到自己需要使用的芯片,建立新的工程:
双击图标打开软件,打开时会有自哦对那个检查更新,不用管,直接关掉:双击图标,打开软件
左边有很多选项,找到自己使用的哪一个,直接双击:
双击后会自动打开新工程页面:

在这里插入图片描述
先选择Project Manager
在这里插入图片描述
按照如下配置,这里我们新建KEIL工程:

在这里插入图片描述
还是这个界面,选择Code Generator,设置如下:

在这里插入图片描述然后回到Pinout&Configuration设置界面,找到RCC并设置如下:

在这里插入图片描述
然后在Clock Configuration里面设置外部时钟:

在这里插入图片描述
到这里,工程的基本配置就可以了,一下每个模块的配置过程:
第一个模块,FREERTOS的配置,找到Middleware—>FREEROTS,勾选CMISIS_V1或者V2都行:

在这里插入图片描述然后再Configuration—>Task and Queues里面添加任务,这里我们添加两个任务,如分别是超声波测距和电机控制两个任务
在这里插入图片描述
然后可以生成代码看一下程序的内容,电机右上角的GENERATE CODE即可,代码里面只有一个空白的FREERTOS系统和两个等待添加代码的空任务。
下面我们配置UART4串口通信,并更改为利用PC10和PC11进行通信。这里我们选择异步通信模式:

在这里插入图片描述

勾选中断:
在这里插入图片描述
默认的参数设置:

在这里插入图片描述

然后注意别忘了更改PC10和PC11引脚:

在这里插入图片描述这里需要添加一段代码,作为回调函数,添加之后只需要包含stdio.h就可以在任意位置用printf打印到串口,之后我们会讲到,现在继续配置定时器,我们配置TIM2作为定时中断,每5ms读取编码盘数据计算电机转速,配置TIM4作为定时计数器,主要给超声波测距过程中计算超声波往返的时间使用,配置TIM3作为正交编码模式,连接编码盘,配置TIM8输出频率为1000的PWM波。
对于TIM2的配置如下:Clock source选择internal Clock,Prescaler = 84-1,Period = 5000-1,并在NVIC Settings里面勾选中断。
在这里插入图片描述对于TIM3配置为正交编码模式,由于本人的STM32CubeMX不能使用ETR引脚,所以用TIM2定时读取转速,TIM3的配置如下,配置结果时每转一圈计数值刚好是0~360,配置完之后别忘了按要求更改TIM3作为编码模式使用的引脚:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里引脚使用的是PC6和PC7
在这里插入图片描述
下面配置TIM4,这里和配置TIM2一样,只是分频系数和计数值有区别:
在这里插入图片描述
下面配置TIM8输出PWM波,首先再channel4勾选PWM Generation CH4
在这里插入图片描述
配置参数:
在这里插入图片描述
然后更改我们要使用的引脚:
在这里插入图片描述
以上就是定时器的配置过程,除此之外,还需要继续配置四个引脚作为超声波传感器,超声波指示,电机转向控制引脚和电机报警引脚(当电机负载太大而达不到不可能达到要求的转速是点亮)
在这里插入图片描述
至此,所有需要使用STM32CubeMX配置的东西就结束了,下面生成代码,然后需要添加一部分代码。
现在main.c里面添加一部分代码:

* /*USER CODE BEGIN 4 */
int fputc(int ch,FILE *f)			//与串口输出有关
{
  HAL_UART_Transmit(&huart4, (uint8_t*)&ch,1,5000);
  return ch;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)		//TIM2定时中断回调函数,计算电机转速
{
    if (htim->Instance == htim2.Instance)
    {
   Previous_Data=Latter_Data;
   Latter_Data=__HAL_TIM_GET_COUNTER(&htim3);
   if(Latter_Data>=Previous_Data)
    Motor_Speed=(Latter_Data-Previous_Data)*200*60/360;
   if(Latter_Data<Previous_Data)
    Motor_Speed=(360+Latter_Data-Previous_Data)*200*60/360;
   }
}

在这里插入图片描述其中还有一些需要定义的量请读者自行定义,另外凡是在该文件之外调用的函数,一律需要在头文件中声明。

第二个部分,在usart.c中添加的部分:
在这里插入图片描述
在tim.c中添加的部分,这个是用来在运行过程中改变PWM波占空比的:
在这里插入图片描述
在gpio.c中添加的部分,这个是为了将超声波的引脚设置为下拉输入的:
在这里插入图片描述
调节电机转速的代码,这部分是自己搞得,比较简单得方法,很弱智建议读者去网上找PID控制算法。
int DIYpid(int pulse)
{
int Target=800; //目标转速
int Speeed;
Speeed=ReadSpeed();
if(Speeed==800)
return pulse;
if(Target<Speeed)
{
pulse=pulse-(Speeed-Target)/10;
}
else
{
pulse=pulse+(Target-Speeed)/10;
}
if(pulse>1000) pulse=1000;
TIM8_SetPulse(pulse);
return pulse;
}
然后下面的就是读取超声波所测数据程序了:

在这里插入图片描述然后就是在freertos.c里面添加自己的任务函数

在这里插入图片描述
在这里插入图片描述
然后编译运行下载,就能基本实现功能,其中有一些基本常识没有提到,默认读者具备一定的C语言基础,另外由于第一次使用这个编辑器写,所以不太熟练,大部分都是截图,望见谅。
工程源代码下载地址:https://download.csdn.net/download/weixin_42985364/11266031

相关文章:

  • 关于指针和内存的几个问题
  • 使用STM32CubeMX配置STM32串口
  • 浅谈C++函数的参数
  • 使用STM32CubeMX新建Keil工程
  • 使用QT新建工程并成功编译
  • 旅游整理
  • 简单几步向Android Studio导入Eclipse工程
  • Xmind免费安装使用教程
  • 今天日志
  • Ubuntu下JetBrains 系列软件的免费安装教程
  • 笑傲江湖与三层交换、路由......
  • 清华镜像源安装tensorflow
  • MSNShell效果,来个养眼的......
  • 清华镜像源安装opencv或opencv-contrib
  • 面向对象技术第一讲 多态性(原创)
  • 【Leetcode】101. 对称二叉树
  • gitlab-ci配置详解(一)
  • HashMap剖析之内部结构
  • Java编程基础24——递归练习
  • JS 面试题总结
  • leetcode讲解--894. All Possible Full Binary Trees
  • PAT A1017 优先队列
  • PHP变量
  • Python 基础起步 (十) 什么叫函数?
  • Solarized Scheme
  • 第十八天-企业应用架构模式-基本模式
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 机器学习学习笔记一
  • 树莓派 - 使用须知
  • 学习笔记TF060:图像语音结合,看图说话
  • 鱼骨图 - 如何绘制?
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​插件化DPI在商用WIFI中的价值
  • (2022 CVPR) Unbiased Teacher v2
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (分布式缓存)Redis哨兵
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (四)鸿鹄云架构一服务注册中心
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)Sublime Text3配置Lua运行环境
  • (转)visual stdio 书签功能介绍
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET CLR Hosting 简介
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net 生成二级域名
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [CSS]中子元素在父元素中居中
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [HNOI2015]实验比较