编程技术分享

分享编程知识,探讨技术创新

0%

简介:超迷你的FOC驱动器。不依赖任何库,手写FOC代码,简单易懂,入门首选。

您好!非常感谢您提供这张超迷你FOC驱动器的图片以及项目需求。作为一名高级嵌入式软件开发工程师,我将为您详细阐述最适合这款超迷你FOC驱动器的代码设计架构,并提供具体的C代码实现,同时涵盖整个嵌入式系统开发流程中的关键环节。
关注微信公众号,提前获取相关推文

项目简介与需求分析

项目目标: 设计并实现一个超迷你的、全开源的FOC(磁场定向控制)电机驱动器软件,该软件应完全手写,不依赖任何外部库,代码简洁易懂,旨在为初学者提供一个入门FOC控制的理想平台。

关键需求:

  1. 超迷你: 代码需要精简高效,适用于资源受限的嵌入式系统。
  2. FOC驱动: 实现三相永磁同步电机(PMSM)的磁场定向控制,包括电流环、速度环(可选)等核心算法。
  3. 全开源: 代码完全开放,方便学习、修改和二次开发。
  4. 手写代码,不依赖库: 从底层开始编写所有代码,避免使用现成的库,以深入理解FOC控制原理。
  5. 简单易懂,入门首选: 代码结构清晰,注释详尽,降低学习门槛。
  6. 可靠、高效、可扩展: 系统平台需要具备良好的可靠性、运行效率和一定的可扩展性,为后续功能升级和优化预留空间。
  7. 实践验证: 采用的技术和方法均需经过实践验证,确保方案的可行性和有效性。
  8. 完整开发流程: 从需求分析到系统实现,再到测试验证和维护升级,体现完整的嵌入式系统开发流程。

系统架构设计

为了满足上述需求,特别是要做到“简单易懂”、“可靠高效”和“可扩展”,我推荐采用分层模块化架构。这种架构将系统分解为多个独立的模块,每个模块负责特定的功能,模块之间通过清晰的接口进行通信。这种架构具有以下优点:

  • 模块化: 功能模块独立,易于理解、开发、测试和维护。
  • 高内聚低耦合: 模块内部功能紧密相关,模块之间依赖性低,便于修改和扩展。
  • 可重用性: 某些模块(如底层驱动)可以在不同项目中重用。
  • 可测试性: 模块化设计使得单元测试更加容易进行。
  • 易于扩展: 新增功能可以通过添加新的模块或修改现有模块实现,对整体架构影响较小。

分层模块化架构设计:

我将系统架构设计为以下几个层次和模块:

  1. 硬件抽象层 (HAL - Hardware Abstraction Layer):

    • GPIO 驱动: 控制通用输入输出端口,用于电机驱动器的使能、方向控制、指示灯等。
    • PWM 驱动: 生成脉冲宽度调制信号,用于控制电机驱动桥的开关,实现电机电压的调节。
    • ADC 驱动: 模数转换,采集电机电流、电压、位置传感器(如编码器)的模拟信号。
    • Encoder 驱动: 处理编码器信号,获取电机转子的位置和速度信息。
    • Timer 驱动: 提供定时功能,用于PWM信号的生成、采样定时、控制环路定时等。
    • UART 驱动 (可选): 串口通信,用于调试、参数配置或上位机通信。
  2. 驱动层 (Driver Layer):

    • 电机驱动器驱动 (Motor Driver Driver): 封装底层的PWM和GPIO驱动,提供更高级的电机控制接口,如设置PWM占空比、使能/禁用驱动器等。
    • 电流采样驱动 (Current Sampling Driver): 封装ADC驱动,处理电流采样数据,进行滤波、校准等预处理。
    • 位置传感器驱动 (Position Sensor Driver - Encoder Driver): 封装Encoder驱动,处理编码器信号,计算电机角度和速度。
  3. 控制层 (Control Layer):

    • 坐标变换模块 (Coordinate Transformation Module): 实现 Clarke 变换、Park 变换和反 Park 变换,用于在两相静止坐标系、两相旋转坐标系和三相坐标系之间进行电流和电压的转换。
    • FOC 控制器模块 (FOC Controller Module): 实现磁场定向控制的核心算法,包括:
      • 电流环控制器 (Current Loop Controller): 通常采用 PI 控制器,控制电机的 d 轴和 q 轴电流。
      • 速度环控制器 (Speed Loop Controller - 可选): 通常采用 PI 控制器,控制电机的转速 (如果需要速度控制模式)。
      • 弱磁控制模块 (Field Weakening Module - 可选): 在高速运行时,通过控制 d 轴电流进行弱磁控制,扩展电机的调速范围 (本项目可以简化或省略)。
      • SVPWM 模块 (Space Vector PWM Module): 空间矢量脉宽调制,根据控制器的输出电压矢量,生成合适的 PWM 波形驱动电机。
    • 角度/速度估计模块 (Angle/Speed Estimation Module): 根据编码器信号或通过其他方法 (如观测器,本项目使用编码器直接测量),估计电机转子的角度和速度。
  4. 应用层 (Application Layer):

    • 系统初始化模块 (System Initialization Module): 初始化所有硬件模块、配置参数、启动定时器和中断等。
    • 主循环 (Main Loop): 程序的入口,负责任务调度、状态机管理、控制循环的执行等。
    • 参数配置模块 (Parameter Configuration Module - 可选): 通过串口或其他方式接收上位机指令,配置控制参数 (如 PI 控制器参数、电机参数等)。
    • 故障处理模块 (Fault Handling Module): 检测系统故障 (如过流、过压、编码器故障等),并进行相应的处理 (如停机保护、报警等)。

代码实现 (C 语言)

为了满足 3000 行代码的要求,我将尽可能详细地编写代码,包括详尽的注释、模块化的函数设计和必要的错误处理。以下是代码框架和关键模块的实现,由于篇幅限制,我将提供核心代码片段,并对关键部分进行详细解释。完整的 3000 行代码将包含更多的细节和完善的功能,例如更全面的错误处理、更精细的参数配置接口、以及更完善的注释和文档。

1. 硬件抽象层 (HAL)

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
// hal_gpio.h
#ifndef HAL_GPIO_H
#define HAL_GPIO_H

#include <stdint.h>
#include <stdbool.h>

// 定义 GPIO 端口和引脚 (根据具体的硬件平台定义)
typedef enum {
GPIO_PORT_A,
GPIO_PORT_B,
// ...
GPIO_PORT_MAX
} GPIO_Port;

typedef enum {
GPIO_PIN_0,
GPIO_PIN_1,
// ...
GPIO_PIN_MAX
} GPIO_Pin;

// GPIO 初始化配置结构体
typedef struct {
GPIO_Port port;
GPIO_Pin pin;
uint32_t mode; // 输入/输出/复用功能等
uint32_t pull; // 上拉/下拉/浮空
uint32_t speed; // 速度等级 (可选)
} GPIO_InitTypeDef;

// 初始化 GPIO
void HAL_GPIO_Init(GPIO_InitTypeDef *GPIO_InitStruct);

// 设置 GPIO 输出电平
void HAL_GPIO_WritePin(GPIO_Port port, GPIO_Pin pin, bool PinState);

// 读取 GPIO 输入电平
bool HAL_GPIO_ReadPin(GPIO_Port port, GPIO_Pin pin);

// ... 其他 GPIO 相关函数 (如 GPIO 锁存、中断配置等)

#endif // HAL_GPIO_H


// hal_pwm.h
#ifndef HAL_PWM_H
#define HAL_PWM_H

#include <stdint.h>

// PWM 通道定义 (根据具体的硬件平台定义)
typedef enum {
PWM_CHANNEL_1,
PWM_CHANNEL_2,
PWM_CHANNEL_3,
// ...
PWM_CHANNEL_MAX
} PWM_Channel;

// PWM 初始化配置结构体
typedef struct {
PWM_Channel channel;
uint32_t frequency; // PWM 频率
float duty_cycle; // PWM 占空比 (0.0 - 1.0)
uint32_t polarity; // 极性 (高电平有效/低电平有效)
// ... 其他 PWM 配置参数 (如预分频器、计数模式等)
} PWM_InitTypeDef;

// 初始化 PWM
void HAL_PWM_Init(PWM_InitTypeDef *PWM_InitStruct);

// 设置 PWM 占空比
void HAL_PWM_SetDutyCycle(PWM_Channel channel, float duty_cycle);

// 启动 PWM 输出
void HAL_PWM_Start(PWM_Channel channel);

// 停止 PWM 输出
void HAL_PWM_Stop(PWM_Channel channel);

// ... 其他 PWM 相关函数 (如 PWM 频率设置、相位设置等)

#endif // HAL_PWM_H


// hal_adc.h
#ifndef HAL_ADC_H
#define HAL_ADC_H

#include <stdint.h>

// ADC 通道定义 (根据具体的硬件平台定义)
typedef enum {
ADC_CHANNEL_1,
ADC_CHANNEL_2,
ADC_CHANNEL_3,
// ...
ADC_CHANNEL_MAX
} ADC_Channel;

// ADC 初始化配置结构体
typedef struct {
ADC_Channel channel;
uint32_t resolution; // ADC 分辨率 (如 12 位)
uint32_t sampling_rate; // 采样率 (可选)
// ... 其他 ADC 配置参数 (如采样时间、触发模式等)
} ADC_InitTypeDef;

// 初始化 ADC
void HAL_ADC_Init(ADC_InitTypeDef *ADC_InitStruct);

// 读取 ADC 转换值
uint16_t HAL_ADC_GetValue(ADC_Channel channel);

// 启动 ADC 转换
void HAL_ADC_StartConversion(ADC_Channel channel);

// 停止 ADC 转换
void HAL_ADC_StopConversion(ADC_Channel channel);

// ... 其他 ADC 相关函数 (如 ADC 校准、DMA 模式配置等)

#endif // HAL_ADC_H


// hal_encoder.h
#ifndef HAL_ENCODER_H
#define HAL_ENCODER_H

#include <stdint.h>

// 编码器接口定义 (根据具体的硬件平台定义)
typedef enum {
ENCODER_INTERFACE_1,
ENCODER_INTERFACE_2,
// ...
ENCODER_INTERFACE_MAX
} Encoder_Interface;

// 编码器初始化配置结构体
typedef struct {
Encoder_Interface interface;
uint32_t resolution; // 编码器分辨率 (每转脉冲数 PPR)
uint32_t mode; // 编码器模式 (正交编码、单相编码等)
// ... 其他编码器配置参数 (如计数模式、滤波等)
} Encoder_InitTypeDef;

// 初始化编码器
void HAL_Encoder_Init(Encoder_InitTypeDef *Encoder_InitStruct);

// 读取编码器计数值
int32_t HAL_Encoder_GetCounterValue(Encoder_Interface interface);

// 设置编码器计数值
void HAL_Encoder_SetCounterValue(Encoder_Interface interface, int32_t value);

// ... 其他编码器相关函数 (如编码器速度计算、中断配置等)

#endif // HAL_ENCODER_H


// hal_timer.h
#ifndef HAL_TIMER_H
#define HAL_TIMER_H

#include <stdint.h>
#include <stdbool.h>

// 定时器定义 (根据具体的硬件平台定义)
typedef enum {
TIMER_1,
TIMER_2,
// ...
TIMER_MAX
} TIMER_Instance;

// 定时器初始化配置结构体
typedef struct {
TIMER_Instance instance;
uint32_t prescaler; // 预分频器
uint32_t period; // 计数周期
// ... 其他定时器配置参数 (如计数模式、中断使能等)
} TIMER_InitTypeDef;

// 初始化定时器
void HAL_Timer_Init(TIMER_InitTypeDef *Timer_InitStruct);

// 启动定时器
void HAL_Timer_Start(TIMER_Instance instance);

// 停止定时器
void HAL_Timer_Stop(TIMER_Instance instance);

// 设置定时器周期
void HAL_Timer_SetPeriod(TIMER_Instance instance, uint32_t period);

// 获取定时器当前计数值
uint32_t HAL_Timer_GetCounter(TIMER_Instance instance);

// 设置定时器中断回调函数 (可选)
void HAL_Timer_SetInterruptCallback(TIMER_Instance instance, void (*callback)(void));

// 使能定时器中断 (可选)
void HAL_Timer_EnableInterrupt(TIMER_Instance instance);

// 禁用定时器中断 (可选)
void HAL_Timer_DisableInterrupt(TIMER_Instance instance);

// ... 其他定时器相关函数 (如 PWM 输出功能配置、输入捕获功能配置等)

#endif // HAL_TIMER_H


// 示例 HAL 层实现 (hal_gpio.c, hal_pwm.c, hal_adc.c, hal_encoder.c, hal_timer.c)
// 这些 .c 文件将根据具体的硬件平台编写,例如针对 STM32 微控制器的 HAL 库实现。
// 这里为了演示,只提供一个简单的 hal_gpio.c 示例:

// hal_gpio.c
#include "hal_gpio.h"

// 硬件寄存器地址 (需要根据具体的硬件平台定义)
#define GPIOA_MODER (volatile uint32_t*)(0x40020000) // GPIOA 模式寄存器
#define GPIOA_ODR (volatile uint32_t*)(0x40020014) // GPIOA 输出数据寄存器
#define GPIOA_IDR (volatile uint32_t*)(0x40020010) // GPIOA 输入数据寄存器
// ... 其他 GPIO 寄存器地址

void HAL_GPIO_Init(GPIO_InitTypeDef *GPIO_InitStruct) {
// 根据 GPIO_InitStruct 配置硬件寄存器
// 示例:配置 GPIOA Pin 5 为输出模式,推挽输出,无上下拉
if (GPIO_InitStruct->port == GPIO_PORT_A && GPIO_InitStruct->pin == GPIO_PIN_5) {
// 配置模式为输出模式 (01)
*GPIOA_MODER &= ~(3 << (5 * 2)); // 清除位
*GPIOA_MODER |= (1 << (5 * 2)); // 设置位

// 配置为推挽输出 (默认)

// 配置为无上下拉 (默认)
}
// ... 其他 GPIO 初始化配置
}

void HAL_GPIO_WritePin(GPIO_Port port, GPIO_Pin pin, bool PinState) {
// 设置 GPIO 输出电平
if (PinState) {
// 输出高电平
if (port == GPIO_PORT_A) {
*GPIOA_ODR |= (1 << pin);
}
// ... 其他端口
} else {
// 输出低电平
if (port == GPIO_PORT_A) {
*GPIOA_ODR &= ~(1 << pin);
}
// ... 其他端口
}
}

bool HAL_GPIO_ReadPin(GPIO_Port port, GPIO_Pin pin) {
// 读取 GPIO 输入电平
if (port == GPIO_PORT_A) {
return (*GPIOA_IDR & (1 << pin)) ? true : false;
}
// ... 其他端口
return false; // 默认返回低电平
}

2. 驱动层 (Driver Layer)

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// motor_driver.h
#ifndef MOTOR_DRIVER_H
#define MOTOR_DRIVER_H

#include "hal_pwm.h"
#include "hal_gpio.h"

// 电机驱动器配置结构体
typedef struct {
PWM_Channel pwm_u_channel; // U 相 PWM 通道
PWM_Channel pwm_v_channel; // V 相 PWM 通道
PWM_Channel pwm_w_channel; // W 相 PWM 通道
GPIO_Port enable_port; // 使能 GPIO 端口
GPIO_Pin enable_pin; // 使能 GPIO 引脚
GPIO_Port direction_port; // 方向 GPIO 端口 (如果需要)
GPIO_Pin direction_pin; // 方向 GPIO 引脚 (如果需要)
// ... 其他电机驱动器配置参数
} MotorDriver_InitTypeDef;

// 初始化电机驱动器
void MotorDriver_Init(MotorDriver_InitTypeDef *driver_config);

// 设置电机驱动器 PWM 占空比 (三相)
void MotorDriver_SetDutyCycle(float duty_u, float duty_v, float duty_w);

// 使能电机驱动器
void MotorDriver_Enable();

// 禁用电机驱动器
void MotorDriver_Disable();

// ... 其他电机驱动器控制函数 (如设置方向、刹车等)

#endif // MOTOR_DRIVER_H


// current_sensor.h
#ifndef CURRENT_SENSOR_H
#define CURRENT_SENSOR_H

#include "hal_adc.h"

// 电流传感器配置结构体
typedef struct {
ADC_Channel current_u_channel; // U 相电流 ADC 通道
ADC_Channel current_v_channel; // V 相电流 ADC 通道
ADC_Channel current_w_channel; // W 相电流 ADC 通道 (可选,如果使用三相电流传感器)
float sensitivity; // 传感器灵敏度 (A/V)
float offset; // 传感器零点偏移 (V)
// ... 其他电流传感器配置参数 (如滤波参数)
} CurrentSensor_InitTypeDef;

// 初始化电流传感器
void CurrentSensor_Init(CurrentSensor_InitTypeDef *sensor_config);

// 读取三相电流值 (单位: 安培)
void CurrentSensor_GetPhaseCurrents(float *i_u, float *i_v, float *i_w);

// ... 其他电流传感器相关函数 (如电流校准、滤波处理等)

#endif // CURRENT_SENSOR_H


// encoder_sensor.h
#ifndef ENCODER_SENSOR_H
#define ENCODER_SENSOR_H

#include "hal_encoder.h"

// 编码器传感器配置结构体
typedef struct {
Encoder_Interface encoder_interface; // 编码器接口
uint32_t ppr; // 编码器每转脉冲数 (PPR)
float pole_pairs; // 电机极对数
// ... 其他编码器传感器配置参数 (如方向、零位校准)
} EncoderSensor_InitTypeDef;

// 初始化编码器传感器
void EncoderSensor_Init(EncoderSensor_InitTypeDef *sensor_config);

// 获取电机转子机械角度 (弧度)
float EncoderSensor_GetMechanicalAngle();

// 获取电机转子电角度 (弧度)
float EncoderSensor_GetElectricalAngle();

// 获取电机转速 (弧度/秒)
float EncoderSensor_GetAngularVelocity();

// ... 其他编码器传感器相关函数 (如编码器零位校准、方向设置等)

#endif // ENCODER_SENSOR_H


// 示例驱动层实现 (motor_driver.c, current_sensor.c, encoder_sensor.c)
// 这里只提供 motor_driver.c 的部分示例:

// motor_driver.c
#include "motor_driver.h"

MotorDriver_InitTypeDef motor_driver_config;

void MotorDriver_Init(MotorDriver_InitTypeDef *driver_config) {
motor_driver_config = *driver_config; // 复制配置参数

// 初始化 PWM 通道
PWM_InitTypeDef pwm_init;
pwm_init.frequency = 20000; // 20kHz PWM 频率 (根据实际需求调整)
pwm_init.duty_cycle = 0.0f; // 初始占空比为 0
pwm_init.polarity = PWM_POLARITY_HIGH; // 高电平有效 (根据实际驱动器逻辑调整)

pwm_init.channel = motor_driver_config.pwm_u_channel;
HAL_PWM_Init(&pwm_init);
pwm_init.channel = motor_driver_config.pwm_v_channel;
HAL_PWM_Init(&pwm_init);
pwm_init.channel = motor_driver_config.pwm_w_channel;
HAL_PWM_Init(&pwm_init);

// 初始化使能 GPIO
GPIO_InitTypeDef gpio_init;
gpio_init.port = motor_driver_config.enable_port;
gpio_init.pin = motor_driver_config.enable_pin;
gpio_init.mode = GPIO_MODE_OUTPUT;
gpio_init.pull = GPIO_PULL_NONE;
HAL_GPIO_Init(&gpio_init);
MotorDriver_Disable(); // 初始状态禁用驱动器

// ... 初始化方向 GPIO (如果需要)
}

void MotorDriver_SetDutyCycle(float duty_u, float duty_v, float duty_w) {
HAL_PWM_SetDutyCycle(motor_driver_config.pwm_u_channel, duty_u);
HAL_PWM_SetDutyCycle(motor_driver_config.pwm_v_channel, duty_v);
HAL_PWM_SetDutyCycle(motor_driver_config.pwm_w_channel, duty_w);
}

void MotorDriver_Enable() {
HAL_GPIO_WritePin(motor_driver_config.enable_port, motor_driver_config.enable_pin, true);
}

void MotorDriver_Disable() {
HAL_GPIO_WritePin(motor_driver_config.enable_port, motor_driver_config.enable_pin, false);
}

3. 控制层 (Control Layer)

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
// coordinate_transformation.h
#ifndef COORDINATE_TRANSFORMATION_H
#define COORDINATE_TRANSFORMATION_H

#include <math.h>

// Clarke 变换 (三相 abc -> 两相 alpha-beta)
void clarke_transform(float i_a, float i_b, float i_c, float *i_alpha, float *i_beta);

// Park 变换 (两相 alpha-beta -> 两相 dq, 基于电角度 theta)
void park_transform(float i_alpha, float i_beta, float theta, float *i_d, float *i_q);

// 反 Park 变换 (两相 dq -> 两相 alpha-beta, 基于电角度 theta)
void inverse_park_transform(float v_d, float v_q, float theta, float *v_alpha, float *v_beta);

// 反 Clarke 变换 (两相 alpha-beta -> 三相 abc) - 用于 SVPWM 模块
void inverse_clarke_transform(float v_alpha, float v_beta, float *v_a, float *v_b, float *v_c);

#endif // COORDINATE_TRANSFORMATION_H


// foc_controller.h
#ifndef FOC_CONTROLLER_H
#define FOC_CONTROLLER_H

#include "coordinate_transformation.h"
#include "encoder_sensor.h"
#include "current_sensor.h"
#include "motor_driver.h"

// PI 控制器结构体
typedef struct {
float kp; // 比例增益
float ki; // 积分增益
float integral_term; // 积分项累积值
float output_limit; // 输出限幅
} PI_Controller_t;

// 初始化 PI 控制器
void PI_Controller_Init(PI_Controller_t *controller, float kp, float ki, float output_limit);

// PI 控制器计算
float PI_Controller_Update(PI_Controller_t *controller, float setpoint, float feedback, float dt);

// FOC 控制器结构体
typedef struct {
PI_Controller_t id_controller; // d 轴电流环 PI 控制器
PI_Controller_t iq_controller; // q 轴电流环 PI 控制器
float voltage_limit; // 电压矢量幅值限制
float last_theta_elec; // 上一次电角度 (用于速度计算)
} FOC_Controller_t;

// 初始化 FOC 控制器
void FOC_Controller_Init(FOC_Controller_t *controller);

// FOC 控制器运行 (电流环控制)
void FOC_Controller_Run(FOC_Controller_t *controller, float i_d_ref, float i_q_ref, float dt);

// 设置 FOC 控制器参数
void FOC_Controller_SetParameters(FOC_Controller_t *controller, float id_kp, float id_ki, float iq_kp, float iq_ki, float voltage_limit);

#endif // FOC_CONTROLLER_H


// svpwm.h
#ifndef SVPWM_H
#define SVPWM_H

// SVPWM 模块
void SVPWM_GenerateDutyCycles(float v_alpha_ref, float v_beta_ref, float *duty_u, float *duty_v, float *duty_w);

#endif // SVPWM_H


// 示例控制层实现 (coordinate_transformation.c, foc_controller.c, svpwm.c)
// 示例 coordinate_transformation.c :

// coordinate_transformation.c
#include "coordinate_transformation.h"

void clarke_transform(float i_a, float i_b, float i_c, float *i_alpha, float *i_beta) {
*i_alpha = i_a;
*i_beta = (i_a / sqrtf(3.0f)) + (2.0f / sqrtf(3.0f)) * i_b; // 简化公式,假设 i_a + i_b + i_c = 0
}

void park_transform(float i_alpha, float i_beta, float theta, float *i_d, float *i_q) {
*i_d = i_alpha * cosf(theta) + i_beta * sinf(theta);
*i_q = -i_alpha * sinf(theta) + i_beta * cosf(theta);
}

void inverse_park_transform(float v_d, float v_q, float theta, float *v_alpha, float *v_beta) {
*v_alpha = v_d * cosf(theta) - v_q * sinf(theta);
*v_beta = v_d * sinf(theta) + v_q * cosf(theta);
}

void inverse_clarke_transform(float v_alpha, float v_beta, float *v_a, float *v_b, float *v_c) {
*v_a = v_alpha;
*v_b = (-0.5f) * v_alpha + (sqrtf(3.0f) / 2.0f) * v_beta;
*v_c = (-0.5f) * v_alpha - (sqrtf(3.0f) / 2.0f) * v_beta;
}


// 示例 foc_controller.c (部分代码):

// foc_controller.c
#include "foc_controller.h"
#include "encoder_sensor.h"
#include "current_sensor.h"
#include "motor_driver.h"
#include "svpwm.h"

FOC_Controller_t foc_controller;

void FOC_Controller_Init(FOC_Controller_t *controller) {
controller->voltage_limit = 1.0f; // 默认电压幅值限制为 1.0 (对应 PWM 占空比 100%)
PI_Controller_Init(&controller->id_controller, 1.0f, 0.1f, controller->voltage_limit); // 初始化 d 轴电流环 PI 控制器
PI_Controller_Init(&controller->iq_controller, 1.0f, 0.1f, controller->voltage_limit); // 初始化 q 轴电流环 PI 控制器
controller->last_theta_elec = 0.0f; // 初始化上一次电角度
foc_controller = *controller; // 复制配置
}

void FOC_Controller_Run(FOC_Controller_t *controller, float i_d_ref, float i_q_ref, float dt) {
float i_u, i_v, i_w;
float i_alpha, i_beta, i_d, i_q;
float v_d_ref, v_q_ref, v_alpha_ref, v_beta_ref;
float duty_u, duty_v, duty_w;
float theta_elec;

// 1. 读取电流传感器值
CurrentSensor_GetPhaseCurrents(&i_u, &i_v, &i_w);

// 2. 读取编码器电角度
theta_elec = EncoderSensor_GetElectricalAngle();

// 3. Clarke 变换 (abc -> alpha-beta)
clarke_transform(i_u, i_v, i_w, &i_alpha, &i_beta);

// 4. Park 变换 (alpha-beta -> dq)
park_transform(i_alpha, i_beta, theta_elec, &i_d, &i_q);

// 5. 电流环 PI 控制器
v_d_ref = PI_Controller_Update(&controller->id_controller, i_d_ref, i_d, dt);
v_q_ref = PI_Controller_Update(&controller->iq_controller, i_q_ref, i_q, dt);

// 6. 电压矢量限幅 (可选,简化版本可以忽略)
float v_ref_magnitude = sqrtf(v_d_ref * v_d_ref + v_q_ref * v_q_ref);
if (v_ref_magnitude > controller->voltage_limit) {
v_d_ref = v_d_ref * controller->voltage_limit / v_ref_magnitude;
v_q_ref = v_q_ref * controller->voltage_limit / v_ref_magnitude;
}

// 7. 反 Park 变换 (dq -> alpha-beta)
inverse_park_transform(v_d_ref, v_q_ref, theta_elec, &v_alpha_ref, &v_beta_ref);

// 8. SVPWM 调制 (alpha-beta -> duty cycles)
SVPWM_GenerateDutyCycles(v_alpha_ref, v_beta_ref, &duty_u, &duty_v, &duty_w);

// 9. 设置 PWM 占空比
MotorDriver_SetDutyCycle(duty_u, duty_v, duty_w);

controller->last_theta_elec = theta_elec; // 更新上一次电角度
}


// 示例 svpwm.c (简化版本,基于六步调制):

// svpwm.c
#include "svpwm.h"
#include <math.h>

void SVPWM_GenerateDutyCycles(float v_alpha_ref, float v_beta_ref, float *duty_u, float *duty_v, float *duty_w) {
float v_ref_angle = atan2f(v_beta_ref, v_alpha_ref); // 参考电压矢量角度
if (v_ref_angle < 0) {
v_ref_angle += 2 * M_PI; // 角度归一化到 0 - 2PI
}
float v_ref_mag = sqrtf(v_alpha_ref * v_alpha_ref + v_beta_ref * v_beta_ref); // 参考电压矢量幅值
if (v_ref_mag > 1.0f) v_ref_mag = 1.0f; // 限幅 (占空比最大 100%)

int sector = (int)(v_ref_angle / (M_PI / 3.0f)) + 1; // 计算扇区 (1-6)
if (sector > 6) sector = 1;

float t1 = v_ref_mag * sinf((float)sector * M_PI / 3.0f - v_ref_angle) / sinf(M_PI / 3.0f);
float t2 = v_ref_mag * sinf(v_ref_angle - (float)(sector - 1) * M_PI / 3.0f) / sinf(M_PI / 3.0f);
float t0 = 1.0f - t1 - t2; // 零矢量时间

float duty_a, duty_b, duty_c;

switch (sector) {
case 1: duty_a = (t1 + t2 + t0 / 2.0f); duty_b = (t2 + t0 / 2.0f); duty_c = (t0 / 2.0f); break;
case 2: duty_a = (t1 + t0 / 2.0f); duty_b = (t1 + t2 + t0 / 2.0f); duty_c = (t0 / 2.0f); break;
case 3: duty_a = (t0 / 2.0f); duty_b = (t1 + t2 + t0 / 2.0f); duty_c = (t2 + t0 / 2.0f); break;
case 4: duty_a = (t0 / 2.0f); duty_b = (t1 + t0 / 2.0f); duty_c = (t1 + t2 + t0 / 2.0f); break;
case 5: duty_a = (t2 + t0 / 2.0f); duty_b = (t0 / 2.0f); duty_c = (t1 + t2 + t0 / 2.0f); break;
case 6: duty_a = (t1 + t2 + t0 / 2.0f); duty_b = (t0 / 2.0f); duty_c = (t1 + t0 / 2.0f); break;
default:duty_a = 0; duty_b = 0; duty_c = 0; break;
}

*duty_u = duty_a;
*duty_v = duty_b;
*duty_w = duty_c;
}

4. 应用层 (Application Layer)

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// main.c
#include "system_init.h"
#include "foc_controller.h"
#include "encoder_sensor.h"
#include "current_sensor.h"
#include "motor_driver.h"
#include "hal_timer.h"
#include "hal_gpio.h"

// 定义全局变量
FOC_Controller_t foc_controller;
EncoderSensor_InitTypeDef encoder_sensor_config;
CurrentSensor_InitTypeDef current_sensor_config;
MotorDriver_InitTypeDef motor_driver_config;
TIMER_InitTypeDef control_loop_timer_config;

volatile float target_iq_current = 0.5f; // 目标 q 轴电流 (示例值)
volatile float control_loop_dt = 0.0001f; // 控制环周期 0.1ms (10kHz)

// 控制环定时器中断回调函数
void ControlLoop_IRQHandler(void) {
// FOC 控制器运行
FOC_Controller_Run(&foc_controller, 0.0f, target_iq_current, control_loop_dt);
}

int main(void) {
System_Init(); // 系统初始化

// 初始化编码器传感器配置
encoder_sensor_config.encoder_interface = ENCODER_INTERFACE_1; // 假设使用编码器接口 1
encoder_sensor_config.ppr = 1024; // 假设编码器 PPR 为 1024
encoder_sensor_config.pole_pairs = 7; // 假设电机极对数为 7
EncoderSensor_Init(&encoder_sensor_config);

// 初始化电流传感器配置 (需要根据实际硬件参数配置)
current_sensor_config.current_u_channel = ADC_CHANNEL_1;
current_sensor_config.current_v_channel = ADC_CHANNEL_2;
current_sensor_config.sensitivity = 0.1f; // 示例灵敏度 0.1A/V
current_sensor_config.offset = 0.0f; // 示例零点偏移 0V
CurrentSensor_Init(&current_sensor_config);

// 初始化电机驱动器配置 (需要根据实际硬件连接配置)
motor_driver_config.pwm_u_channel = PWM_CHANNEL_1;
motor_driver_config.pwm_v_channel = PWM_CHANNEL_2;
motor_driver_config.pwm_w_channel = PWM_CHANNEL_3;
motor_driver_config.enable_port = GPIO_PORT_A;
motor_driver_config.enable_pin = GPIO_PIN_0;
MotorDriver_Init(&motor_driver_config);

// 初始化 FOC 控制器
FOC_Controller_Init(&foc_controller);
FOC_Controller_SetParameters(&foc_controller, 2.0f, 0.2f, 2.0f, 0.2f, 1.0f); // 设置 PI 参数和电压限幅

// 初始化控制环定时器
control_loop_timer_config.instance = TIMER_1; // 假设使用定时器 1
control_loop_timer_config.prescaler = 72 - 1; // 假设系统时钟 72MHz, 预分频 72, 定时器时钟 1MHz
control_loop_timer_config.period = 100 - 1; // 计数周期 100, 定时器频率 10kHz (1/100us = 10kHz)
HAL_Timer_Init(&control_loop_timer_config);
HAL_Timer_SetInterruptCallback(TIMER_1, ControlLoop_IRQHandler); // 设置中断回调函数
HAL_Timer_EnableInterrupt(TIMER_1); // 使能定时器中断
HAL_Timer_Start(TIMER_1); // 启动定时器

MotorDriver_Enable(); // 使能电机驱动器

while (1) {
// 主循环中可以处理其他任务,如参数调整、状态监控、通信等
// 这里示例简单电流环控制,目标 q 轴电流固定
}
}


// system_init.c (示例系统初始化)
#include "system_init.h"
#include "hal_gpio.h"
#include "hal_timer.h"
#include "hal_adc.h"
#include "hal_encoder.h"

void System_Init(void) {
// 初始化系统时钟 (根据具体的硬件平台配置)
// 例如,配置时钟源、PLL、分频器等
// ...

// 初始化 GPIO 外设时钟
// ...

// 初始化 PWM 外设时钟
// ...

// 初始化 ADC 外设时钟
// ...

// 初始化 Encoder 外设时钟
// ...

// 初始化 Timer 外设时钟
// ...

// 初始化 NVIC (中断向量控制器)
// ...

// ... 其他系统初始化操作 (如外设初始化顺序、默认参数加载等)
}

开发流程概述

  1. 需求分析和系统设计: 明确项目需求,设计系统架构、模块划分、接口定义等。
  2. 硬件平台搭建和验证: 选择合适的硬件平台,搭建电路,验证硬件功能 (如 PWM 输出、ADC 采样、编码器读取等)。
  3. HAL 层和驱动层开发: 根据硬件平台,编写 HAL 层代码,实现底层硬件驱动。然后,基于 HAL 层,编写驱动层代码,封装硬件操作,提供更高级的接口。
  4. 控制层算法实现: 实现 FOC 控制算法,包括坐标变换、PI 控制器、SVPWM 等模块。
  5. 应用层程序开发: 编写主程序,进行系统初始化、参数配置、任务调度、控制循环执行等。
  6. 系统集成和测试: 将各个模块集成在一起,进行系统级测试,包括功能测试、性能测试、稳定性测试等。
  7. 参数整定和优化: 根据测试结果,调整控制参数 (如 PI 控制器参数),优化系统性能。
  8. 代码审查和文档编写: 进行代码审查,确保代码质量和可读性。编写详细的文档,包括代码注释、用户手册、开发文档等。
  9. 维护和升级: 对系统进行维护,修复 Bug,根据需求进行功能升级和扩展。

技术和方法验证

本项目中采用的技术和方法都是经过实践验证的,例如:

  • 分层模块化架构: 广泛应用于嵌入式系统开发,能够提高代码的可维护性和可扩展性。
  • 手写 FOC 代码: 通过手写代码,能够深入理解 FOC 控制原理,为后续的优化和改进打下基础。
  • PI 控制器: 经典的控制算法,在电机控制领域应用广泛,易于实现和调试。
  • SVPWM: 高效的 PWM 调制技术,能够提高电机驱动效率和降低谐波。
  • 编码器反馈: 常用的位置和速度传感器,能够实现高精度的闭环控制。
  • 定时器中断: 利用定时器中断实现精确的控制周期,保证控制系统的实时性。

总结

以上代码框架和示例代码片段为您提供了一个超迷你 FOC 驱动器的软件设计方案。完整的 3000 行代码将包含更详细的 HAL 层和驱动层实现 (根据具体的硬件平台),更完善的控制层算法 (例如更高级的 SVPWM 算法、弱磁控制等),以及更全面的应用层功能 (例如参数配置接口、故障诊断和处理、上位机通信等)。

这个项目的设计目标是简单易懂入门首选,因此代码重点在于清晰的结构和详细的注释,而不是追求极致的性能和复杂的功能。通过这个项目,初学者可以快速入门 FOC 控制,并在此基础上进行更深入的学习和实践。

希望这份详细的架构设计和代码示例能够帮助您理解和实现超迷你 FOC 驱动器的软件部分。如果您有任何疑问或需要进一步的帮助,请随时提出!

欢迎关注我的其它发布渠道