guowenxue
5 days ago c6a1e7c00cd2946cef7716b205026a907136778b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**********************************************************************
*   Copyright: (C)2024 LingYun IoT System Studio
*      Author: GuoWenxue<guowenxue@gmail.com>
* Description: SG90 Servo Motor Driver for ISKBoard
*
*   ChangeLog:
*        Version    Date       Author            Description
*        V1.0.0  2024.08.29    GuoWenxue      Release initial version
***********************************************************************/
 
#ifndef __SERVO_SG90_H
#define __SERVO_SG90_H
 
/* SG90 的物理行程一般标称 0°~180°,但实际齿轮限位比这个略窄(大概 170°~185°)
 *  如果你让它往超过物理极限的角度硬顶:
 *  1. 电机持续出力试图转到不存在的位置
 *  2. 内部齿轮卡死 -> 长时间堵转
 *  3. 大电流持续流过线圈 -> 发热、烧线圈、融塑料齿轮
 * 钳位角度到 1°~180°(更保守 5°~175°)就给机械留了一点余量,避免顶死。
 */
 
/* 舵机参数宏定义,方便后期微调 */
#define SERVO_MIN_ANGLE   5     // 钳位最小角度
#define SERVO_MAX_ANGLE   175   // 钳位最大角度
#define SERVO_MIN_PULSE   500   // 0度对应的脉宽(us)
#define SERVO_MAX_PULSE   2500  // 180度对应的脉宽(us)
#define SERVO_DEFAULT_ANG 90    // 90度上电瞬间不容易堵转、卡死、发热
 
/* 通用角度钳位宏 */
#define CLAMP_ANGLE(angle)                                   \
    (((angle) < SERVO_MIN_ANGLE) ? SERVO_MIN_ANGLE :         \
     ((angle) > SERVO_MAX_ANGLE) ? SERVO_MAX_ANGLE :         \
     (angle))
 
/**
 * @brief  初始化舵机, 启动 TIM PWM 输出。
 */
void Servo_Init(void);
 
/**
 * @brief  设置舵机角度
 * @param  angle  可传 0 ~ 180,但超出钳位值范围自动钳位
 */
void Servo_SetAngle(int angle);
 
/**
 * @brief  直接停止 PWM 输出, 立即停止舵机
 */
void Servo_Stop(void);
 
/**
 * @brief  转到安全角度后,再停止舵机
 * @param  safe_angle  停止前舵机转到的角度 (超出钳位值范围设置默认角度)
 */
void Servo_SafeStop(int safe_angle);
 
/**
 * @brief 舵机测试函数
 */
void Servo_Test(void);
 
#endif