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

相关推荐
gmmi3 小时前
嵌入式学习 51单片机(3)
单片机·学习·51单片机
CC呢4 小时前
基于单片机智能热水壶/养生壶设计
单片机·嵌入式硬件·单片机设计
贾亚超6 小时前
【STM32外设】DAC
stm32·单片机·嵌入式硬件
明天见~~7 小时前
硬件基础:串口通信
嵌入式硬件
sheepwjl7 小时前
《嵌入式硬件(三):串口通信》
网络·嵌入式硬件·网络协议·串口通信
嵌入式牛马在努力帮老板娶老婆9 小时前
十四、STM32-----低功耗
stm32·单片机·嵌入式硬件
来生硬件工程师9 小时前
【硬件笔记】负载是如何烧MOS的?
笔记·嵌入式硬件·硬件架构·硬件工程·硬件设计
少男的脸红藏不住心事9 小时前
GD32入门到实战34--ARM启动流程
单片机·嵌入式硬件
日更嵌入式的打工仔10 小时前
PHY的自适应协商简析
网络·嵌入式硬件·自适应·phy
CC呢11 小时前
基于单片机坐姿提醒系统/久坐提醒设计
stm32·单片机·嵌入式硬件·单片机设计·久坐提醒