STM32CubeMX-定时器产生PWM驱动舵机

STM32CubeMX笔记-定时器产生PWM驱动舵机

一、初始准备

1.硬件平台

使用正点原子STM32F4探索者

在这里插入图片描述

2.软件平台

STM32CubeMX软件平台

Keil5软件平台

STM32CubeProgrammer下载平台
在这里插入图片描述

二、操作步骤

1.CubeMX生成初始化代码

1.1 建立工程(通用步骤)
  • 芯片选择

打开cube软件,点击MCU选择
在这里插入图片描述
F4探索者的主控为STM32F407ZET6,所以在搜索框找到STM32F407ZE后点击具体芯片,再开始工程
在这里插入图片描述

  • 配置时钟源

我们点开SystemCore(系统内核设置),再点击RCC配置HSE和LSE时钟源,这里我都选择使用外部时钟,配置后,我们可以看到右边芯片引脚分配图的两个时钟源引脚点亮,表示配置完成
在这里插入图片描述

  • 配置时钟树

我们进入ClockConfiguration配置时钟树,使时钟的输入路径和大小符合我们预期,精英板的晶振和时钟倍频如下

在这里插入图片描述

一般配置正确时颜色蓝白为主,配置错误时则会出现紫色,提示我们要修改值

在这里插入图片描述

1.2 PWM配置步骤
  • 查看原理图引脚

我们使用定时器3的通道1,默认映射IO口为PA6
在这里插入图片描述

  • 配置TIM为PWM

配置界面找到Timers配置栏,点击TIM3

在这里插入图片描述
配置TIM3时钟为内部时钟(internal clock),同时选择通道1为PWM模式(PWM Generation CH1)

在这里插入图片描述
配置TIM3的具体参数,主要为分频值和重装载值,修改分频值为720对应一个计数为1/(72M/分频值)=10us,重装载值为2000,使一个PWM的周期为2000*1us=20ms一个周期,符合舵机50hz频率驱动要求

在这里插入图片描述

1.3生成代码(通用步骤)

点击进入Project Manager 配置生成工程的名字,存储路径**(不要有中文)**以及编译器,这里我们选MDK-ARM(Keil被收购后改名)
在这里插入图片描述
配置生成选项,主要为下面三大块,第一个我们选择只拷贝必要的库,第二个选择为每个外设生成.c和.h文件,保存之前的用户代码,以及删除之前的生成代码,第三个不选择

PS:用户代码段是一下注释之间的代码,只有原始的用户代码段注释才有效,用户自己添加的无效

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

在这里插入图片描述
最后点击生成代码
在这里插入图片描述

2.编写代码

打开MDK,在主函数中用户代码段编写如下代码:

/* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */  
/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,100);
		HAL_Delay(1000);
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,150);
		HAL_Delay(1000);
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,200);
		HAL_Delay(1000);
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,150);
		HAL_Delay(1000);
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,100);
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */

其中HAL_TIM_PWM_Start用于开启使用到的定时器通道;__HAL_TIM_SET_COMPARE为设置定时器通道比较值的调用函数,传入参数依次为为定时器编号、通道编号、设置的比较值;代码编写完成后,点击编译,编译结果无报错

在这里插入图片描述

3.程序下载,观察现象(通用步骤)

程序下载我一般用两种方式:

第一种是使用MDK自带的下载环境下载程序,我们给单片机连接ST-Link后配置下载,点击魔术棒,选择debug

在这里插入图片描述

选择ST-link后,点击setting

在这里插入图片描述

添加对应F4的Flash

在这里插入图片描述

keil界面点击下载

在这里插入图片描述

第二种是使用Stm32Programmer下载软件,该下载软件下载方式多,下载快,下面我使用st-link下载

打开软件,点击connect左边选择stlink后再点击connect连接下载器

在这里插入图片描述

点击open file,找到工程路径下MDK文件夹下工程生成的hex文件

在这里插入图片描述

之后点击downlod下载,下载结果如下

在这里插入图片描述

3.实验现象

舵机循环转动:

请添加图片描述

请添加图片描述
请添加图片描述

### 使用STM32CubeMX配置PWM驱动六路舵机 #### 创建新项目并选择微控制器型号 启动STM32CubeMX软件,创建一个新的工程项目,并选择适合目标板子的MCU型号。如果使用的是STM32F103C8T6,则在此阶段选定该器件。 #### 定义时钟树结构 进入Clock Configuration页面调整PLL设置和其他选项来定义系统的主频以及外设所需的频率。确保所选定时器的工作频率满足PWM输出的需求[^1]。 #### 配置GPIO引脚功能 转到Pinout & Configuration界面,在此部分为每一路要连接舵机的IO口分配TIMx_CHy (其中x表示使用定时器编号,y代表通道号),这些通道将会作为PWM信号源。由于需要控制六个舵机,因此至少需要用到两个具备互补模式或者独立四通道能力的高级定时器(TIM1,TIM8)或三个基本/通用定时器组合(TIMER2-TIMER5)[^2]。 #### 设置定时器参数 针对每一个被指派给舵机控制任务的定时器执行如下操作: - **Mode**: 选择`Output Compare` - **Channel Mode**: 对应于之前设定好的GPIO映射关系分别激活各通道 - **Polarity**: 正常极性(Normal Polarity) - **Idle State**: Active High(高电平有效),这取决于具体硬件电路设计需求 - **OC Fast mode enable/disable**, `Disable`通常就足够用了除非有特殊应用场景要求启用快速模式 - 设定ARR寄存器值决定载波周期长度(例如对于标准RC伺服而言通常是20ms) - 初始CCRn寄存器数值对应最小占空比位置即起始脉冲宽度约为0.5ms左右[^3] 完成上述步骤之后保存配置导出代码框架至IDE环境准备后续编程工作。通过调用HAL中的API接口如`__HAL_TIM_SET_COMPARE()`改变比较匹配值从而动态调节实际发出PWM波形的具体特性进而达到精准操控多个舵机的目的。 ```c // 假设已经初始化好定时器句柄htimX uint32_t angle_to_compare_value(float angle){ // 将角度转换成相应的计数器值 } void set_servo_angle(uint8_t channel,float angle){ uint32_t compareValue = angle_to_compare_value(angle); switch(channel){ case 1: __HAL_TIM_SET_COMPARE(&htimX, TIM_CHANNEL_1, compareValue); break; case 2: __HAL_TIM_SET_COMPARE(&htimX, TIM_CHANNEL_2, compareValue); break; // ...其他case分支处理更多通道... } } ```
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Top嵌入式

投喂个鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值