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

STM32 HAL 180°舵机控制 PWM/中断方法

舵机硬件接线具体电源看购买的商品详情页不同商家与型号可能有差异舵机工作原理舵机控制需要一个20MS左右的时基脉冲该脉冲的高电平部分一般为0.5MS-2.5MS范围内的角度控制脉冲部分对应的控制关系为设置ARR为20000-10.5MS-------0度-----占空比0.5%--5001.0MS-----45度-----占空比1.0%--10001.5MS------90度----占空比1.5%--15002.0MS-- -135度-----占空比2.0%--20002.5MS- --180度-----占空比2.5%--2500舵机从上面看是逆时针转动的,这两个例程烧录后现象都是舵机逆时针角度增加可增加90°左右1.直接PWM控制cubemx配置使用TIM2 CHANNEL1黄色线接PA0PSC72-1,ARR20000-1,记得配置时钟为72MHz完整代码//servo.h #ifndef __SERVO_H #define __SERVO_H #include stm32f1xx_hal.h //定义一个结构体用于管理舵机的角度 struct SERVO{ uint16_t angel; uint16_t max_angel; uint16_t min_angel; }; void Servo_Init(void); void Servo_Set_Angel(uint16_t angel); void Servo_Up(uint8_t unit_angel); void Servo_Down(uint8_t unit_angel); #endif//servo.c #include servo.h extern TIM_HandleTypeDef htim2; //根据需要设置初始角度最大角度最小角度 struct SERVO servo {90,180,0}; //初始化 void Servo_Init(void) { //HAL_TIM_Base_Start(htim2); HAL_TIM_PWM_Start(htim2,TIM_CHANNEL_1); //上电后舵机角度为设置的初始角度 Servo_Set_Angel(servo.angel); } //封装舵机控制函数 void Servo_Set_Angel(uint16_t angel) { uint16_t pwm (2000/180)*angel500; __HAL_TIM_SET_COMPARE(htim2,TIM_CHANNEL_1,pwm); } //舵机角度增加单位角度函数 void Servo_Up(uint8_t unit_angel) { //更新角度 servo.angel unit_angel; //限幅 if(servo.angel servo.max_angel) { servo.angel servo.max_angel; } //设置角度 Servo_Set_Angel(servo.angel); } //舵机角度减小单位角度函数 void Servo_Down(uint8_t unit_angel) { //更新角度 servo.angel unit_angel; //限幅 if(servo.angel servo.min_angel) { servo.angel servo.min_angel; } //设置角度 Servo_Set_Angel(servo.angel); }//main.c /* USER CODE BEGIN Header */ /** ****************************************************************************** * file : main.c * brief : Main program body ****************************************************************************** * attention * * Copyright (c) 2026 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 usart.h #include gpio.h /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include servo.h #include encoder.h #include uart.h /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define UNIT_ANGEL 5 /* 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_TIM2_Init(); MX_TIM3_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ Servo_Init(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { Servo_Up(UNIT_ANGEL); HAL_Delay(1000); /* 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 */2.定时中断方法cubemx配置信号线随便选一个引脚为输出模式即可需要一个TIM做定时器模拟20ms周期的pwm信号这里选择PB10为控制引脚TIM1做10us定时PSC72-1,ARR10-1T (PSC-1) * (ARR-1) / 时钟频率记得开启中断PB10默认配置即可速度那里也可以选择中速完整代码//servo.h #ifndef __SERVO_H #define __SERVO_H #include stm32f1xx_hal.h //使用宏定义使代码更简洁 #define Servo_H HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET) #define Servo_L HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET) //定义管理舵机pwm的结构体 struct SERVO{ uint16_t pwm; uint16_t max_pwm; uint16_t min_pwm; }; void Servo_Init(void); void Servo_Set_PWM(uint32_t pwm); void Servo_Up(uint8_t unit_pwm); void Servo_Down(uint8_t unit_pwm); #endif//servo.c #include servo.h extern TIM_HandleTypeDef htim1; //根据需要设置 初始值最大值最小值 struct SERVO servo {150,250,50}; //计数值 使用volatile保护 static volatile uint64_t servo_cnt; //初始化 开启时钟 设置低电平 计数器置0 void Servo_Init(void) { HAL_TIM_Base_Start_IT(htim1); Servo_Set_PWM(servo.pwm); Servo_L; servo_cnt 0; } //封装舵机控制函数 //其实这个函数可以不封装的直接在Servo_Up和Servo_Down中限幅也可以的 void Servo_Set_PWM(uint32_t pwm) { //限幅 if(pwm servo.max_pwm ) { servo.pwm servo.max_pwm ; } else if(pwm servo.min_pwm ) { servo.pwm servo.min_pwm ; } //最后这个分支很重要笔者开始忘记写这个debug发现servo.pwm一直停留在155找了好久原因 呜呜呜 else { servo.pwm servo.pwm ; } } //舵机角度增加单位pwm函数 void Servo_Up(uint8_t unit_pwm) { servo.pwm unit_pwm; Servo_Set_PWM(servo.pwm); } //舵机角度减小单位pwm函数 void Servo_Down(uint8_t unit_pwm) { servo.pwm - unit_pwm; Servo_Set_PWM(servo.pwm); } //使用高电平占比时间模拟pwm void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim htim1) { //每10us进入中断一次计数值1 servo_cnt; //模拟pwm未到达计数值时为高电平到达后为低电平 if(servo_cnt servo.pwm) { Servo_H; } else if(servo_cnt servo.pwm) { Servo_L; } //计数到2000 即20ms周期清零计数值 if(servo_cnt 2000) { servo_cnt 0; } } }写在最后中断的方法是在定时器资源不充足时的弥补方法但值得一提的是频繁的中断会影响别的外设的工作运行。综合下来舵机控制其实直接使用PWM控制是比较好的选择但是中断的方法也可以参考学习一下。舵机要注意转向特别是机械设计机械臂时还有注意安装舵机指机械臂等前一定要上电调笔者开始参加比赛当时机械队友设计的机械臂为连杆码跺结构没有注意转向我作为电控也没有意识到要先上电调整于是当时一上电控制机械臂直接断裂。还有我提供的代码参考没有直接放在main.c的封装一下比较好。这里之所以定义结构体是因为我觉得你们学习舵机可能是想控制机械臂这时可以使用这个结构体控制各个轴系和爪子至于如何实现完整的机械臂控制你们可以积极尝试我提供一个截图参考思路

相关文章:

STM32 HAL 180°舵机控制 PWM/中断方法

舵机硬件接线具体电源看购买的商品详情页,不同商家与型号可能有差异舵机工作原理舵机控制需要一个20MS左右的时基脉冲,该脉冲的 高电平部分一般为0.5MS-2.5MS范围内的角度控制脉冲部分, 对应的控制关系为(设置ARR为20000-1&#x…...

Pi0 Robot Control Center作品集:12种常见家庭场景指令响应效果对比

Pi0 Robot Control Center作品集:12种常见家庭场景指令响应效果对比 1. 项目概览:重新定义家庭机器人交互体验 Pi0机器人控制中心是一个基于先进视觉-语言-动作模型的通用机器人操控界面。这个项目通过专业的全屏Web交互终端,让用户能够使用…...

DeepChat一文详解:Ollama REST API与DeepChat前端通信的WebSocket心跳与流式响应机制

DeepChat一文详解:Ollama REST API与DeepChat前端通信的WebSocket心跳与流式响应机制 1. DeepChat是什么:一个真正私有的深度对话空间 你有没有想过,和AI聊天时,自己的问题、思考、甚至那些还没成型的想法,会不会悄悄…...

Qwen-Turbo-BF16效果惊艳:体积雾+霓虹反射+雨滴地面物理渲染实测

Qwen-Turbo-BF16效果惊艳:体积雾霓虹反射雨滴地面物理渲染实测 1. 引言:突破传统限制的新一代图像生成方案 你是否曾经遇到过这样的困扰:使用AI生成图片时,明明输入了详细的描述,却得到了全黑的图像?或者…...

开源可部署CLAP音频分类应用:无需代码基础,通过Web界面完成专业级零样本语音理解

开源可部署CLAP音频分类应用:无需代码基础,通过Web界面完成专业级零样本语音理解 你是否遇到过这样的场景?手头有一段音频,可能是会议录音、环境声音,或者一段音乐,你想快速知道它是什么内容,但…...

Hunyuan模型部署最佳实践:config.json关键字段说明

Hunyuan模型部署最佳实践:config.json关键字段说明 1. 引言 当你拿到一个像HY-MT1.5-1.8B这样的翻译模型,第一反应可能是赶紧跑起来试试效果。但真正要把它用得好、用得稳,你会发现那个不起眼的config.json文件才是关键。 这个文件就像是模…...

mT5分类增强版中文-baseWebUI定制:添加历史记录本地存储与JSON导出功能

mT5分类增强版中文-baseWebUI定制:添加历史记录本地存储与JSON导出功能 1. 项目背景与价值 如果你正在使用文本增强工具来处理中文内容,可能会遇到一个常见问题:每次生成的结果都需要手动复制保存,时间一长就找不到之前的工作记…...

YOLO12实战案例:安防监控中实时人车检测的低成本GPU算力方案

YOLO12实战案例:安防监控中实时人车检测的低成本GPU算力方案 1. 项目背景与需求 在安防监控领域,实时人车检测一直是核心需求。传统方案往往面临两个痛点:要么使用昂贵的高端GPU导致成本过高,要么使用轻量级模型但检测效果不佳。…...

SmallThinker-3B-Preview实战教程:构建个人AI草稿引擎(支持Markdown输出)

SmallThinker-3B-Preview实战教程:构建个人AI草稿引擎(支持Markdown输出) 1. 快速了解SmallThinker-3B-Preview SmallThinker-3B-Preview是一个基于Qwen2.5-3b-Instruct模型微调而来的轻量级AI模型。这个模型专门为两个核心场景设计&#x…...

CLIP-GmP-ViT-L-14图文匹配工具部署案例:政务公开图解材料语义合规性初筛

CLIP-GmP-ViT-L-14图文匹配工具部署案例:政务公开图解材料语义合规性初筛 你有没有遇到过这种情况?单位需要发布一份政务公开图解材料,比如一张关于“老旧小区改造”的示意图。材料做好了,但怎么确保图片旁边的文字说明&#xff…...

赶deadline必备! 降AI率平台 千笔AI VS 知文AI 全学科适配首选

在AI技术迅速发展的今天,越来越多的学生和研究者开始借助AI工具辅助论文写作,以提高效率、优化内容。然而,随着学术审核标准的不断提升,AI生成内容的痕迹和重复率问题愈发凸显,成为困扰众多学子的“隐形障碍”。无论是…...

赶deadline必备! 10个降AIGC工具测评:继续教育降AI率全攻略

在当前的学术写作环境中,AI生成内容(AIGC)的广泛应用让论文查重率和AI痕迹检测变得更加严格。尤其是在继续教育领域,许多学员在完成课程论文或毕业论文时,常常面临“AI痕迹明显”、“查重率过高”的难题。而如何高效地…...

AI头像生成器效果对比:Qwen3-32B vs Qwen2.5在头像细节描述上的提升

AI头像生成器效果对比:Qwen3-32B vs Qwen2.5在头像细节描述上的提升 1. 效果对比开场 最近测试了基于Qwen3-32B的AI头像生成器,发现它在头像细节描述上相比前代Qwen2.5有了明显提升。作为一个经常需要为不同场景设计头像的内容创作者,这种进…...

实测才敢推!全场景通用降AIGC神器 —— 千笔AI

在AI技术迅速渗透学术写作领域的今天,越来越多的学生和研究者开始依赖AI工具提升写作效率。然而,随着查重系统对AI生成内容的识别能力不断提升,论文中的“AI率超标”问题日益严峻,成为影响学术成果的重要隐患。面对市场上五花八门…...

墨语灵犀环境配置详细步骤:Ubuntu/CentOS下Hunyuan-MT推理服务快速搭建

墨语灵犀环境配置详细步骤:Ubuntu/CentOS下Hunyuan-MT推理服务快速搭建 想体验“砚池”挥毫、“朱印”成章的古典翻译之美吗?墨语灵犀这款基于腾讯混元大模型的深度翻译工具,将前沿AI技术包裹在古风美学之中,支持33种语言的精准互…...

Alpamayo-R1-10B技术解析:Qwen3-VL-8B视觉编码器与Diffusion轨迹解码协同机制

Alpamayo-R1-10B技术解析:Qwen3-VL-8B视觉编码器与Diffusion轨迹解码协同机制 1. 项目概述 Alpamayo-R1-10B是专为自动驾驶研发设计的开源视觉-语言-动作(VLA)模型,其核心架构整合了100亿参数的多模态大模型能力。该模型与AlpaS…...

Llama-3.2-3B从零部署:Ollama镜像+Linux环境+systemd服务守护配置详解

Llama-3.2-3B从零部署:Ollama镜像Linux环境systemd服务守护配置详解 想在自己的服务器上搭建一个随时可用的Llama-3.2-3B智能助手吗?今天我就带你从零开始,一步步完成部署。整个过程就像搭积木一样简单,从拉取镜像到配置成系统服…...

cv_unet_image-colorization效果展示:黑白X光片AI上色辅助医学教学

cv_unet_image-colorization效果展示:黑白X光片AI上色辅助医学教学 1. 项目简介与医学应用价值 基于UNet架构深度学习模型开发的图像上色工具,为医学教学领域带来了创新性的辅助手段。该工具利用先进的图像上色算法,能够精准识别黑白X光片中…...

收藏!小白程序员轻松入门大模型:重排序技术提升RAG检索效果

本文介绍了重排序技术在RAG检索流程中的重要性,它通过重新排序初始检索结果,提升检索结果的相关性,为生成模型提供更优质的上下文。文章详细阐述了重排序技术的优势,包括优化检索结果、增强上下文相关性和应对复杂查询。此外&…...

OFA视觉问答模型入门必看:VQA任务评估指标(Accuracy/VQA Score)简介

OFA视觉问答模型入门必看:VQA任务评估指标(Accuracy/VQA Score)简介 当你第一次运行OFA视觉问答模型,看到它准确回答出“图片里有一只猫”时,你可能会好奇:这个答案到底有多准?模型是怎么判断自…...

CnOpenData 全球2008年以来7级以上地震目录信息表

地震是全球发生频率最高、影响最严重的自然灾害之一,是当今人类生存和发展所面临的一个重大全球性问题。地震灾害有以下突出特征:巨大的破坏性。地震会造成山体、地面及其附着物(如植被、建筑)等破坏,往往还伴随着海啸…...

CnOpenData 全球2008年以来正式地震目录信息表

地震是全球发生频率最高、影响最严重的自然灾害之一,是当今人类生存和发展所面临的一个重大全球性问题。地震灾害有以下突出特征:巨大的破坏性。地震会造成山体、地面及其附着物(如植被、建筑)等破坏,往往还伴随着海啸…...

Fish Speech 1.5部署案例:政务AI助手语音模块集成,支持方言识别后合成

Fish Speech 1.5部署案例:政务AI助手语音模块集成,支持方言识别后合成 1. 引言:当政务热线遇到AI语音 想象一下,一位市民用家乡方言拨打政务服务热线,电话那头不再是漫长的等待或“请按1”的机械菜单,而是…...

发展规划是否需要用书名?

发展规划是否需要用书名号,取决于其使用场景和文件性质‌。根据权威公开资料,结论如下: ‌作为正式文件名称时,需使用书名号‌。例如,《XX市“十四五”文化产业发展规划》《XX单位“十四五”专项规划》等具有法定效力或正式发布属性的规划文件,应使用书名号标注 ‌11。 ‌…...

清音听真Qwen3-ASR-1.7B效果展示:突发新闻现场录音→关键人物/时间/地点三元组抽取

清音听真Qwen3-ASR-1.7B效果展示:突发新闻现场录音→关键人物/时间/地点三元组抽取 1. 引言:语音识别的新标杆 在信息爆炸的时代,快速准确地从音频内容中提取关键信息变得至关重要。特别是在突发新闻现场,记者往往需要在嘈杂环境…...

SmallThinker-3B-Preview入门必看:3B参数模型在Ollama中的性能与精度平衡

SmallThinker-3B-Preview入门必看:3B参数模型在Ollama中的性能与精度平衡 1. 认识SmallThinker-3B-Preview模型 SmallThinker-3B-Preview是一个基于Qwen2.5-3b-Instruct模型微调而来的轻量级AI模型。这个模型最大的特点就是在保持较高精度的同时,大幅提…...

颠覆“多任务效率高”测试单任务与多任务成绩,颠覆一心多用,输出专注工作最优模式。

专注力效率测试系统:颠覆"多任务效率高"的认知一、实际应用场景描述场景:小张是一名程序员,每天习惯一边写代码一边回消息,还开着音乐,觉得这样"多管齐下"效率最高。但项目总是延期,代…...

YOLO X Layout模型路径详解:/root/ai-models/AI-ModelScope/yolo_x_layout/结构说明

YOLO X Layout模型路径详解:/root/ai-models/AI-ModelScope/yolo_x_layout/结构说明 你是不是经常遇到一堆扫描的PDF或者图片文档,想快速提取里面的表格、标题和正文,却不知道从何下手?手动整理不仅耗时耗力,还容易出…...

AI驱动的模糊测试(Fuzzing)教程:自动化挖掘协议与API漏洞的实战指南

前言 1. 技术背景 —— 这个技术在攻防体系中的位置 在现代网络安全的攻防体系中,模糊测试(Fuzzing) 是一种历史悠久但至今仍极其高效的漏洞挖掘技术。它位于软件开发生命周期(SDLC)的安全测试阶段和渗透测试的攻击面探…...

ccmusic-database多场景落地:音乐节票务系统根据用户历史偏好推荐流派主题舞台

ccmusic-database多场景落地:音乐节票务系统根据用户历史偏好推荐流派主题舞台 1. 项目背景与价值 音乐节现场体验的核心痛点之一,就是如何在数十个舞台、上百场演出中,快速找到最适合自己的音乐内容。传统方式依赖人工浏览和推荐&#xff…...