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

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

在这里插入图片描述
先选择Project Manager
利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第3张图片
按照如下配置,这里我们新建KEIL工程:

利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第4张图片
还是这个界面,选择Code Generator,设置如下:

利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第5张图片然后回到Pinout&Configuration设置界面,找到RCC并设置如下:

利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第6张图片
然后在Clock Configuration里面设置外部时钟:

利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第7张图片
到这里,工程的基本配置就可以了,一下每个模块的配置过程:
第一个模块,FREERTOS的配置,找到Middleware—>FREEROTS,勾选CMISIS_V1或者V2都行:

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

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

勾选中断:
利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第11张图片
默认的参数设置:

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

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

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

利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第24张图片其中还有一些需要定义的量请读者自行定义,另外凡是在该文件之外调用的函数,一律需要在头文件中声明。

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

利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第27张图片然后就是在freertos.c里面添加自己的任务函数

利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第28张图片
利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验_第29张图片
然后编译运行下载,就能基本实现功能,其中有一些基本常识没有提到,默认读者具备一定的C语言基础,另外由于第一次使用这个编辑器写,所以不太熟练,大部分都是截图,望见谅。
工程源代码下载地址:https://download.csdn.net/download/weixin_42985364/11266031

你可能感兴趣的:(嵌入式学习)