淮南市网站建设_网站建设公司_字体设计_seo优化
2026/1/7 19:20:00 网站建设 项目流程

单电阻采样 基于单电阻采样的相电流重构算法 keil完整工程。 单电阻采样 f103的单电阻,完整工程,带文档,带硬件资料。 f3平台的单电阻完整工程,代码详细注释。 还有微芯的单电阻smo代码加文档 具体如截图请看下

一、工程概述

本工程是基于dsPIC33CK256MP508微控制器的单电阻采样相电流重构算法完整实现,主要面向中小功率永磁同步电机(PMSM)的矢量控制系统。工程整合了电机控制核心算法、硬件抽象层驱动、诊断监控模块及用户交互逻辑,支持MCLV2(中低压电机)、MCHV2/MCHV3(高压电机)多种硬件平台,通过单电阻采样方案实现三相电流的精确重构,同时具备开环启动、闭环矢量控制、弱磁扩速等核心功能,可广泛应用于家电、工业驱动、电动交通工具等领域。

工程核心特点如下:

  1. 硬件兼容性:适配dsPIC33CK256MP508微控制器,支持内部运算放大器(OPAMP)和外部信号调理电路,兼容单电阻/双电阻采样方案。
  2. 控制算法:采用磁场定向控制(FOC)架构,包含Clark变换、Park变换、PI调节器、反电动势观测器、弱磁扩速等核心算法。
  3. 诊断与监控:集成X2CScope和RTDM两种实时监控方案,支持电机运行参数可视化、故障诊断及数据日志功能。
  4. 可靠性设计:包含过流保护、死区补偿、电流偏移校准、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_PTERMSPEEDCNTR_ITERMSPEEDCNTR_OUTMAX
Id电流环DCURRCNTRPTERMDCURRCNTRITERMDCURRCNTROUTMAX
Iq电流环QCURRCNTRPTERMQCURRCNTRITERMQCURRCNTROUTMAX

(三)弱磁扩速参数(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=支持闭环切换

(三)注意事项

  1. 电流偏移校准:电机未运行时执行,确保采样通道无电流,否则会导致偏移补偿错误。
  2. 电机参数匹配:需根据实际电机修改userparms.h中的电机参数(电阻、电感、极对数等),否则控制性能会严重下降。
  3. 弱磁曲线调整:弱磁扩速的效果依赖于预设的qFwCurve、qInvKFiCurve、qLsCurve数组,需根据电机特性调整。
  4. 中断优先级:ADC采样中断优先级需设为最高(IPL7),避免被其他中断打断,影响控制周期稳定性。

七、总结

本工程是一套完整的基于dsPIC33CK256MP508的单电阻采样无传感器FOC控制方案,通过高度优化的算法和硬件驱动,实现了电机的高效、稳定控制。工程具备以下优势:

  1. 成本优势:单电阻采样方案相比三电阻采样,减少了采样电阻和信号调理电路成本。
  2. 性能优势:采用汇编优化的核心算法,控制周期可达20kHz,响应迅速;无传感器估算精度高,支持宽转速范围运行。
  3. 灵活性优势:支持多种硬件平台(MCLV2/MCHV2/MCHV3),可通过宏定义快速适配不同电机和硬件配置。
  4. 可维护性优势:分层设计架构清晰,模块间接口统一,便于后续功能扩展和bug修复。

工程可直接用于家电(空调压缩机、洗衣机电机)、工业驱动(小型泵、风机)、电动交通工具(电动自行车、滑板车)等领域的电机控制方案开发,也可作为学习无传感器FOC控制的参考案例。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询