单电阻采样 基于单电阻采样的相电流重构算法 keil完整工程。 单电阻采样 f103的单电阻,完整工程,带文档,带硬件资料。 f3平台的单电阻完整工程,代码详细注释。 还有微芯的单电阻smo代码加文档 具体如截图请看下
一、工程概述
本工程是基于dsPIC33CK256MP508微控制器的单电阻采样相电流重构算法完整实现,主要面向中小功率永磁同步电机(PMSM)的矢量控制系统。工程整合了电机控制核心算法、硬件抽象层驱动、诊断监控模块及用户交互逻辑,支持MCLV2(中低压电机)、MCHV2/MCHV3(高压电机)多种硬件平台,通过单电阻采样方案实现三相电流的精确重构,同时具备开环启动、闭环矢量控制、弱磁扩速等核心功能,可广泛应用于家电、工业驱动、电动交通工具等领域。
工程核心特点如下:
- 硬件兼容性:适配dsPIC33CK256MP508微控制器,支持内部运算放大器(OPAMP)和外部信号调理电路,兼容单电阻/双电阻采样方案。
- 控制算法:采用磁场定向控制(FOC)架构,包含Clark变换、Park变换、PI调节器、反电动势观测器、弱磁扩速等核心算法。
- 诊断与监控:集成X2CScope和RTDM两种实时监控方案,支持电机运行参数可视化、故障诊断及数据日志功能。
- 可靠性设计:包含过流保护、死区补偿、电流偏移校准、Bootstrap电容充电管理等硬件安全机制。
二、工程结构与核心模块划分
工程文件总数108个,按功能可划分为8大核心模块,模块间通过全局变量和函数接口实现数据交互,整体架构采用分层设计(应用层-算法层-硬件抽象层),便于维护和扩展。
(一)核心模块清单
| 模块名称 | 核心文件 | 主要功能 |
|---|---|---|
| 硬件抽象层(HAL) | adc.c/.h、pwm.c/.h、uart1.c/.h、port_config.c/.h、clock.c/.h | 外设初始化与驱动(ADC、PWM、UART、GPIO、时钟) |
| 电机控制核心算法 | pmsm.c、estim.c/.h、fdweak.c/.h、motor_control/* | FOC控制、速度/角度估算、弱磁扩速、坐标变换 |
| 数据采集与处理 | meascurr.c/.h、readadc.c/.h、singleshunt.c/.h | 电流采样、偏移校准、单电阻电流重构 |
| 控制参数配置 | control.c/.h、userparms.h、general.h | 控制参数结构体、PI参数、电机参数定义 |
| 诊断与监控 | diagnostics.c/.h、X2CScope.h、rtdm.c/.h | 实时数据监控、故障诊断、日志存储 |
| 板级支持 | board_service.c/.h、delay.h | 按键交互、LED指示、延时函数 |
| 数学工具 | q15sqrt.s、motor_control/* | 定点数学运算(开方、三角函数、矩阵变换) |
| 主程序 | pmsm.c(main函数) | 系统初始化、主循环、中断服务程序 |
(二)核心模块依赖关系
主程序(pmsm.c) ├─ 硬件初始化:HAL模块(时钟、GPIO、ADC、PWM) ├─ 算法初始化:控制参数、PI调节器、估算器、弱磁参数 ├─ 主循环:按键处理、诊断任务、电机启停控制 └─ 中断服务:ADC采样中断(电流采集与重构)→ 坐标变换 → 速度/电流调节 → PWM占空比更新三、核心模块功能详细说明
(一)硬件抽象层(HAL)
硬件抽象层是工程与硬件交互的桥梁,负责微控制器外设的底层配置与驱动,屏蔽硬件差异,为上层算法提供统一接口。
1. 时钟模块(clock.c/.h)
- 功能:配置dsPIC33CK256MP508的PLL锁相环,生成系统核心时钟。
- 关键参数:
- 外部晶振/内部FRC时钟输入:8MHz
- PLL倍频/分频配置:M=150,N1=1,N2=3,N3=1
- 最终输出时钟:FOSC=200MHz(振荡器频率),FCY=100MHz(指令周期频率)
- 核心函数:
InitOscillator()- 初始化PLL并等待时钟稳定,为所有外设提供时钟源。
2. ADC模块(adc.c/.h)
- 功能:实现电机相电流、母线电压、速度参考电位器等模拟信号的采样。
- 关键配置:
- 采样分辨率:12位, fractional数据格式
- 采样触发方式:PWM触发(同步采样,避免PWM开关噪声干扰)
- 采样通道:
- 单电阻模式:母线电流采样通道(AN0/AN17)
- 双电阻模式:A相/B相电流采样通道(AN1、AN4)
- 速度参考:电位器输入通道(AN19)
- 核心函数:
InitializeADCs()- 配置ADC核心、采样时间、触发源及中断优先级。
3. PWM模块(pwm.c/.h)
- 功能:生成三相PWM波形,驱动电机逆变器,支持死区补偿、Bootstrap电容充电。
- 关键配置:
- 工作模式:中心对齐PWM(减小电机转矩脉动)
- PWM频率:20kHz(LOOPTIME_MICROSEC=50)
- 死区时间:1.0μs(DDEADTIME=100,由FCY=100MHz计算)
- 输出模式:互补输出(上下桥臂)
- 核心函数:
InitPWMGenerators()- 初始化PWM发生器、周期、死区、触发配置。ChargeBootstarpCapacitors()- 上电时充电Bootstrap电容,确保高边MOS管正常导通。
4. UART模块(uart1.c/.h)
- 功能:提供串行通信接口,支持X2CScope和RTDM监控功能。
- 关键配置:
- 波特率:115200(X2CScope)/57600(RTDM)
- 数据格式:8位数据位,1位停止位,无校验
- 中断模式:接收/发送中断,支持异步通信
- 核心接口:
UART1DataWrite()/UART1DataRead()- 字节收发函数;UART1_InterruptEnable()- 使能中断接收。
5. GPIO模块(port_config.c/.h)
- 功能:配置GPIO引脚为输入/输出/模拟模式,映射外设功能(如PWM、UART)。
- 关键配置:
- 电机控制引脚:PWM输出(RB10-RB15)、电流采样模拟输入(AN0、AN1、AN4等)
- 用户交互引脚:按键输入(RE5、RD5等)、LED输出(RE8、RE9)
- 外设引脚映射:UART1映射到RP70/RP71(PIM引脚49/50)
- 核心函数:
SetupGPIOPorts()- 初始化所有GPIO端口为默认状态;MapGPIOHWFunction()- 映射外设功能到GPIO引脚。
(二)数据采集与处理模块
该模块负责从硬件获取原始数据,并进行校准、滤波、重构等预处理,为控制算法提供可靠的输入数据。
1. 电流采样与校准(meascurr.c/.h)
- 功能:采集电流采样通道的原始ADC数据,进行偏移校准和增益缩放,转换为标准化电流值。
- 核心流程:
1. 偏移校准:上电时采集多个空闲样本,计算偏移量(Offseta/Offsetb),补偿零点漂移。
2. 增益缩放:通过校准系数(qKa/qKb)将ADC原始值转换为q15格式的电流值(-1~1对应实际电流范围)。 - 核心函数:
MeasCurrOffset()- 校准电流采样偏移量。MeasCompCurr()- 补偿偏移并缩放ADC数据,输出标准化电流值。
2. 单电阻电流重构(singleshunt.c/.h)
- 功能:在单电阻采样模式下,通过PWM周期内的两次采样,重构三相相电流(Ia、Ib、Ic)。
- 核心原理:
- 利用PWM不同矢量区间的母线电流与相电流关系,在PWM上下桥臂导通时刻采样母线电流。
- 通过Clark变换约束(Ia+Ib+Ic=0)重构第三相电流。
- 核心函数:
SingleShunt_PhaseCurrentReconstruction()- 根据采样时刻的PWM状态,重构三相电流。SingleShunt_CalculateSpaceVectorPhaseShifted()- 生成适配单电阻采样的SVPWM波形。
3. ADC数据读取(readadc.c/.h)
- 功能:读取电位器等模拟信号,转换为速度参考值。
- 核心函数:
ReadADC0()- 读取ADC采样值,缩放后存储到速度参考变量(qAnRef)。
(三)电机控制核心算法模块
该模块是工程的核心,实现永磁同步电机的磁场定向控制(FOC),包含坐标变换、PI调节、速度/角度估算、弱磁扩速等关键算法。
1. 坐标变换(motor_control/*)
- 功能:实现三相静止坐标系与两相旋转坐标系之间的转换,是FOC控制的基础。
- 核心变换:
- Clark变换:将三相电流(Ia、Ib、Ic)转换为两相静止坐标系电流(Iα、Iβ)。
- Park变换:将Iα、Iβ转换为两相旋转坐标系电流(Id、Iq),便于独立控制磁通和转矩。
- 逆Park/逆Clark变换:将控制量(Vd、Vq)转换为三相PWM占空比。
- 实现方式:采用汇编语言实现(mcclarkedspic.s、mcparkdspic.s),兼顾运算效率和精度。
2. PI调节器(pmsm.c、motor_control/*)
- 功能:实现速度环、d/q轴电流环的闭环调节,抑制扰动,跟踪参考值。
- 调节器结构:
- 速度环PI:输入速度误差(参考速度-估算速度),输出q轴电流参考值(Iq_ref)。
- Id轴电流环PI:输入Id误差(Id_ref-实际Id),输出Vd控制量。
- Iq轴电流环PI:输入Iq误差(Iq_ref-实际Iq),输出Vq控制量。
- 关键特性:
- 抗积分饱和:通过输出限幅(outMax/outMin)防止积分累积。
- 系数配置:通过
InitControlParameters()初始化PI参数(kp、ki、kc)。 - 核心函数:
MCControllerPIUpdateAssembly()- 汇编实现的PI调节算法,运算高效。
3. 速度/角度估算(estim.c/.h)
- 功能:无传感器控制核心,基于反电动势(BEMF)估算电机电气角度和转速,无需位置传感器。
- 核心原理:
1. 根据定子电压方程计算反电动势:BEMF = U - RsI - LsdI/dt。
2. 对反电动势进行Park变换,得到d/q轴反电动势(Esd、Esq)。
3. 通过一阶滤波和积分运算,估算电机电气角速度(OmegaMr)和角度(Rho)。 - 关键优化:
- 高低速自适应:低速时增大电流采样间隔,提高差值计算精度;高速时减小间隔,保证响应速度。
- 角度偏移补偿:初始化时设置角度偏移(qRhoOffset),优化开环到闭环的切换过程。
- 核心函数:
InitEstimParm()- 初始化估算器参数(滤波系数、电流限制等)。Estim()- 核心估算函数,在ADC中断中执行,更新速度和角度估算值。
4. 弱磁扩速(fdweak.c/.h)
- 功能:当电机转速超过额定转速时,通过减小d轴电流(Id)削弱定子磁场,提高电机最高转速(弱磁扩速)。
- 核心逻辑:
1. 预设弱磁曲线:根据转速分段设置Id参考值(qFwCurve)、反电动势系数(qInvKFiCurve)、定子电感系数(qLsCurve)。
2. 转速判断:当电机转速超过额定转速(FWONSPEED)时,启动弱磁控制。
3. 插值计算:根据当前转速在预设曲线中插值,得到实时Id参考值。 - 核心函数:
InitFWParams()- 初始化弱磁曲线参数。FieldWeakening()- 输入电机转速,输出弱磁后的Id参考值。
5. 开环启动与闭环切换(pmsm.c)
- 功能:解决无传感器电机启动难题,通过开环控制使电机加速到一定转速后,平滑切换到闭环控制。
- 核心流程:
1. 开环对齐:电机上电后,输出固定角度的电压矢量,使转子对齐到指定位置(startupLock阶段)。
2. 开环加速:逐步增加电压矢量的旋转速度,驱动电机加速(startupRamp阶段)。
3. 闭环切换:当转速达到阈值(END_SPEED)时,切换到基于反电动势的闭环控制。 - 核心函数:
CalculateParkAngle()- 生成开环控制的电气角度,或使用估算器角度(闭环模式)。
(四)诊断与监控模块
该模块负责电机运行状态的实时监控、数据日志和故障诊断,便于调试和维护。
1. X2CScope监控(X2CScope.h、diagnostics_x2cscope.c)
- 功能:通过UART与PC端X2CScope软件通信,实时上传电机运行参数(电流、转速、角度等),支持参数在线调整。
- 核心配置:
- 波特率:115200(由X2CBAUDRATEDIVIDER=54计算)。
- 通信接口:UART1,支持发送/接收中断。
- 核心函数:
X2CScope_Init()- 初始化X2CScope,挂钩UART收发函数。X2CScope_Update()- 在ADC中断中更新监控数据。X2CScope_Communicate()- 在主循环中处理PC端命令和数据传输。
2. RTDM诊断(rtdm.c/.h、rtdm_select_channels.c)
- 功能:实时诊断与数据日志模块,支持通过UART与MPLAB DMCI软件通信,实现内存读写、状态查询、数据录制。
- 核心特性:
- 数据录制:支持4路数据同时录制(默认配置:Ia、Ib、估算转速、估算角度)。
- 故障诊断:支持非法命令、校验错误等故障反馈。
- 缓冲区管理:循环缓冲区存储录制数据,支持连续采样。
- 核心函数:
RTDM_Start()- 初始化RTDM模块和UART。RTDM_ProcessMsgs()- 处理PC端命令(读内存、写内存、 sanity检查等)。RTDM_SelectChannels()- 配置需要录制的数据通道。
(五)板级支持与用户交互模块
1. 按键与LED控制(board_service.c/.h)
- 功能:提供用户交互接口,支持电机启停、速度切换。
- 关键功能:
- 按键防抖:软件防抖(BUTTONDEBOUNCECOUNT=30ms)。
- 按键功能:
- 按键1(START/STOP):启动/停止电机。
- 按键2(SPEEDHALFDOUBLE):切换电机速度(仅MCLV2平台)。
- LED指示:LED1指示电机运行状态(亮=运行),LED2指示系统上电状态。
- 核心函数:
BoardServiceInit()- 初始化按键和LED引脚。BoardService()- 主循环中调用,扫描按键状态。
2. 延时函数(delay.h)
- 功能:提供微秒级和毫秒级延时,用于硬件初始化(如Bootstrap电容充电)。
- 实现方式:基于FCY=100MHz的指令周期计算延时计数,通过
delayus()和delayms()实现。
四、核心工作流程
(一)系统初始化流程
1. 上电复位 → 调用main()函数 2. 时钟初始化:InitOscillator() → 配置PLL生成100MHz指令周期时钟 3. GPIO初始化:SetupGPIOPorts() → 配置PWM、ADC、按键、LED引脚 4. 外设初始化:InitPeripherals() → 初始化ADC、PWM、UART 5. 电流偏移校准:MeasCurrOffset() → 采集空闲状态下的ADC偏移值,补偿零点漂移 6. 诊断模块初始化:DiagnosticsInit() → 初始化X2CScope或RTDM 7. 控制参数初始化: - InitControlParameters() → 初始化PI参数、PWM周期、电流增益等 - InitEstimParm() → 初始化速度/角度估算器参数 - InitFWParams() → 初始化弱磁扩速参数 8. 等待用户按键 → 启动电机(二)电机控制主流程(中断驱动)
工程采用ADC采样中断作为控制周期的触发源,中断优先级最高(IPL7),确保控制实时性。中断服务程序(ISR)流程如下:
ADC采样中断(20kHz周期) ├─ 1. 读取ADC数据: - 单电阻模式:读取母线电流,重构三相电流(Ia、Ib、Ic) - 双电阻模式:直接读取A/B相电流,计算C相电流(Ia+Ib+Ic=0) ├─ 2. 电流校准与缩放:MeasCompCurr() → 补偿偏移并转换为标准化电流值 ├─ 3. 坐标变换: - Clark变换:Ia、Ib → Iα、Iβ - Park变换:Iα、Iβ → Id、Iq(使用当前估算角度) ├─ 4. 速度/角度估算:Estim() → 更新估算转速(qVelEstim)和角度(qRho) ├─ 5. 闭环控制:DoControl() - 速度环PI:计算Iq参考值(Iq_ref) - 弱磁扩速:计算Id参考值(Id_ref) - 电流环PI:计算Vd、Vq控制量 ├─ 6. 逆坐标变换: - 逆Park变换:Vd、Vq → Vα、Vβ - 逆Clark变换:Vα、Vβ → Va、Vb、Vc ├─ 7. PWM占空比计算:MC_CalculateSpaceVectorPhaseShifted_Assembly() → 生成SVPWM占空比 ├─ 8. 更新PWM输出:PWMDutyCycleSet() → 写入PWM寄存器,驱动电机 ├─ 9. 诊断与监控: - DiagnosticsStepIsr() → 更新X2CScope/RTDM数据 - BoardServiceStepIsr() → 扫描按键状态计数器 └─ 10. 清除中断标志 → 等待下一次中断(三)开环到闭环切换流程
1. 用户按下启动按键 → 使能PWM输出(EnablePWMOutputsInverterA()) 2. 开环控制阶段: - 转子对齐:startupLock计数到LOCK_TIME,转子对齐到指定位置 - 开环加速:startupRamp逐步增加,生成旋转角度(thetaElectricalOpenLoop) - 输出固定Vq参考值,驱动电机加速 3. 切换判断:当startupRamp达到END_SPEED → 触发闭环切换 4. 闭环切换: - 设置uGF.bits.OpenLoop=0(闭环模式) - 设置uGF.bits.ChangeMode=1(模式切换标志) - 角度同步:将估算器角度与开环角度对齐 5. 闭环控制阶段:使用估算器角度和转速,执行FOC闭环控制五、关键参数配置
(一)电机参数(userparms.h,需根据实际电机调整)
| 参数名称 | 含义 | 示例值 |
|---|---|---|
| NOMINALSPEEDRPM | 电机额定转速(rpm) | 3000 |
| NOPOLESPAIRS | 电机极对数 | 2 |
| NORM_RS | 定子电阻(标准化q15格式) | 0x0400 |
| NORM_LSDTBASE | 定子电感/采样周期(标准化) | 0x0200 |
| NORM_INVKFIBASE | 反电动势系数(标准化) | 0x1000 |
(二)PI调节器参数(userparms.h)
| 调节器 | 比例系数(kp) | 积分系数(ki) | 输出限幅(outMax) |
|---|---|---|---|
| 速度环 | SPEEDCNTR_PTERM | SPEEDCNTR_ITERM | SPEEDCNTR_OUTMAX |
| Id电流环 | DCURRCNTRPTERM | DCURRCNTRITERM | DCURRCNTROUTMAX |
| Iq电流环 | QCURRCNTRPTERM | QCURRCNTRITERM | QCURRCNTROUTMAX |
(三)弱磁扩速参数(userparms.h)
| 参数名称 | 含义 | 示例值 |
|---|---|---|
| FWONSPEED | 弱磁启动转速(电气转速) | NOMINALSPEEDRPM*NOPOLESPAIRS |
| IDREF_BASESPEED | 额定转速下的Id参考值 | 0x0000 |
| IDREF_SPEEDx | 不同转速下的Id参考值(x=0~17) | 预设曲线数组 |
六、工程编译与适配说明
(一)编译环境
- 编译器:XC16 Compiler(版本≥1.30)
- 开发工具:MPLAB X IDE(版本≥5.00)
- 调试工具:MPLAB ICD 3/RealICE(支持dsPIC33CK系列)
(二)硬件适配开关
工程通过宏定义支持不同硬件配置,可在userparms.h或相关头文件中修改:
| 宏定义 | 含义 | 取值 |
|---|---|---|
| SINGLE_SHUNT | 单电阻采样模式 | 1=启用,0=双电阻模式 |
| MCLV2 | 中低压电机平台 | 1=启用,0=禁用(MCHV2/MCHV3) |
| INTERNALOPAMPPIM | 内部运算放大器 | 1=启用,0=外部运算放大器 |
| TUNING | 调试模式 | 1=启用(软件速度斜坡),0=禁用 |
| OPENLOOPFUNCTIONING | 强制开环 | 1=强制开环,0=支持闭环切换 |
(三)注意事项
- 电流偏移校准:电机未运行时执行,确保采样通道无电流,否则会导致偏移补偿错误。
- 电机参数匹配:需根据实际电机修改userparms.h中的电机参数(电阻、电感、极对数等),否则控制性能会严重下降。
- 弱磁曲线调整:弱磁扩速的效果依赖于预设的qFwCurve、qInvKFiCurve、qLsCurve数组,需根据电机特性调整。
- 中断优先级:ADC采样中断优先级需设为最高(IPL7),避免被其他中断打断,影响控制周期稳定性。
七、总结
本工程是一套完整的基于dsPIC33CK256MP508的单电阻采样无传感器FOC控制方案,通过高度优化的算法和硬件驱动,实现了电机的高效、稳定控制。工程具备以下优势:
- 成本优势:单电阻采样方案相比三电阻采样,减少了采样电阻和信号调理电路成本。
- 性能优势:采用汇编优化的核心算法,控制周期可达20kHz,响应迅速;无传感器估算精度高,支持宽转速范围运行。
- 灵活性优势:支持多种硬件平台(MCLV2/MCHV2/MCHV3),可通过宏定义快速适配不同电机和硬件配置。
- 可维护性优势:分层设计架构清晰,模块间接口统一,便于后续功能扩展和bug修复。
工程可直接用于家电(空调压缩机、洗衣机电机)、工业驱动(小型泵、风机)、电动交通工具(电动自行车、滑板车)等领域的电机控制方案开发,也可作为学习无传感器FOC控制的参考案例。