Skip to content

Commit c302d1c

Browse files
committed
内容深度增强:阅读模式、PI整定、DAP修正、Windows指南、故障排查表
1 parent 5cee9d9 commit c302d1c

File tree

3 files changed

+225
-11
lines changed

3 files changed

+225
-11
lines changed

_posts/2024-04-15-motor-control-foundations.md

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
title: 永磁同步电机控制与性能评估实战
33
date: 2024-04-15 09:30:00 +0800
44
tags: [电机控制, 控制理论, STM32]
5-
excerpt: "梳理永磁同步电机的关键性能指标、数学建模与矢量控制策略,并给出基于 STM32 控制器的落地建议。"
5+
excerpt: "从性能指标、参数辨识、FOC 实现到 PI 整定与排错的完整闭环;附 STM32 实操清单、调参流程与示例数据表。"
6+
layout: post
7+
comments: true
68
---
79
高性能驱动系统要同时兼顾效率、动态响应与稳定性,这篇文章集中整理了我在永磁同步电机(PMSM)项目中的经验,包括前期的性能参数评估、核心控制理论与实践落地要点。文章最后还附带了面向 STM32 控制器的工程建议。
810

@@ -13,6 +15,27 @@ excerpt: "梳理永磁同步电机的关键性能指标、数学建模与矢量
1315

1416
系统设计从理解电机本体开始,以下指标决定了控制策略与硬件选型:
1517

18+
> **快速上手清单(拿来即测)**
19+
>
20+
> - 直流母线标定:万用表复核母线电压 ±1%
21+
> - 相电阻 $R_s$:四线法或交流法(1 kHz)测量,折算到工作温度
22+
> - $L_d/L_q$:开环注入法或频扫;无铁心饱和时应随电流近似线性
23+
> - 反电动势常数 $K_e$/永磁链 $\psi_f$:拖动法测定,记录线电压与机械转速
24+
> - 转动惯量 $J_m$:阶跃加速/自由减速识别
25+
> - 编码器极性与零位:锁轴给 $i_q>0$ 验方向;反向则交换两相电流或取负号
26+
> - 三相电流传感:一致性校准(零偏、量程、相序)
27+
28+
### 参数辨识与记录模板
29+
30+
| 参数 | 记号 | 典型值/单位 | 备注 |
31+
|---|---|---|---|
32+
| 定子相电阻 | $R_s$ | 0.2–1.5 Ω | 依据温度修正 $R_s(T)=R_{s0}[1+\alpha(T-T_0)]$ |
33+
| d轴电感 | $L_d$ | 0.5–5 mH | 开环注入法辨识 |
34+
| q轴电感 | $L_q$ | 0.5–5 mH | 表贴式电机 $L_d \approx L_q$ |
35+
| 永磁链 | $\psi_f$ | 0.01–0.1 Wb | 拖动测反电动势:$E=\omega_e\psi_f$ |
36+
| 极对数 | $p$ | 2–8 | 电角度 = 机械角度 × $p$ |
37+
| 转子惯量 | $J_m$ | 10⁻⁴–10⁻² kg·m² | 影响速度环带宽 |
38+
1639
### 额定工况与扭矩-转速曲线
1740

1841
额定电压、额定电流与额定转速构成了安全运行的边界。扭矩与功率的关系可写成:
@@ -160,3 +183,82 @@ STM32 控制平台集成了高速 ADC、定时器、CORDIC 以及硬件除法器
160183
## 结语
161184

162185
电机控制工程是跨学科的系统工作:硬件要可靠、模型要准确、算法要稳定,还需要贴合具体的应用场景。希望这份笔记能够帮助你快速梳理 PMSM 控制的知识框架,并在 STM32 等嵌入式平台上构建出性能可靠的驱动系统。
186+
187+
---
188+
189+
## 电流/速度 PI 整定速查(离散域)
190+
191+
> 目标:**先电流环,后速度环**;以采样周期 $T_s$ 进行离散化,考虑电压限幅与反耦合项。
192+
193+
### 电流环(单轴等效)
194+
电机电流通道近似一阶:$G_p(s)=\frac{1}{L s + R}$。设目标带宽 $\omega_c = k \cdot \frac{R}{L}$(常取 $k\in[3,7]$)。
195+
196+
PI 连续参数:
197+
$$
198+
K_p = L \,\omega_c,\qquad K_i = R \,\omega_c
199+
$$
200+
201+
Tustin 离散化:
202+
$$
203+
u[k] = u[k-1] + K_p(e[k]-e[k-1]) + K_i \frac{T_s}{2}(e[k]+e[k-1])
204+
$$
205+
206+
记得加入**交叉耦合补偿**
207+
$$u_d \leftarrow u_d + \omega_e L_q i_q,\quad u_q \leftarrow u_q - \omega_e L_d i_d$$
208+
209+
### 速度环
210+
惯量近似:$G_\omega(s)=\frac{K_t}{J s}$,设带宽为电流环的 $1/10\sim1/5$。
211+
PI(含前馈):
212+
$$
213+
T_e^* = K_{p\omega} e_\omega + K_{i\omega} \int e_\omega \, dt + B \omega^* + J \dot{\omega}^*
214+
$$
215+
216+
其中 $B$ 为粘性阻尼估计,$J\dot{\omega}^*$ 为加速前馈(可选)。
217+
218+
---
219+
220+
## 常见故障与排查流程
221+
222+
| 故障现象 | 可能原因 | 排查方法 |
223+
|---|---|---|
224+
| 起转抖动/啸叫 | 电角度极性错误或零位偏移 | 反向电角度,重标定零位 |
225+
| 低速力矩不足 | $R_s$ 估计偏差、电流采样延迟 | 复核 $R_s$,用 PWM 同步采样 |
226+
| 高速失步 | 弱磁过浅/过深、母线过压限制 | 动态调节 $i_d^*<0$,引入电压限幅与扭矩限幅 |
227+
| 温升过快 | 铜损/铁损模型失配 | 在线估计 $\hat{R}_s(T)$,限制最大 $i_q$ 与占空比 |
228+
| SVPWM 失真 | 死区补偿不足 | 基于采样反推补偿量,或切换到 SVM+空间电压矢量补偿 |
229+
230+
---
231+
232+
## STM32 实操打包清单(可粘到 README)
233+
234+
**硬件配置**
235+
- **TIM1/8**:中心对称 PWM,触发 ADC 采样;注入中断运行电流环
236+
- **ADC**:双通道并行采样 $i_a,i_b$;DMA 环形缓冲;采样点在 PWM 中点
237+
- **FOC 周期**:10–50 kHz;速度环:1–2 kHz
238+
- **CORDIC/库**:用于 sin/cos(Park/反 Park 变换)
239+
240+
**保护策略**
241+
- 过流比较器(硬件即时关断)+ 软件软停(斜坡下电)
242+
- 母线过压/欠压检测
243+
- 堵转检测(速度反馈与给定长时间不一致)
244+
- 温度监控(ADC 采样功率管/电机温度)
245+
246+
**调试工具**
247+
- 串口/RTT 实时打点:$i_d$、$i_q$、$\omega$、$T_e$
248+
- 示波器:三相电流波形、母线电压、PWM 占空比
249+
- 变量监控:HAL 断点或 ST-Link Utility 在线调参
250+
251+
**代码组织建议**
252+
```c
253+
typedef struct {
254+
float Rs, Ld, Lq, psi_f; // 电机参数
255+
float Ts; // 采样周期
256+
float Kp_id, Ki_id; // d轴电流 PI
257+
float Kp_iq, Ki_iq; // q轴电流 PI
258+
float Kp_w, Ki_w; // 速度 PI
259+
} MotorParams_t;
260+
261+
void FOC_CurrentLoop(void); // 电流环(高频中断)
262+
void FOC_SpeedLoop(void); // 速度环(低频调用)
263+
void FOC_SVM(float ud, float uq, float theta); // SVPWM
264+
```

_posts/2024-10-17-neovim-cpp-setup.md

Lines changed: 98 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
title: 打造高效 Neovim C/C++ 开发环境:从零到一的完整指南
33
date: 2024-10-17 10:00:00 +0800
44
tags: [Neovim, C++, 开发环境, LSP]
5-
excerpt: "详细讲解如何从零开始配置 Neovim,打造媲美 IDE 的 C/C++ 开发体验,包括 LSP、自动补全、调试、格式化等核心功能。"
5+
excerpt: "用 clangd + Treesitter 打造 IDE 级体验,覆盖补全/诊断/调试/格式化/构建;修正 GDB/Lldb 适配,提供 Windows 与 CMake 指南。"
6+
layout: post
7+
comments: true
68
---
79

810
作为一个追求效率的开发者,我一直在寻找一个轻量、快速、可高度定制的编辑器。在尝试了各种 IDE 和编辑器后,我最终选择了 Neovim,并成功打造了一套完整的 C/C++ 开发环境。这篇文章将分享我的配置经验,帮你快速上手。
@@ -445,6 +447,7 @@ return {
445447
"rcarriga/nvim-dap-ui",
446448
"nvim-neotest/nvim-nio",
447449
"theHamsta/nvim-dap-virtual-text",
450+
-- 如使用 LLDB:需要系统安装 lldb;如偏好 cpptools(Windows 友好),见下方"cppdbg"
448451
},
449452
keys = {
450453
{ "<F5>", function() require("dap").continue() end, desc = "Debug: Continue" },
@@ -473,27 +476,49 @@ return {
473476
dapui.close()
474477
end
475478

476-
-- C/C++ 调试配置 (GDB)
477-
dap.adapters.cppdbg = {
478-
id = "cppdbg",
479+
-- 方案 A:LLDB(Linux/macOS 原生良好)
480+
dap.adapters.lldb = {
479481
type = "executable",
480-
command = "gdb",
481-
args = { "-i", "dap" },
482+
command = "lldb-vscode", -- 一般随 lldb 安装
483+
name = "lldb",
482484
}
483-
484485
dap.configurations.cpp = {
485486
{
486-
name = "Launch file",
487-
type = "cppdbg",
487+
name = "Debug (LLDB)",
488+
type = "lldb",
488489
request = "launch",
489490
program = function()
490491
return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/", "file")
491492
end,
492493
cwd = "${workspaceFolder}",
493-
stopAtEntry = false,
494+
stopOnEntry = false,
495+
args = {},
494496
},
495497
}
496498
dap.configurations.c = dap.configurations.cpp
499+
500+
-- 方案 B:cppdbg(VS Code cpptools 适配,Windows/跨平台)
501+
-- 安装 Microsoft 'cpptools',获取 OpenDebugAD7 可执行文件路径并替换下面的 command
502+
-- local cpptools = "/path/to/OpenDebugAD7"
503+
-- dap.adapters.cppdbg = {
504+
-- id = "cppdbg",
505+
-- type = "executable",
506+
-- command = cpptools,
507+
-- options = { detached = false },
508+
-- }
509+
-- table.insert(dap.configurations.cpp, {
510+
-- name = "Debug (cppdbg)",
511+
-- type = "cppdbg",
512+
-- request = "launch",
513+
-- program = function()
514+
-- return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/", "file")
515+
-- end,
516+
-- cwd = "${workspaceFolder}",
517+
-- MIMode = "gdb", -- 或 "lldb"
518+
-- setupCommands = {
519+
-- { text = "-enable-pretty-printing", description = "pretty print", ignoreFailures = true },
520+
-- },
521+
-- })
497522
end,
498523
}
499524
```
@@ -838,3 +863,66 @@ git clone https://github.com/magic-alt/nvim-cpp-ide.git ~/.config/nvim
838863
相比传统 IDE,Neovim 配置更灵活、启动更快、资源占用更低。虽然初期需要投入时间学习,但一旦掌握,你将拥有一个完全按照自己习惯定制的开发环境。
839864

840865
如果你在配置过程中遇到问题,欢迎在评论区交流,或者参考 [Neovim 官方文档](https://neovim.io/doc/) 和社区资源。Happy Coding! 🚀
866+
867+
---
868+
869+
## Windows 专项提示
870+
871+
1. **工具链**:首选 LLVM/Clang + lldb(choco/scoop 可得),或 MSVC + cpptools(cppdbg)。
872+
2. **编译数据库**:CMake 生成的 `build/compile_commands.json` 在 Windows 可用 `mklink` 建软链接:
873+
```bat
874+
mklink compile_commands.json .\build\compile_commands.json
875+
```
876+
3. **路径与编码**:确保 `shell` 使用 UTF-8,PowerShell 里:`[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()`。
877+
878+
## CMake Presets 与构建一键化
879+
880+
在项目根加入 `CMakePresets.json`(示例):
881+
882+
```json
883+
{
884+
"version": 3,
885+
"cmakeMinimumRequired": { "major": 3, "minor": 20 },
886+
"configurePresets": [
887+
{
888+
"name": "dev",
889+
"generator": "Ninja",
890+
"binaryDir": "${sourceDir}/build",
891+
"cacheVariables": {
892+
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
893+
"CMAKE_BUILD_TYPE": "Debug"
894+
}
895+
}
896+
],
897+
"buildPresets": [{ "name": "dev", "configurePreset": "dev" }]
898+
}
899+
```
900+
901+
Neovim 内可配合 `Civitasv/cmake-tools.nvim`:
902+
`<leader>cg` 配置、`<leader>cb` 构建、`<leader>cr` 运行。
903+
904+
## clangd 体验升级参数
905+
906+
在 `lspconfig.clangd.setup` 中建议启用:
907+
908+
```lua
909+
cmd = {
910+
"clangd",
911+
"--background-index",
912+
"--clang-tidy",
913+
"--header-insertion=never", -- 避免自动插入不需要的头
914+
"--completion-style=detailed",
915+
"--function-arg-placeholders",
916+
"--fallback-style=llvm",
917+
}
918+
```
919+
920+
## 常见故障排查(速查表)
921+
922+
| 现象 | 排查点 | 处理 |
923+
|---|---|---|
924+
| 补全失效 | `:LspInfo` 看 clangd 是否 attached | 检查 `compile_commands.json`、根目录是否一致 |
925+
| 跳转慢 | 后台索引未完成 | 等待 `clangd` 后台索引;排除巨型目录 |
926+
| 调试断点不生效 | 可执行无符号表 | 使用 `-g` 或 `-DCMAKE_BUILD_TYPE=Debug` 重新构建 |
927+
| 终端中文乱码 | 终端编码/字体 | 统一 UTF-8,选择等宽字体(JetBrains Mono) |
928+
| Mason 安装失败 | 网络问题/权限不足 | 使用代理或手动下载 LSP 二进制文件 |

assets/css/styles.css

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
/* 字体通过 head.html 的 <link> 标签加载,避免 @import 阻塞渲染 */
22

33
:root {
4+
/* 字体栈校验:正文无衬线 Inter + Noto Sans SC,长文阅读可切换 serif;代码块 JetBrains Mono/Fira Code */
5+
/* UI/导航/按钮继承正文 sans,不需单独声明,必要处补充选择器保证一致性 */
6+
47
color-scheme: light;
58
--font-sans: "Inter", "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
69
--font-serif: "Merriweather", "Noto Serif SC", Georgia, "Times New Roman", "Songti SC", "SimSun", serif;
@@ -43,6 +46,24 @@ html[data-theme="dark"] {
4346
--shadow-card: 0 24px 56px rgba(8, 11, 19, 0.55);
4447
}
4548

49+
/* ===== 阅读模式:将正文切换为衬线(长文更舒适) =====
50+
* 使用方式(任选其一):
51+
* 1) 在页面/文章容器上加类名 .reading-serif
52+
* 2) 给 <html> 设置 data-reading="serif"
53+
* 3) 给文章 <article class="post"> 加上 .reading-serif
54+
*/
55+
.reading-serif,
56+
.reading-serif body,
57+
.reading-serif .post,
58+
.post.reading-serif,
59+
html[data-reading="serif"] body {
60+
font-family: var(--font-serif);
61+
}
62+
63+
/* 确保代码区仍用等宽字体 */
64+
.reading-serif pre,
65+
.reading-serif code { font-family: var(--font-mono); }
66+
4667
*, *::before, *::after {
4768
box-sizing: border-box;
4869
}
@@ -88,6 +109,9 @@ h6 {
88109
color: inherit;
89110
}
90111

112+
/* UI/导航/按钮:确保使用无衬线(Inter 系) */
113+
.site-nav, .nav-cta, .hero-button, button, input, select, textarea { font-family: var(--font-sans); }
114+
91115
p {
92116
margin: 0 0 1.2rem;
93117
}

0 commit comments

Comments
 (0)