电控入门到入土
电控入门到入土
萌新开始了电控的学习……
目前开发环境:cubeIDE
obtained list:
- 点灯
- GPIO
- 中断
- 串口
- DMA
- IIC
- OLED
- 定时器
- 输入捕获
- PWM
- 编码器
- 舵机
- 电机
先转战lerobot了,之后计划:
- PID
- 上位机
- 蜂鸣器
- ADC
- rtos
…………
stm32
| 功能 | 常见位置 | 用途 |
|---|---|---|
| PWM (定时器) | PA0, PA1, PA8… | 控制舵机(必须接在有定时器输出功能的引脚上)。 |
| UART (串口) | PA9 (TX), PA10 (RX) | 接模块 |
| ADC (模数转换) | PA0, PA1… | 测电池电压。 |
| I2C (通讯) | PB6, PB7… | 接陀螺仪(IMU)或 OLED 屏幕。 |
| SWD (调试口) | PA13, PA14 | 烧录程序专用 |
舵机
三根线
| 颜色 (常见) | 颜色 (老款/部分品牌) | 名称 | 功能描述 |
|---|---|---|---|
| 红色 | 红色 | VCC (正极) | 给舵机内部的直流电机和控制电路供电。通常需要 4.8V - 6V。 |
| 棕色 或 黑色 | 黑色 | GND (负极) | 电源地线,必须与 STM32 的 GND 共地。 |
| 橙色 或 白色 | 黄色 或 蓝色 | PWM (信号线) | 接收来自 STM32 的 脉冲信号。舵机通过识别脉冲宽度来决定转动角度。 |

舵机占空比
电机
最简单的电机只有正负极,通过电压控制速度。

电机驱动板
| pin | 真值1 | 真值2 | 真值3 |
|---|---|---|---|
| AIN1 | 0 | 1 | 0 |
| AIN2 | 0 | 0 | 1 |
| 状态 | 停止 | 正 | 负 |
编码器:检测A\B相的方波
四倍频提升精度
PID 代表三个项:P(比例 Proportional)、I(积分 Integral)、D(微分 Derivative)。
PID 的本质是处理 误差(Error)。
$$Error = 目标值 - 当前值$$
P (比例):当下执行。 误差越大,动力越大。
I (积分):历史纠偏。 如果一直有小误差对不准,就把它累加起来,给一个持续的推力。
D (微分):预测未来。 阻尼作用。如果快要撞线了,赶紧踩刹车,防止冲过头。
先调 P: 把 I 和 D 都设为 0。从小到大增加 P,直到云台开始出现轻微的左右晃动,然后稍微往回调小一点。
再调 D: 增加 D,你会发现刚才的晃动消失了,云台变得“沉稳”了,能快速停住。
最后调 I: 如果发现云台最后总是差那么一丁点对不准中心,稍微加一点 I,直到误差消失。
1. 理想状态的数学公式(连续型)
这是你在教科书上看到的原始公式,它基于时间 $t$ 的积分和导数:
$$u(t) = K_p \cdot e(t) + K_i \int_{0}^{t} e(\tau) d\tau + K_d \frac{de(t)}{dt}$$
$u(t)$: 控制器的输出(比如 PWM 占空比)。
$e(t)$: 偏差,即 $Target - Measured$(目标值 - 当前值)。
2. 编程使用的公式(离散型)
单片机(STM32)是数字系统,无法进行连续积分。我们每隔一段时间(采样周期 $\Delta t$)计算一次误差。
方案 A:位置式 PID(最适合舵机/人脸跟踪)
它直接计算出当前的目标输出值。
$$Output = K_p \cdot err(n) + K_i \sum_{i=0}^{n} err(i) + K_d \cdot [err(n) - err(n-1)]$$
比例项 (P): $K_p \times \text{当前误差}$。
积分项 (I): $K_i \times \text{所有历史误差的总和}$。
微分项 (D): $K_d \times (\text{当前误差} - \text{上一次误差})$。
方案 B:增量式 PID(最适合直流电机调速)
它计算的是输出的改变量(这次比上次增加或减少多少)。
$$\Delta Output = K_p [err(n) - err(n-1)] + K_i \cdot err(n) + K_d [err(n) - 2err(n-1) + err(n-2)]$$
- 优点:不需要累加误差,计算量小,且当电脑或系统崩溃时,输出不会剧变,更安全。
高级定时器(TIM1)–>打开编码器模式,接受A/B