目录
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);