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

舵机样图

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 -- 2500servo_value_set(seleSteer, val);// 获取舵机当前的占空比servo_get_value(seleSteer);
*/#ifdef __cplusplus
}	/*extern "C"*/
#endif#endif //__SERVO_H_

代码使用

初始化:

	// 舵机 初始化servo_Init();

循环:

	// 舵机循环servo_scan();

设置舵机占空比:

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

获取舵机占空比:

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

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

serco_clear_move(seleSteer);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/35336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React Native Maps的使用

介绍 React Native Maps是一个用于在React Native应用中显示地图的库。它提供了许多功能&#xff0c;如显示地图、标记位置、绘制多边形等。以下是React Native Maps的使用步骤&#xff1a; 使用 首先&#xff0c;你需要在你的React Native项目中安装React Native Maps库。可…

青大数据结构【2014】

一、单选 二、简答 为了解决顺序队列的假溢出问题&#xff0c;提出了循环队列&#xff0c;即把存储队列的表从逻辑上看成一个环 判别队列空和满有三种方法&#xff1a; 1&#xff09;采用计数器判别&#xff0c;空时&#xff0c;计数器为0&#xff1b;满时&#xff0c;计数器…

【设计模式——学习笔记】23种设计模式——中介者模式Mediator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入案例一普通实现中介者模式 案例二 介绍基础介绍登场角色尚硅谷 《图解设计模式》 案例实现案例一&#xff1a;智能家庭类图实现 案例二&#xff1a;登录页面逻辑实现说明类图实现 总结文章说明 案例引入 案例一 普通实现 在租房过程中&#xff0c;客户可能…

css 实现 html 元素内文字水平垂直居中的N种方法

上一篇博文写了div 中元素居中的N种常用方法&#xff0c;那么单个html元素&#xff1a;div&#xff08;块级元素代表&#xff09;&#xff0c;span&#xff08;行内元素代表&#xff09;中的文字如何水平垂直都居中呢&#xff1f;实现方法如下&#xff1a; 本文例子使用的 html…

WebAPIs 第二天

DOM事件基础 事件监听事件类型事件对象 一.事件监听 ① 概念&#xff1a;就是让程序检测是否有事件发生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也成为绑定事件或者注册事件 ② 语法&#xff1a;元素对象.addEventListener(事件类型&…

机器学习---对数几率回归

1. 逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;的模型是一个非线性模型&#xff0c; sigmoid函数&#xff0c;又称逻辑回归函数。但是它本质上又是一个线性回归模型&#xff0c;因为除去sigmoid映射函 数关系&#xff0c;其他的步骤&#xff0c;算法都是…

从零开始,贪吃蛇小游戏系列专栏完美收官!

&#x1f3ae; 从零开始&#xff0c;贪吃蛇小游戏系列专栏完美收官&#xff01; &#x1f40d; 各位游戏开发探索者们&#xff0c;大家好&#xff01;我是[亿元程序员]&#xff0c;一位拥有8年游戏开发经验的主程。经过一段时间的努力&#xff0c;我很高兴地宣布&#xff0c;我…

阿里云预装LAMP应用导致MySQL不显示访问密码如何解决

&#x1f600;前言 本篇博文是关于阿里云云服务器ECS部署MySQL过程中出现的一下坑&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家…

SUB-1G SOC芯片DP4306F 32 位 ARM Cortex-M0+内核替代CMT2380F32

DP4306F是一款高性能低功耗的单片集成收发机&#xff0c;集成MO核MCU&#xff0c;工作频率可覆盖200MHiz^ 1000MHz。 支持230/408/433/470/868/915频段。该芯片集成了射频接收器、射频发射器、频率综合器、GFSK调制器、GFSK解调器等功能模块。通过SPI接口可以对输出功率、频道选…

gitlab-Runner搭建

root wget https://packages.gitlab.com/runner/gitlab-runner/packages/fedora/29/gitlab-runner-12.6.0-1.x86_64.rpm/download.rpm rpm -ivh download.rpm ---- 安装 rpm -Uvh download.rpm -----更新升级 然后运行&#xff1a; gitlab-runner register --url https://git…

RabbitMQ相关面试题

用到了哪些MQ?什么使用场景?MQ的组成部分?MQ宕机了怎么办?如何进行持久化的? MQ的选型? Kafka:高吞吐量、低延迟的分布式消息队列,主要用于大规模数据处理和流式处理 RocketMQ:RocketMQ是阿里巴巴开源的分布式消息队列,具有高吞吐量、低延迟、高可靠性等特点 RabbitM…

【Go 基础篇】Go语言浮点类型:探索浮点数的特点与应用

介绍 浮点数是计算机编程中用于表示实数的一种数据类型&#xff0c;用于处理具有小数部分的数值。Go语言&#xff08;Golang&#xff09;提供了两种主要的浮点数类型&#xff1a;float32和float64&#xff0c;分别用于单精度和双精度浮点数的表示。本篇博客将深入探讨Go语言中…

38 | 浦发银行股票分析案例

本文将通过一个浦发银行股票分析案例,探讨如何从多个维度对股票进行分析,包括基本面、技术面和市场环境等因素。我们将深入挖掘浦发银行的财务数据、业务模式以及市场定位,以了解其内在价值和潜在风险。同时,我们还将考察技术面的指标,如价格走势、均线形态等,以揭示市场…

linux 命令--常用关机命令

1.使用shutdown命令 shutdown命令是Linux系统下最常用的关机命令之一。它可以让系统在指定时间内进行关机或者重启操作。例如&#xff0c;下面的命令可以让系统在5分钟后进行关机操作&#xff1a; sudo shutdown -h5其中&#xff0c;“-h”表示关机&#xff0c;“5”表示5分钟…

ThinkPHP8命名规范-ThinkPHP8知识详解

本文主要讲解thinkphp8的命名规范&#xff0c;主要包括&#xff1a;遵循PHP自身的PSR-2命名规范和PSR-4自动加载规范、目录和文件命名规范、函数和类、属性命名规范、常量和配置命名规范、数据表和字段命名规范、不能使用PHP保留字。 在使用thinkphp8开发项目之前&#xff0c;…

C#使用OpenCv(OpenCVSharp)图像全局二值化处理实例

本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行全局二值化处理。 目录 图像二值化原理 函数原型 参数说明 实例 效果 图像二值化原理

线程转换状态,傻傻分不清等待和阻塞吗?你还在暴力的停止线程吗?

线程切换 线程创建之后&#xff0c;调用start()方法开始运行。当线程执行wait()方法之后&#xff0c;线程进入等待状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态&#xff0c;而超时等待状态相当于在等待状态的基础上增加了超时限制&#xff0c;也就是超…

腾讯云服务器竞价实例是什么?适用于什么行业?有啥优惠?

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例&#xff0c;什么是竞价实例&#xff1f;竞价实例和按量付费相类似&#xff0c;优势是价格更划算&#xff0c;缺点是云服务器实例有被自动释放风险&#xff0c;腾讯云服务器网来详细说下什么是竞价实例&#xff1f;以及…

GUI、多线程编程、网络编程简介

GUI、多线程编程、网络编程简介 文章目录 GUI简介什么是GUIGUI有什么用使用方法 多线程编程什么是多线程编程多线程编程有什么用提高程序的响应能力提高程序的性能实现异步编程并发数据访问和共享资源实现复杂的算法和任务分解 进行多线程编程的步骤 网络编程什么是网络编程网络…

JMeter处理接口签名之BeanShell实现MD5加密

项目A需要给项目B提供一个接口&#xff0c;这个接口加密了&#xff0c;现在需要测试这个接口&#xff0c;需要怎么编写脚本呢&#xff1f;实现接口签名的方式有两种&#xff1a;BeanShell实现MD5加密和函数助手实现MD5加密&#xff0c;之前已经分享过了函数助手实现MD5加密&…