stm32 舵机 cubemx

文章目录


前言

stm32对舵机进行控制,很简单直接一个pwm就可以实现

pwm的周期是50HZ占空比分别对应

一个0.5ms的高电平对应于0度

一个1.5ms的高电平对应于90度

一个2.5ms的高电平对应于180度

因此,您可以通过改变PWM信号的占空比来改变舵机的角度。占空比是PWM信号的高电平时间与PWM信号的总周期之比。在这里,PWM信号的总周期通常是20ms(对应于50Hz的频率),所以:

对于0度,占空比是0.5ms/20ms = 2.5%

对于90度,占空比是1.5ms/20ms = 7.5%

对于180度,占空比是2.5ms/20ms = 12.5%


一、cubemx配置

以我的c8t6为例

时钟频率是72MHZ

为了得到50HZ就设定为720-1 和 2000-1

其中2000-1的arr值后面还要用到。

二、代码

1.serve.c

c 复制代码
#include "serve.h"


Servo ser_1;


void servo_init(Servo* servo, TIM_HandleTypeDef* htim, uint32_t channel, uint16_t arr) 
{
    servo->htim = htim;
    servo->channel = channel;
    servo->arr = arr;
	
		HAL_TIM_PWM_Start(htim,channel);	
	
}

void set_servo_angle(Servo* servo, uint8_t angle) 
{
    if (angle > 180) 
		{
        // Angle out of range
        angle = 180;
    }
		if(angle<0)
		{
			angle = 0;
		}

    servo->angle = angle;
		
    uint16_t pulse_length = (uint16_t)(servo->arr * 1.0 / 20 * (1.0 + angle / 180.0));
    __HAL_TIM_SET_COMPARE(servo->htim, servo->channel, pulse_length);
}

2.serve.h

c 复制代码
typedef struct {
    TIM_HandleTypeDef* htim;
    uint32_t channel;
    uint16_t arr;
    uint8_t angle;
} Servo;

extern Servo ser_1;

void servo_init(Servo* servo, TIM_HandleTypeDef* htim, uint32_t channel, uint16_t arr) ;
void set_servo_angle(Servo* servo,uint8_t angle) ;

3.主函数

c 复制代码
	servo_init(&ser_1,&htim1,TIM_CHANNEL_1,2000);
	set_servo_angle(&ser_1,180);

总结

over

相关推荐
VekiSon27 分钟前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
来自晴朗的明天2 小时前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程
G***技2 小时前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
czhaii3 小时前
STC AI8052U单片机特点
单片机
MAR-Sky3 小时前
keil5中数据的不同定义和单片机(以stc8为例)里的对应关系(idata,xdata,data,code)
单片机·嵌入式硬件
项目題供诗5 小时前
51单片机入门(八)
单片机·嵌入式硬件·51单片机
羽获飞5 小时前
从零开始学嵌入式之STM32——9.STM32的时钟系统
stm32·单片机·嵌入式硬件
飞睿科技6 小时前
乐鑫智能开关方案解析:基于ESP32-C系列的低功耗、高集成设计
嵌入式硬件·物联网·esp32·智能家居·乐鑫科技
来自晴朗的明天7 小时前
13、NMOS 电源防反接电路
单片机·嵌入式硬件·硬件工程
17(无规则自律)7 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件