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

#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

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.主函数

	servo_init(&ser_1,&htim1,TIM_CHANNEL_1,2000);
	set_servo_angle(&ser_1,180);

总结

over

STM32 PWM 控制舵机通常涉及到硬件配置、软件编程以及使用CubeMX这款图形化配置工具。以下是基本步骤: 1. 硬件连接:将STM32的PWM通道(例如PA8或PB6等)通过外部电阻接至舵机的信号线(通常为50Hz的方波)。舵机一般有两个引脚,一个是电源(VCC),另一个是信号(Signal)。 2. CubeMX配置:打开CubeMX,选择对应的STM32芯片并创建新项目。进入Pinout视图,找到你要使用的PWM引脚,配置它为输出,并设置合适的PWM频率,这会影响到舵机的转动速度。 3. 驱动库配置:添加STM32 HAL库或FreeRTOS的相关支持,以便使用HAL_PWM_Init()函数初始化PWM,然后配置周期和占空比来生成适合舵机的波形。 4. 软件编程:编写控制代码,在主循环中调用HAL_PWM_Start()启动PWM,然后根据舵机的当前角度需求,动态调整PWM的占空比。可以使用如`angleToPwmDutyCycle()`这样的函数将角度转换为适当的占空比值。 ```c float angleToPwmDutyCycle(float angle, float minDuty, float maxDuty) { // 计算 duty cycle 与角度的关系 float duty = (angle - minAngle) * (maxDuty - minDuty) / (maxAngle - minAngle); duty += minDuty; // 将duty限制在minDuty到maxDuty之间 return duty; } // 主循环部分 void main(void) { HAL_Init(); ...其他初始化... while (1) { float desiredAngle = getDesiredAngle(); // 获取需要的角度 uint16_t dutyCycle = angleToPwmDutyCycle(desiredAngle, PWM_MIN_DUTY, PWM_MAX_DUTY); HAL_PWM_SetDutyCycle(&hpb, PWM_CHANNEL, dutyCycle); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值