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.pswp.cn/news/35336.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35336.shtml
英文地址,請注明出處:http://en.pswp.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加密&…