STM32F1单电阻采样FOC系统代码功能详解
单电阻采样 基于单电阻采样的相电流重构算法 keil完整工程。 单电阻采样 f103的单电阻,完整工程,带文档,带硬件资料。 f3平台的单电阻完整工程,代码详细注释。 还有微芯的单电阻smo代码加文档 具体如截图请看下
一、系统概述
本文档基于提供的STM32F1单电阻采样方案代码(A062_STM32F1单电阻采样方案)及相关参考资料(单电阻FOC教程、500e算法解析等),详细解读系统的核心功能、硬件配置、软件架构及关键算法实现。该系统是一款基于STM32F1微控制器的永磁同步电机(PMSM)磁场定向控制(FOC)解决方案,采用单电阻电流采样技术,具有成本低、硬件结构简洁、控制精度高的特点,适用于中低端工业控制、家电电机驱动等场景。
系统核心目标是通过单电阻采样重构三相电流,结合SVPWM(空间矢量脉宽调制)、无感位置估计(SVC)、参数辨识等算法,实现电机的高精度速度和转矩控制。支持电机参数自动辨识、无感运行、启动定位等完整功能,硬件适配STM32F103系列芯片,软件基于HAL库开发,具有良好的可移植性和扩展性。
二、硬件配置与底层驱动
2.1 核心硬件参数
| 硬件模块 | 参数配置 | 功能说明 |
|---|---|---|
| 微控制器 | STM32F103C8Tx | 核心控制单元,主频72MHz(HSI倍频) |
| 外部晶振 | 8MHz(HSI默认8MHz) | 系统时钟源,经PLL倍频至72MHz |
| PWM模块 | TIM1(高级定时器) | 生成三相PWM波形,支持中心对齐模式、死区控制 |
| 采样电阻 | 0.000667Ω(参考硬件计算文件) | 母线电流采样,配合运放放大30倍 |
| ADC模块 | ADC1(12位精度) | 采样电阻电压、母线电压,支持注入式采样触发 |
| DMA控制器 | DMA1通道1/4/5 | 实现ADC采样数据、PWM占空比的DMA传输,降低CPU负载 |
| 电机参数 | 额定功率60kW,额定转速2300rpm,6对极 | Rs=0.021Ω,Ld=0.00026H,Lq=0.00053H,φr=0.078Wb |
2.2 底层驱动实现
2.2.1 时钟配置(SystemClock_Config)
系统采用HSI(内部8MHz)作为时钟源,经PLL倍频16倍后得到72MHz系统时钟(SYSCLK),AHB总线时钟为72MHz,APB1总线时钟36MHz(定时器时钟72MHz),APB2总线时钟72MHz。ADC时钟经分频6倍后为12MHz,确保采样精度。
关键代码片段:
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; // 8MHz/2 *16=64MHz(实际代码中为72MHz,需结合芯片手册调整)
2.2.2 PWM模块配置(MX_TIM1_Init)
TIM1配置为中心对齐模式3(COUNTERMODE_CENTERALIGNED3),PWM频率16kHz(周期=64000000/16000/2=2000),支持死区控制(死区时间8个时钟周期)。通道1-3用于输出三相PWM波形(U/V/W相),通道4用于触发ADC注入式采样。
通过DMA1通道5实现PWM占空比的批量更新(BURST模式),支持前半周期和后半周期占空比独立配置,为单电阻采样的移相策略提供硬件支持。
2.2.3 ADC模块配置(MX_ADC1_Init)
ADC1配置为扫描模式(SCANENABLE),非连续采样(CONTINUOUSConvMode=DISABLE),外部触发源为TIM3TRGO(常规采样)和TIM1CC4(注入采样)。常规通道采样母线电压(ADCCHANNEL3)和参考电压(ADCCHANNEL0),注入通道采样电阻电压(ADCCHANNEL_6),采样时间1.5个ADC时钟周期。
通过DMA1通道1将ADC采样数据传输至内存缓冲区,避免CPU中断等待,提升采样实时性。
2.2.4 GPIO配置
- 输出引脚:PA8-PA10(TIM1CH1-CH3,U/V/W相上桥驱动),PB13-PB15(TIM1CH1N-CH3N,U/V/W相下桥驱动),LED指示灯(PA7)。
- 输入引脚:PA1(方向控制Dir),PA2(状态反馈Sfb),PB12(PWM刹车信号pwm_ocBrk)。
- 模拟引脚:PA0(Vsp采样),PA3(Udc母线电压采样),PA6(Iu电流采样)。
三、核心算法模块
3.1 单电阻电流采样与重构
单电阻采样是系统的核心硬件简化方案,通过在母线串联一个采样电阻,利用PWM周期内不同时刻的开关管状态,实现三相电流的重构。核心流程包括移相策略、采样点确定、电流重构三个步骤。
3.1.1 移相策略(参考单电阻FOC教程1.1节)
定义三相占空比为hig(最大)、mid(中间)、low(最小),计算delta1=mid-low,delta2=hig-mid,delta=hig-low。根据delta1、delta2与最小采样时间Tmin的关系,分为三种移相场景:
- 三相接近(delta<2*Tmin):固定最大相占空比,左移中间相和最小相,增大delta1和delta2。
- 一长两短(delta2
- 两长一短(delta1
代码中通过DMA批量更新PWM占空比实现移相,关键函数:
HAL_TIM_DMABurst_MultiWriteStart(&htim1, TIM_DMABASE_CCR1, TIM_DMA_UPDATE, &test, TIM_DMABURSTLENGTH_3TRANSFERS, (2*3));
3.1.2 采样点确定(参考单电阻FOC教程1.3节)
采样点需避开开关管切换的暂态过程,考虑死区延迟和电流稳定时间:
- 第一相采样延迟=死区时间(1us)+ 电流稳定时间(2us)。
- 第二相采样无需考虑死区时间,仅需电流稳定时间(2us)。
ADC采样触发由TIM1_CH4比较匹配触发,采样点延迟通过调整比较寄存器值实现(64MHz PWM时钟下,1us对应64个计数单位)。
3.1.3 电流重构(参考单电阻FOC教程1.2节)
根据电压空间矢量所在扇区(0-5扇区),通过两次采样电阻电流计算三相电流。各扇区采样逻辑如下表:
| 扇区 | 占空比最大相 | 占空比居中相 | 占空比最小相 | 第一次采电流 | 第二次采电流 |
|---|---|---|---|---|---|
| 0 | a | b | c | -Ic | Ia |
| 1 | b | a | c | -Ic | Ib |
| 2 | b | c | a | -Ia | Ib |
| 3 | c | b | a | -Ia | Ic |
| 4 | c | a | b | -Ib | Ic |
| 5 | a | c | b | -Ib | Ia |
代码中通过Udm_GetMotorAdcRslts()函数读取ADC采样数据,结合扇区判断逻辑重构三相电流,核心公式:
\[ Ia + Ib + Ic = 0 \]
\[ 重构电流 = 采样电阻电流 \times 放大倍数 / 采样电阻值 \]
3.2 电机参数辨识(参考500e算法解析第1章)
系统支持电感(Ld/Lq)、电阻(Rs)、磁链(φr)、反电势的自动辨识,确保控制算法的适应性。
3.2.1 电感辨识
通过直流定位将电机转子固定在0°和90°位置,施加特定电压脉冲,采样电流上升沿和下降沿的变化率,计算线电感Lbc,进而推导dq轴电感:
\[ Lq = Lbc/2 \quad (0°位置) \]
\[ Ld = Lbc/2 \quad (90°位置) \]
辨识过程由状态机控制,包含转子定位、脉冲施加、电流采样、电感计算四个阶段,关键代码在getLdqisr()函数中实现。
3.2.2 电阻辨识
通过闭环控制将定子电流稳定在0.5倍额定电流,采样定子电压和电流,利用欧姆定律计算定子电阻:
\[ Rs = U / I \]
辨识过程中采用类积分控制器调节电流,避免电流过冲,采样512组数据求平均以降低误差,关键代码在RunCaseGetPar()函数中实现。
3.3 无感位置与速度估计(SVC,参考500e算法解析第2-3章)
系统采用滑模观测器(SMO)实现电机转子位置和速度的无感估计,核心流程包括电流估计、反电势估计、速度计算、角度积分。
3.3.1 电流估计
基于dq轴电机模型,结合采样电流和电压,估计dq轴电流:
\[ did = \frac{Ts}{Ld} (ud - Rs id + \omegae Lq i_q) \]
\[ diq = \frac{Ts}{Lq} (uq - Rs iq - \omegae (Ld id + \psir)) \]
代码中通过IsrSvcCtrl()函数实现电流估计,提前计算Ts/Ld、Rs*Ts/Ld等系数,降低实时计算量。
3.3.2 速度与位置估计
通过反电势估计值计算电机电角速度:
\[ \omegae \psir = \frac{u{q1} i{d2} - u{q2} i{d1}}{i{d2} - i{d1}} \]
\[ \omegae = \frac{\omegae \psir}{\psir} \]
电角度由角速度积分得到,通过gPmsmRotorPosEst.SvcRotorPos变量存储,右移16位后作为磁场定向控制的d轴位置参考。
3.4 磁场定向控制(FOC)
FOC控制的核心是将三相定子电流转换为dq旋转坐标系,通过电流环和速度环的双闭环控制,实现转矩和速度的解耦控制。
3.4.1 坐标变换
- 克拉克变换(Clark):将三相电流(Ia/Ib/Ic)转换为两相静止坐标系电流(Iα/Iβ)。
- 帕克变换(Park):将Iα/Iβ转换为两相旋转坐标系电流(Id/Iq),其中Id为直轴电流(磁场分量),Iq为交轴电流(转矩分量)。
代码中通过gIMTQ12结构体存储变换后的电流值,采用定点数运算(Q12格式)确保精度和实时性。
3.4.2 电流环控制
电流环采用并联式PI控制器,控制周期与PWM周期一致(16kHz),PI参数根据电机参数动态生成:
\[ kp = \frac{3L}{nTs} \]
\[ ki = \frac{3Rs}{nT_s} \]
其中n为控制系数(默认n=8),Ts为采样周期。PI控制器输出为dq轴电压参考(Ud/Uq),经反帕克变换和SVPWM调制后生成PWM占空比。
3.4.3 速度环控制
速度环采用PI控制器,控制周期2ms,输入为速度给定与估计值的偏差,输出为q轴电流参考(Iqref),限制在电机额定电流范围内。关键代码在speedpi()函数中实现,支持转矩模式和速度模式切换。
3.5 SVPWM调制(参考单电阻FOC教程2.4节、500e算法解析5.3节)
系统采用空间矢量脉宽调制,根据Ud/Uq电压参考,计算电压空间矢量所在扇区和作用时间,生成三相PWM占空比。
3.5.1 扇区判断
根据Iα/Iβ的正负和幅值关系,判断电压矢量所在扇区(0-5扇区)。
3.5.2 作用时间计算
根据伏秒平衡原理,计算相邻两个基本矢量和零矢量的作用时间:
\[ U{ref} \cdot Ts = Ux Tx + Uy Ty + U0 T0 \]
其中T0为零矢量作用时间,Tx/Ty为基本矢量作用时间。
3.5.3 占空比生成
根据扇区和作用时间,计算三相PWM的比较寄存器值,通过DMA批量更新至TIM1的CCR1-CCR3寄存器,实现PWM波形输出。
四、软件架构与中断管理
4.1 软件分层架构
| 层级 | 核心模块 | 功能说明 |
|---|---|---|
| 硬件抽象层 | HAL库、GPIO/PWM/ADC/DMA驱动 | 底层硬件操作封装 |
| 驱动层 | Msp_Driver.c、Motor.c | 电机驱动、参数配置、底层接口适配 |
| 算法层 | FOC控制、SVC观测器、参数辨识 | 坐标变换、PI控制、无感估计、参数计算 |
| 应用层 | main.c、FuncMain.c | 任务调度、模式切换、故障处理 |
4.2 中断管理
系统采用中断驱动架构,核心中断包括:
4.2.1 TIM1更新中断(TIM1_UP_IRQHandler)
- 下溢时(计数下降):执行FOC控制(
IsrFocCtrlHandle()),包括电流重构、坐标变换、PI控制、SVPWM占空比计算。 - 周期更新时(计数上升):执行SVC观测器(
IsrSvcCtrl()),包括电流估计、速度和位置计算。
4.2.2 ADC中断
ADC采样完成后触发DMA传输,将采样数据存储至缓冲区,无需CPU干预,采样数据包括母线电压、采样电阻电压等。
4.2.3 系统滴答中断(SysTick_Handler)
提供1ms定时基准,用于任务调度、超时判断等。
五、调试与校准功能
5.1 零漂校正
ADC采样存在零漂误差,系统通过采样零矢量状态下的电阻电压,计算零漂补偿值,在电流重构时减去该值,提高采样精度。
5.2 死区补偿
由于开关管的死区时间会导致电压失真,系统根据电流方向和PWM占空比,动态调整占空比补偿值,抵消死区影响。
5.3 故障保护
支持过流、过压、欠压、电机堵转等故障检测,故障发生时立即关闭PWM输出(HALTIMPWM_Stop()),点亮故障指示灯,确保系统安全。
六、关键问题与解决方案
6.1 单电阻采样毛刺问题
现象:扇区切换时电流波形出现毛刺。
解决方案:将电流重构的扇区变量由secter改为secter_post,延迟扇区切换判断,避免扇区误判导致的电流计算错误;优化采样点延迟时间,确保电流稳定后采样。
6.2 无感启动困难
现象:电机启动时抖动或无法启动。
解决方案:采用短时脉冲定位法,通过施加特定序列的电压脉冲,检测电流响应以确定转子初始位置;启动阶段采用开环速度爬升,待转速达到一定阈值(如2Hz)后切换至无感闭环控制。
6.3 参数辨识精度不足
现象:辨识的Ld/Lq/Rs与实际电机参数偏差较大。
解决方案:增加采样数据量(如采样1024组数据),采用滑动平均滤波;优化电压脉冲的幅值和宽度,确保电流线性变化;辨识过程中关闭电流环和速度环,避免干扰。
七、总结与扩展建议
7.1 系统特点
- 采用单电阻采样方案,降低硬件成本和复杂度,同时通过移相策略和电流重构算法保证采样精度。
- 基于STM32F1 HAL库开发,代码模块化程度高,可移植性强。
- 集成参数自动辨识、无感位置估计、FOC闭环控制等完整功能,适用于多种PMSM电机。
- 采用DMA传输和中断驱动架构,降低CPU负载,确保控制实时性。
7.2 扩展建议
- 增加CAN通信接口,支持上位机参数配置和状态监控。
- 优化滑模观测器参数,提升低速和零速时的位置估计精度。
- 增加能量回馈功能,适用于电动车辆等场景。
- 支持多电机控制,通过定时器和DMA通道扩展实现。
- 增加温度采样功能,实现电机过热保护和参数温度补偿。
本系统通过软硬件协同优化,实现了低成本、高精度的PMSM电机控制,可广泛应用于工业自动化、家电、新能源汽车等领域,具有较高的工程实用价值。

更多推荐


所有评论(0)