cubemx hal stm32 舵机 可减速 任意位置停止 驱动代码

2023-10-31

舵机样图

CubeMX配置

对于 STM32 F407VE
定时器配置

这里的84是来自APB1那路2倍频得到:
定时器频率

代码部分

两个舵机都是180度的

servo.c

#include "servo.h"
#include "tim.h"
#include "stdio.h"

__IO uint32_t g_SteerUWT[2] = {0};
uint16_t g_SteerDeg[2] = {0};
uint8_t g_SteerSele[2] = {0};

uint16_t g_servoMidAngle[2] = {SERVO1_MID, SERVO2_MID};


/*对于 舵机 设置角度值*/


//# 设置频率为50hz也就是20ms一个周期,
//# 控制舵机范围是在0.5ms到2.5ms之间,也就是2.50%到12.50%之间
//# 最小精度是0.01ms,也就是0.05%
//# 对于20000:
//#			 0.05% ==   10
//# 		 2.50% ==  500
//#			12.50% == 2500
void servo_Init(void)
{
	HAL_TIM_Base_Start_IT(&SERVO1_TIM);	//开启定时器
	HAL_TIM_Base_Start_IT(&SERVO1_TIM);	//开启定时器

	HAL_TIM_PWM_Start(&SERVO1_TIM, SERVO1_CHANNEL);
	HAL_TIM_PWM_Start(&SERVO1_TIM, SERVO2_CHANNEL);

	SERVO_1 = g_servoMidAngle[0];
	SERVO_2 = g_servoMidAngle[1];
}

/*
seleSteer:选择不同舵机
val:500~2500对应0~180度
*/
void servo_value_set(uint8_t seleSteer, uint16_t val)
{
	g_SteerDeg[seleSteer] = val;	// val*10+500;
	g_SteerSele[seleSteer] = 1;
}

uint16_t servo_get_value(uint8_t seleSteer)
{
	uint32_t getVal;
	switch(seleSteer)
	{
		case SERVO1:
			getVal = SERVO_1;
			break;
		case SERVO2:
			getVal = SERVO_2;
			break;
		default:
			break;
	}
	printf("servo : %d\n", getVal);

	return (uint16_t)getVal;
}

void serco_clear_move(uint8_t seleSteer)
{
	g_SteerSele[seleSteer] = 0;
}

// 舵机缓慢移动循环
void servo_scan(void)
{
	uint8_t i=0;
	while(i < SERV0_MAX)
	{
		if(g_SteerSele[i] == 1)
		{
			if(g_SteerUWT[i] < uwTick - SERVO_RETARD_VAL)
			{
				g_SteerUWT[i] = uwTick;
			}
			else
			{
				goto scan1;
			}
			switch(i)
			{
				case SERVO1:
					if(SERVO_1<=g_SteerDeg[i])
					{
						SERVO_1 += 10;
						if(SERVO_1>g_SteerDeg[i])
						{
							g_SteerSele[i] = 0;
						}
					}
					else if(SERVO_1>g_SteerDeg[i])
					{
						SERVO_1 -= 10;
						if(SERVO_1<=g_SteerDeg[i])
						{
							g_SteerSele[i] = 0;
						}
					}
					break;
				case SERVO2:
					if(SERVO_2<=g_SteerDeg[i])
					{
						SERVO_2 += 10;
						if(SERVO_2>g_SteerDeg[i])
						{
							g_SteerSele[i] = 0;
						}
					}
					else if(SERVO_2>g_SteerDeg[i])
					{
						SERVO_2 -= 10;
						if(SERVO_2<=g_SteerDeg[i])
						{
							g_SteerSele[i] = 0;
						}
					}
					break;
				default:
					break;
			}
		}
scan1:
		i++;
	}
}



servo.h

#ifndef __SERVO_H_
#define __SERVO_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include "main.h"


#define SERVO1_TIM        htim2
#define SERVO1_CHANNEL    TIM_CHANNEL_1

#define SERVO2_TIM        htim2
#define SERVO2_CHANNEL    TIM_CHANNEL_2

#define SERVO_1		SERVO1_TIM.Instance->CCR1
#define SERVO_2		SERVO2_TIM.Instance->CCR2

// 舵机循环减速值,减速值越大速度越慢
#define SERVO_RETARD_VAL 2

// 左加右减
// 上加下减
typedef enum
{
	SERVO1_MID = 1500,	// 
	SERVO2_MID = 1500,	// 
}SERVO_MID_ANGLE;

typedef enum
{
	SERVO1,			// 底部舵机,决定x位置
	SERVO2,			// 顶部舵机,决定y位置
	SERV0_MAX    
}SERVO_NUM;

extern uint16_t g_servoMidAngle[2];


void servo_Init(void);
void servo_value_set(uint8_t seleSteer, uint16_t val);
uint16_t servo_get_value(uint8_t seleSteer);
void serco_clear_move(uint8_t seleSteer);
void servo_scan(void);

/*	//使用方法
	
初始化:
	servo_Init();

调用:
	// 选择舵机1,转动舵机范围为 500 -- 2500
	servo_value_set(seleSteer, val);

	// 获取舵机当前的占空比
	servo_get_value(seleSteer);
*/

#ifdef __cplusplus
}	/*extern "C"*/
#endif

#endif //__SERVO_H_


代码使用

初始化:

	// 舵机 初始化
	servo_Init();

循环:

	// 舵机循环
	servo_scan();

设置舵机占空比:

	// 选择舵机,转动舵机范围为 500 -- 2500
	servo_value_set(seleSteer, val);

获取舵机占空比:

	// 获取舵机当前的占空比
	servo_get_value(seleSteer);

使舵机停止在当前移动的位置:

serco_clear_move(seleSteer);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cubemx hal stm32 舵机 可减速 任意位置停止 驱动代码 的相关文章

  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 【Proteus仿真】【Arduino单片机】视力保护仪

    文章目录 一 功能简介 二 软件设计 三 实验现象 联系作者 一 功能简介 本项目使用Proteus8仿真Arduino单片机控制器 使LCD1602液晶 DS18B20温度传感器 按键 蜂鸣器 继电器开关 HC05蓝牙模块等 主要功能 系
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • allegro画PCB如何更新元件的PCB封装

    allegro画PCB如何更新元件的PCB封装 一 更新单个器件的PCB封装 首先菜单栏选择Place gt Update Symbols 如下图 注意此案例是更新了C0805封装 中更新封装 就将上图第二个红色方框中的勾选即可 二 更新某
  • PD SINK协议芯片系列产品介绍对比-ECP5701、FS312A、CH221K、HUSB238、AS225KL

    目录 一 ECP5701 二 FS312A 三 CH221K 四 HUSB238 五 AS225KL 在如今快节奏生活不断蔓延的背景下 人们对各种事情的处理也渐渐地开始要求在保证质量的情况下 不断加快 手机快充就是一个典型的例子 从开始的1
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 会stm32有机会进大公司吗?

    今日话题 会stm32有机会进大公司吗 我本科期间参与了飞思卡尔和电赛等比赛 使用过多种单片机 但渐渐发现单片机只是其中的一小部分 不要过分迷恋所谓的单片机基础和技巧 更值得深入研究的是C语言 如果你对此感兴趣 我愿意无偿分享一个资源包 其
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • 使用Linux内核里的spi屏驱动-fbtft

    Linux内核里已经提供spi接口小屏的设备驱动 在内核的配置选项 make menuconfig ARCH arm CROSS COMPILE arm linux gnueabihf Device Drivers gt Graphics
  • 多线程练习之:生产电脑

    生产电脑 题目 设计一个生产电脑和搬运电脑类 要求生产出一台电脑就搬走一台电脑 如果没有新的电脑生产出来 则搬运工要等待新电脑产出 如果生产出的电脑没有搬走 则要等待电脑搬走之后再生产 并统计出生产的电脑数量 public class Co
  • python乘法出现小数位很多_js小数运算出现多位小数如何解决

    小数相乘出现很多位小数的问题 这个问题自己以前也遇到过 现在特意来总结一下 Number类型 Number类型是ECMAScript中最常用和最令人关注的类型了 这种类型使用IEEE754格式来表示整数和浮点数值 浮点数值在某些语言中也被成
  • 字节跳动前端面经

    面试经历 我入职字节大概一个多月 目前准大四 实习生 现在写面经不仅仅是牛客网 YYSD 真tm灵 的还愿 还是就是想给大家推荐推荐我们部门 技术中台 可能大家对技术中台不太了解 但是大家肯定听说过掘金吧 我们组主要负责ByteTech 字
  • 相机的信噪比

    在图像传感器的成像过程中 真实的信号是无法探测到的理想值 在成像过程中理想值被引入了一系列的不确定性 最终形成读出信号也即图像 此过程中的不确定性被统一称为噪声 而信号与噪声的比值被定义为信噪比 Signal to NoiseRatio S
  • hibernate: Duplicate class/entity; Could not parse mapping document from resource

    近日在学习Hibernate时 总是遇到以下异常 org hibernate InvalidMappingException Could not parse mapping document from resource kpy db Cus
  • ModelScope-Agent: Building Your Customizable Agent System with Open-source Large Language Models

    本文是LLM系列文章 针对 ModelScope Agent Building Your Customizable Agent System with Open source Large Language Models 的翻译 ModelS
  • 1072. 开学寄语(20)

    下图是上海某校的新学期开学寄语 天将降大任于斯人也 必先删其微博 卸其QQ 封其电脑 夺其手机 收其ipad 断其wifi 使其百无聊赖 然后 净面 理发 整衣 然后思过 读书 锻炼 明智 开悟 精进 而后必成大器也 本题要求你写个程序帮助
  • Webpack 基础配置介绍(二)

    今天继续分享webpack的有关内容 我还是接着从上篇文章的项目来给大家分享后续内容 如果还有小伙伴没有阅读之前的文章 请关注博主进行阅读 今日分享 1 webpack的规范配置 2 webpack config js基础配置 3 单页开发
  • JSP+ssm计算机毕业设计考研资源共享平台设计与实现399xv【源码、数据库、LW、部署】

    项目运行 项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEcl
  • 环境变量路径中有空格该怎么办?

    本机环境变量的设置 java home C Program Files Java jdk1 5 0 09 bat中的命令格式 java home bin java 或者 C Program Files Java jdk1 5 0 09 bi
  • Python、Matplot的subplot实现一行3列的子图绘制,并添加背景色

    Python Matplot的subplot实现一行3列的子图绘制 并添加背景色 1 可能遇到的问题 2 示例 1 绘制2 2 俩行俩列 的子图 并设置背景色 2 绘制1 3 一行三列 的子图 并设置横轴纵轴值 3 绘制1 3 一行三列 的
  • 记一次kafka Consumer线程停止消费过程分析

    前言 kafka消息队列在项目开发中经常被使用 尤其是在大数据领域经常见到它的身影 spring集成了kafka方便我们使用 只要引入spring kafka即可 问题描述 有一天我们后台版本发布 虽然改动很大 但是大家还是自信满满 因为经
  • Spring Boot中使用WebSocket [第三部分]

    使用消息队列实现分布式WebSocket 在上一篇文章 https www zifangsky cn 1359 html 中我介绍了服务端如何给指定用户的客户端发送消息 并如何处理对方不在线的情况 在这篇文章中我们继续思考另外一个重要的问题
  • PTA自测-1 打印沙漏 python实现

    本题要求你写个程序把给定的符号打印成沙漏的形状 例如给定17个 要求按下列格式打印 所谓 沙漏形状 是指每行输出奇数个符号 各行符号中心对齐 相邻两行符号数差2 符号数先从大到小顺序递减到1 再从小到大顺序递增 首尾符号数相等 给定任意N个
  • 前端接收后端返回换行符 /n 不生效

    问题 前端接收后端返回换行符 n 不换行 不生效 解决方案 一 设置css的white space属性 div class text container text div export default data return text 这是
  • StackOverflow 第四周周报及19年就业情况分析

    这是 Stack Overflow 第四周周报 两篇 Java 两篇 Python 公众号 渡码 为日更 欢迎关注 另外 我搜集了今年的就业数据 对招聘情况和岗位情况做了简单总结 想了解的朋友点这里 DAY1 枚举对象 和 equals 区
  • TypeError: can only concatenate str (not “int“) to str

    看见报的错误我们可以发现大致的错误 首先要做的是先梳理一下代码整体的思路 确保思路没有问题 然后再断点调试 每个步骤的打印也可以 这样可以很好的得到每个阶段所获得的值 定位错误 然后就是针对错误进行解决 简而言之就是报错解决的范围太泛了 太
  • 【自然语言处理】Transformer 讲解

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 在阅读本篇之前建议先学习 自然语言处理 Seq2Seq 讲解 自然语言处理 Attention 讲解 Transformer 为了讲解更加清晰 约定 预测阶段 被称为 推断阶段 in
  • cubemx hal stm32 舵机 可减速 任意位置停止 驱动代码

    CubeMX配置 对于 STM32 F407VE 这里的84是来自APB1那路2倍频得到 代码部分 两个舵机都是180度的 servo c include servo h include tim h include stdio h IO u