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

相关推荐
瓢儿菜20184 小时前
stm32 f103c8t6仿真 串口收发测试
stm32·单片机·嵌入式硬件·proteus
蜡笔小电芯5 小时前
实时中值滤波 + 低通滤波 示例程序(STM32环境)
stm32·单片机·嵌入式硬件
qq_401700417 小时前
单片机之单总线通信DS18B20和红外遥控
stm32
深圳市尚想信息技术有限公司7 小时前
工业4.0核心引擎!意法STM32F407ZET6 单片机 赋能智能PLC/网关设计
stm32·单片机·嵌入式硬件·st意法·单片机mcu
GodKK老神灭8 小时前
STM32 串口寄存器开发
stm32·单片机·嵌入式硬件
木子单片机10 小时前
基于STM32电子密码锁
stm32·单片机·嵌入式硬件·proteus
郦77711 小时前
MO+内核32位普冉单片机PY32F003开发板
单片机·嵌入式硬件
Ivy烎12 小时前
STM32学习笔记
笔记·stm32·学习
蜡笔小电芯13 小时前
【STM32】 LWIP -TCP 客户端收发数据
网络·stm32·tcp/ip
邹诗钰-电子信息工程14 小时前
嵌入式自学第四十二天
单片机·嵌入式硬件