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

相关推荐
weixin_11223310 小时前
基于STM32闭环步进电机控制系统设计说明
stm32·单片机·嵌入式硬件
机器视觉知识推荐、就业指导11 小时前
STC89C52系列单片机简介
单片机·嵌入式硬件·51单片机
qq_259297247312 小时前
STM32
嵌入式硬件
qq_21513832713 小时前
【51单片机-B020】【protues仿真】基于51单片机智能晾衣架仿真
单片机·嵌入式硬件
小猪写代码13 小时前
STM32 GPIO的八种工作模式
stm32·单片机·嵌入式硬件·gpio
1+2单片机电子设计13 小时前
STM32 单片机的停车场管理系统设计与实现
stm32·单片机·嵌入式硬件·51单片机
如愿小李14 小时前
STM32之土壤湿度传感器模块
stm32·单片机·嵌入式硬件
weixin_5803820615 小时前
UART Hal库与寄存器比较
stm32·单片机·嵌入式硬件
景彡先生16 小时前
STM32以太网开发详解:基于LwIP协议栈实现TCP/UDP通信(附网络摄像头案例)
网络·stm32·tcp/ip