用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

这篇具有很好参考价值的文章主要介绍了用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.软件准备

(1)编程平台:Keil5

(2)CubeMX

2.硬件准备

(1)本此使用最小核心板STM32F103C8T6为例

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

(2)一个舵机:SG90或者MG996等均可

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

(3)ST-link 下载器

(4)杜邦线若干

3.关于舵机控制原理

        舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

4.CubeMX配置

(1)打开STM32CubeMX

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

(2)新建项目

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

 (2)选择所需要的芯片

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

  (3)配置RCC、SYS、时钟树

 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL) (4)配置定时器产生PWM波形

 本次配置四个通道,可同时输出四路PWM信号

舵机控制需要一个20ms左右的时基脉冲,用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

查手册可知TIM3在APB1总线上 

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

时钟配置时APB1的时钟为72MHz 

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

 此时产生PWM波形频率:72M / (72-1) / (20000-1) = 50HZ     

波形周期:1  / 50 = 20ms

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

 可配置舵机初始值,此次配置为500

通过计算可得500/(19999+1)=0.5ms/20ms     则对应为0°

 (4)设置路径、生成代码工程

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

 5、Keil5代码

(1)main函数

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,500);//0-180°此时对应0°
		HAL_Delay(2000);
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,2500);//此时对应180°
		HAL_Delay(2000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

 使用

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);

函数启动TIM的PWM输出,括号内第一个参数为启动的定时器,第二个参数为所用的通道数

使用

__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,500);

函数调整PWM的占空比,从而更改舵机角度,括号内第一个参数为启动的定时器,第二个参数为所用的通道数,第三个参数为占空比

注意:舵机使用5V供电时,C8t6同样需要5V供电,如使用3.3V供电会导致舵机转动缓慢或者不转动的现象出现!

本例程工程文件下载:如有需要可自取用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)-单片机文档类资源-CSDN下载文章来源地址https://www.toymoban.com/news/detail-405856.html

到了这里,关于用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32初学入门笔记(2):STM32CubeMX配置STM32输出可调PWM方波

    PWM是一种应用广泛的利用微处理器的数字输出来对模拟电路进行控制的一种技术(即对脉冲宽度的控制)PWM同时也是驱动蜂鸣器,驱动舵机,通信等重要的一环,而对于初学者而言,点完灯的下一个程序就是驱动蜂鸣器,本篇将讲述如何使用及调整PWM输出频率,占空比 工程文

    2024年02月14日
    浏览(45)
  • Arduino ESP8266控制SG90舵机输出PWM信号

    舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。 控制信号由接收机的通道进入信号调制芯片

    2023年04月26日
    浏览(74)
  • 搭建stm32电机控制代码框架(五)——Stm32CubeMx配置PWM

    采样配置完成后,进行PWM的配置。PWM的生成依赖于STM32的TIM1定时器,其功能完备如下图所示,电机控制中主要应用其PWM生成功能。 我们当前阶段的目标是生成占空比为50%的三路PWM,其开关频率为10kHz。 那么开始CubeMx的配置,依据stm32f405数据手册中地址总线部分内容,TIM1是挂

    2024年02月16日
    浏览(58)
  • STM32 PWM模式与输出比较模式的区别。PWM占空比不生效,在STM32CubeMX中配置PWM的两种模式——蓝桥杯嵌入式

      🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都已更新完毕,欢迎大家前往订阅本专题🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题 🎏【蓝桥杯嵌入式】蓝桥杯第十三届

    2023年04月15日
    浏览(80)
  • cubemx stm32 pca9685pw模块 16路PWM 可用于舵机驱动 驱动代码

    淘宝链接请点这里 淘宝资料资料: 链接:https://pan.baidu.com/s/1Kda-c7QdZdQ03FBMa0zeRA 提取码:1234 这个模块是 I2C 通信控制 16 路 PWM 的模块。 所有路的 频率 是统一设置的,所以每一路的频率都一样,但是每一路可以设置不同的占空比。 PCA9685的分辨率是12位,即占空比控制时,0-

    2024年02月06日
    浏览(48)
  • STM32CubeIDE学习笔记——使用HAL库PWM输出驱动舵机

    目录 PWM驱动简介 工程配置 代码编写 这里我采用的是STM32F103C8T6最小系统板,SG-90舵机实现功能。 舵机驱动角度和PWM占空比有关系,具体对应为50--0度  150--90度  250--180度,通过STM32的定时器功能输出PWM波来控制舵机进行转动。  时钟选择外部高速时钟 系统映射配置 时钟树设

    2024年02月13日
    浏览(43)
  • STM32 HAL库多路PWM没有输出踩坑记录

      之前只弄过单路的,这次想用4路PWM,CUBE里面一顿配置,生成,然后套用之前的代码: 这算是开启第一路了,心想后面无非就复制几条,改下通道的事了,无意中点了下TIM_CHANNEL_1,进头文件看看: 看到TIM_CHANNEL_ALL时,眼前一亮,连续开启1、2、3、4怎么都显得不够优雅,于

    2024年02月20日
    浏览(36)
  • STM32第七课:PWM控制SG90舵机

            学习完上一课的PWM控制LED小灯实现呼吸灯的效果,我们就可以进一步学习PWM控制舵机的效果了。PWM控制舵机相信会是一个更有意思的小实验的。          舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档

    2024年04月17日
    浏览(34)
  • STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)

    前言:本文章用cubeMX和keil来进行代码编写,实现STM32的相应功能 本文章使用的STM32核心板是STM32H743VIT6,如果使用的是其他的核心板操作过程类似,可以尝试使用此教程。 (1)首先点击左侧的Timers  (2)选择一个定时器配置PWM 我选择的是TIM5,如上图 点击TIM5 Mode的配置如下

    2024年02月19日
    浏览(55)
  • 12.[STM32]PWM脉宽调制-舵机控制(一篇足以)

    🍌 🍌🍌 作者简介:大家好啊,我叫DW,每天分享一些我新学到的知识,期待和大家一起进步 🍋 🍋🍋 系列专栏: STM32 🍎 🍎🍎 🍎🍎🍎 🌞小实验目标:控制舵机旋转🌞 🍊如有写得不好的地方欢迎大家指正🍊 创作时间:🍊🍊🍊2022年5月2日🍊🍊🍊 在机器人机电控

    2023年04月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包