LPC553x电机控制应用框架
电机控制框架是根据客户需求设计的,旨在提供一个简单易用的示例,用于构建更复杂的解决方案。本示例几乎涵盖了运行基于三相电压逆变器应用程序所需的所有功能。重要外设无需额外的 API,所有操作均在底层完成。本示例提供了两个中断、ADC 采样、FreeMASTER 和 RTCESL 库的实现。?本示例本身并不支持电机旋转。它是开发能够旋转电机的应用程序的基础。?更多详情,请参阅应用程序概述。
主板:LPCXpresso55S36
类别:电机控制
外设:ADC、时钟、GPIO、PWM、定时器、UART
工具链:MCUXpresso IDE
目录
1.软件
- 最新的MCUXpresso IDE
- LPC55S36 SDK 包含 FreeMASTER(可通过 MCUXpresso IDE 下载)
- FreeMASTER实时调试器
2.硬件
- 电源适配器24-48 VDC
3. 设置
要运行示例软件,需要将 FRDM-MC-LVPMSM 插入 LPCXpresso55S36 开发板。如果没有 FRDM-MC-LVPMSM,软件可以工作,但由于功率级缺少电压偏移,ADC 的模拟测量将无法给出正确的数值。您可以在 IDE 和/或 FreeMASTER 中调试软件。
3.1 步骤 1
将项目导入 MCUXpresso IDE。
3.1 步骤 2
右键单击项目,然后转到 SDK 管理/管理 SDK 组件,将 FreeMASTER 添加到项目中。确保在中间件中已选中 FreeMASTER。单击“确定”,它将把所有必要的 FreeMASTER 文件添加到项目中。
注意:必须预先安装 FreeMASTER 的目标设备 SDK 包
3.1 步骤 3
在 main.c 的顶部将 ENABLE_FREEMASTER 设置为 1。
3.2 步骤 4
构建项目并将其刷入LPCXpresso55S36板。
3.2 步骤 5
从motor_control文件夹运行 FreeMASTER .pmpx 项目并连接到电路板。
在某些情况下,需要在刷机后或计算机从睡眠状态唤醒后拔出/插入 EVK USB。修改代码后,FreeMASTER 启动器会在 MAP 文件中更改为接受。
4.结果
您可以观察实时模拟值,并根据连接到 FRDM-MC-LVPMSM 板的电源电平正确测量直流总线电压。将 设置ui16Run
为 1 后,应该可以明显看到校准程序正确检测并减去了电流通道上的偏移量。
5. 应用概述
5.1 外设初始化
初始化函数位于mcperiphinit.c源文件中。
5.2 端口和引脚
这里有两种初始化方法的示例。两者都使用 PinTool,但方式不同。基本引脚初始化使用工具生成的board/pinmux.c源文件中的BOARDInit_Pins函数。另一种初始化引脚的方法是导出寄存器值(按定义)并手动将其放入寄存器中。这种方法的代码看起来更简洁,但需要用户具备更多 MCU 寄存器方面的知识,并需要手动放置生成的值。
5.3 脉宽调制
使用eFlexPWM模块驱动三相电压源逆变器。PWM 频率在?peripheral_init.h.?文件中通过设置PWM_FREQ
定义进行配置。根据此频率值,可以通过预处理器值计算PWM_MODULO
eFlexPWM 模块。PWM
配置为以对称、中心对齐模式运行。这是通过将INIT
寄存器值设置为-MODULO/2
并将VAL1
寄存器值设置为 来实现的MODULO/2 – 1
。死区时间值寄存器 DTCNTn 根据 进行配置M1_PWM_DEADTIME
。 VAL4
寄存器用作 ADC 的触发事件,以在零矢量(所有底部开关都处于开启状态)期间对分流电阻器电压降进行采样。ADC 的触发输出在寄存器中启用PWM_TCTRL_OUT_TRIG_EN
。
5.4 模数转换器
ADC0 模块在框架中初始化。启用时钟后,使用默认校准功能。大多数情况下,用户需要更新或调整通道采样序列。为此,我们准备了额外的支持性定义,以帮助理解此类 ADC 的命令配置。
5.4.1 ADC命令
对命令序列低级编码的主要误解在于通过配置 CMDL 和 CMDH 寄存器来对实际命令和下一个命令的偏移量进行编号。为此,在lpc55s36lowleveladc.h 文件中定义了实际命令 (ACTCMDx) 和下一个命令 (NEXTCMDy) 。使用它们可以使用户更清晰地理解低级配置,因为偏移量编号被定义名称所掩盖。根据参考手册,还创建了其他定义来表达配置参数,请参阅 lpc55s36lowleveladc.h 文件。
```
ADC0->CMD[ACTCMD1].CMDL = ADCCMDLADCH(3U)
| ADCCMDLCTYPE(CMDLCTYPEDUALSINGLEAB)
| ADCCMDLMODE(CMDLMODESTANDARD)
| ADCCMDLALTBADCH(0U)
| ADCCMDLALTBEN(0);
ADC0->CMD[ACTCMD1].CMDH = ADCCMDHCMPEN(0)
| ADCCMDHWAITTRIG(0)
| ADCCMDHLWI(0)
| ADCCMDHSTS(CMDHSAMPLETIME35)
| ADCCMDHAVGS(CMDHAVERAGE1)
| ADCCMDHLOOP(0)
| ADCCMDHNEXT(NEXTCMD2);
```
5.4.2 ADC FIFO
ADC_TCTRL_FIFO_SEL_A
初始化的关键部分是FIFO配置。触发控制寄存器和中有一个字段SEL_B
。该字段将A、B通道的ADC结果的目标设置为FIFO 0、1。
ADC_TCTRL_FIFO_SEL_A
寄存器指示为通道 A 写入 SAR 结果的 FIFO。该字段为 A、B 侧单端和差分转换以及双单端模式下的所有 A 侧转换提供目标。
ADC_TCTRL_FIFO_SEL_B
寄存器指示通道B的SAR结果写入哪个FIFO。此字段仅在双单端模式下使用。在此模式下,通道B的SAR结果将写入此字段指定的FIFO编号。
了解结果 FIFO 中的结果数量非常重要。为此,还需要为 ADC 中断设置正确的水印。建议在读取 FIFO 之前读取 FIFO 中的结果数量,并将其与配置的预期转换次数进行比较。
5.4.3 高速SCMP
高速比较器设置为连续模式。MSEL 多路复用器设置为内部 8 位 DAC。PSEL 多路复用器设置为通道 3,在本例中为直流总线电流。HSCMP 输出作为故障信号路由至 eFlexPWM 模块。
5.4.4 定时器
Ctimer 0 用作带中断的慢循环(1kHz)周期定时器。
5.4.5 输入复用器
该多路复用器允许在外设之间路由信号。在项目中,它使用引脚工具进行配置。路由信号显示为“n/a”引脚。
5.5 ADC 结果处理
为了更好地理解 ADC 的功能,本例中将 ADC 结果存储在 32 位变量中,以便观察其他状态位。然后,32 位结果被屏蔽ADC_RESFIFO_D_MASK
并存储到 16 位变量中。对于特定结果,需要减去一个偏移量,并使用 RTCESL 移位至完整的 16 位范围。ADC 结果存储在AdcGetResults()
函数中并进行调节。
5.6 应用程序扩展
ADC 结果在函数中进行缩放ScaleValues()
。使用MLIB_ConvSc_FLTsf
函数将结果缩放并转换为浮点数,例如:
sMotor.fltVdcb = MLIB_ConvSc_FLTsf(sMotor.f16Vdcb, fltDcBusVoltageScale);
使用所需的分数(整数)ADC 结果作为输入和浮点常数,定义例如直流总线电压的完整硬件量程。
5.7 应用状态机
应用程序状态机实现为指向该应用程序状态函数的指针数组。
```
typedef void (tPointerFcn)(void); / pointer to function */
static tPointerFcn AppStateMachineFast[] = {AppInitFast,AppStopFast,AppStartFast,AppRunFast,AppErrorFast};
```
main.c源代码 中有两个状态机调用:AppStateMachineSlow
在 CTIMER ISR(慢循环)中 AppStateMachineFast
在 ADC ISR(快循环)中
具体的状态机函数位于motor_control.c中,除快速循环的 INIT、STOP 和 RUN 状态外,大多数函数为空。状态由ui8MotorState
用于两个状态机的变量控制和指示。状态变量的更改严格在转换函数中完成。转换函数不属于数组指针,它们是独立的,并且易于根据用户所需的转换进行重写和更新。
在快速循环的 INIT 状态下,有一个变量初始化的示例。在快速循环的 Stop 状态下,应用程序正在等待ui16Run > 0
条件。然后,它会转换到 START 状态。START 状态用于例如对齐目的,根据状态图,它会转到 RUN 状态。
6. 常见问题解答
尚未发现针对该项目的常见问题解答。
7. 支持
项目元数据
来源:恩智浦appcodehub