前两周做基于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配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验相关推荐

  1. 利用Openfiler配置基于文件系统的网络存储

    一.Openfiler简介 Openfiler是一个操作系统,其提供基于文件的网络附加存储和基于块的存储区域网络功能. Openfiler支持的网络协议包括:NFS,SMB/CIFS,HTTP/Web ...

  2. 基于VHDL超声波测距实验

    共有两个代码文件detect_distance_3和process_4添加到quartus II 9.0 工程文件中, 这两个文件分别对应作业中3和4 按照软件使用流程,编译,仿真添加激励信号,出波形 ...

  3. 基于STM32F103ZET6的(单/三)路HC-SR04超声波测距+TFTLCD实时显示+距离报警

    一.成果图 说明:本程序的源码地址:https://github.com/Lfy-YF/Campus-Project            CSDN下载连接:https://download.csdn ...

  4. STM32CubeMX配置freertos配置任务(一)

    使用STM32CubeMX 配置Freertos 生成一个任务点亮LED stm32cubemx STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具, 允许用 ...

  5. 基于正点原子F407探索者STM32CUBEMX配置LWIP

    基于正点原子F407探索者STM32CUBEMX配置LWIP 无操作系统: Ping_RAW: 第一步:配置系统时钟 第二步:打开定时器6 第三步:配置ETH 配置phyaddr 配置ETH的参数 配 ...

  6. STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化

    STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化 基于STM32H743VI 使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些 ...

  7. 利用C#开发基于snmpsharpnet基础的SNMP开发应用

    由于项目的需要,需要使用SNMP来进行相关的开发,需要在我的程序中利用SNMP的Trap协议给指定的系统程序发送相关的设备数据信息, 使得其系统能够监控到设备的最新信息以及状态,对方只是提供了一个Ja ...

  8. bigru参数计算_[数据挖掘]华中科技大学 李黎 周达明:基于CNN-BiGRU模型的操作票自动化校验方法...

    原标题:[数据挖掘]华中科技大学 李黎 周达明:基于CNN-BiGRU模型的操作票自动化校验方法 智能变电站操作票校验是保障站内操作准确无误的重要环节,当前基于经验的人工校验方法主观性强,校验效率较低 ...

  9. 利用VMM建立基于事务的层次化验证平台

    摘要:VMM是一种基于 SystemVerilog语言的验证方法学,它通过引入断言.抽象化.自动化与重用这四种机制提高了项目验证的生产率.本文通过一个实例介绍怎样利用VMM建立基于事务的可重用的层次化 ...

最新文章

  1. 自然语言处理NLP之语义相似度、语言模型、doc2vec
  2. python struct pack解析_python struct pack
  3. bootstrap grid php,bootstrap grid用法
  4. lucene索引搜索_Lucene –快速添加索引和搜索功能
  5. Spring MVC:表单处理卷。 4 –单选按钮
  6. 抽象类(Abstract)和接口的不同点、共同点(Interface)。
  7. Unity 官方网站
  8. Solrj 存储一个point类型的字段
  9. js怎么select 选中的值
  10. 我用Python把抖音上的美女图片转字符画,期望的AI目标更进一步【机器学习算法实战小项目,k聚类算法图片转化字符画】
  11. 新型计算机作文1000,科幻的作文1000字(精选9篇)
  12. 电路分析(电路原理)
  13. java分形_【Java之八】15分钟了解分形之朱利亚集
  14. 电大计算机教学自我测评,电大计算机自我鉴定.doc
  15. revit2016对应lumion版本_revit如何导入lumion?revit文件转化成lumion文件有诀窍!
  16. Mac OX 下方便的微信语音,图片,视频等导出方式
  17. 微信公众号迁移时同一个公司两个微信号公证问题
  18. STM32F4应用-串口通信
  19. c语言读取midi文件举例子,c# – 使用NAudio从MIDI文件中读取音符
  20. 素描嘴巴如何画的饱满?学学这些方法和干瘪嘴巴说再见!

热门文章

  1. 美服疯狂坦克辅助瞄准外挂C#版开发(二)全局鼠标键盘HOOK
  2. wwe拳王争霸赛搞笑报名表源码
  3. 几何向量:直线和平面
  4. 哈佛商学院最受欢迎的领导课
  5. 第十八周 6.27 --- 7.3
  6. css特效实现表情包
  7. cad无法安装_CAD软件下载好了,为什么安装不上?别急!试试这两个方法!
  8. cv2.imread(filename, 0)和先img=cv2.imread(filename, 1)再cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)得出灰度图区别
  9. 共享2018年公司年终总结简单PPT模板
  10. Halcon尺寸测量之二维计量模型(create_metrology_model)