PWM(hal库)、舵机、电机

目录

PWM

舵机

代码实现

电机

电机驱动芯片

代码实现


PWM

        PWM(脉宽调制)是一种用于控制电机、舵机等设备的信号。它通过调节信号的占空比(高电平时间与周期时间的比值)来控制设备的动作。

cubemx配置

复制工程模板

配置 20ms 左右的时基脉冲,也就是50Hz

 

舵机

        舵机通过PWM信号控制其角度。一般来说,1ms到2ms的PWM信号对应舵机的0到180度转角。常用于机器人、遥控模型等,需要精确控制角度的场合。

舵机的控制一般需要一个 20ms 左右的时基脉冲,也就是50Hz,该脉冲的高电平部分一般为0.5ms~2.5ms 范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135 度;
2.5ms-----------180度;

代码实现

sg90.h

#ifndef __sg90_H__
#define __sg90_H__

#include "main.h"

void SG90_Init(void);
void SG90_Set_Angle(float Angle);

#endif

sg90.c

#include <sg90.H>

extern TIM_HandleTypeDef htim1;

void SG90_Init(void)
{
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
}

void SG90_Set_Angle(float Angle)
{
	__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,Angle/180*200+50);
}

测试

添加头文件

#include "sg90.h"

main.c

    SG90_Init();
	SG90_Set_Angle(180);

电机

        PWM信号控制电机的速度。占空比越高,电机转速越快;占空比越低,电机转速越慢。用于调速、驱动各种电动装置,如风扇、机器人等。

电机驱动芯片

单片机直接驱动电机通常是不够的,因为单片机的引脚输出电流有限,可能无法提供电机所需的高电流。此外,单片机缺乏高效的电流控制和保护功能。使用电机驱动芯片或电路可以提供适当的电流驱动、保护功能和控制精度,更适合电机的需求。

常见芯片:

L298N:双H桥驱动芯片,适用于直流电机和步进电机。

        L298N电机驱动模块的接线使用与代码实现_l298n电机驱动模块接线-CSDN博客

TB6612:高效的直流电机驱动芯片。

代码实现

servo.h

#ifndef __servo_H__
#define __servo_H__

#define servo_1_Pin       GPIO_PIN_10
#define servo_1_GPIO_Port GPIOE
#define servo_2_Pin       GPIO_PIN_11
#define servo_2_GPIO_Port GPIOE

#define Servo_1_SET     	HAL_GPIO_WritePin(servo_1_GPIO_Port,servo_1_Pin,GPIO_PIN_SET)
#define Servo_1_RESET    HAL_GPIO_WritePin(servo_1_GPIO_Port,servo_1_Pin,GPIO_PIN_RESET)
#define Servo_2_SET     	HAL_GPIO_WritePin(servo_2_GPIO_Port,servo_2_Pin,GPIO_PIN_SET)
#define Servo_2_RESET    HAL_GPIO_WritePin(servo_2_GPIO_Port,servo_2_Pin,GPIO_PIN_RESET)

#include "main.h"

void Servo_Init(void);
void Servo_Set_Speed(int8_t Speed);

#endif

servo.c

#include "servo.h"

extern TIM_HandleTypeDef htim1;

void Servo_Init(void)
{
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
}

/*-100----100*/
void Servo_Set_Speed(int8_t Speed)
{
	if(Speed>0)
	{
		__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,Speed*20);
		Servo_1_SET;
		Servo_2_RESET;
	}
	else if(Speed==0)
	{
		Servo_1_SET;
		Servo_2_SET;
	}
	else 
	{
		__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,-(Speed*20));
		Servo_1_RESET;
		Servo_2_SET;
	}
}

测试

添加头文件

#include "servo.h"

main.c

    Servo_Init();
	Servo_Set_Speed(50);

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值