dsp28335用pid实现两对epwm的自动升降压稳压到根据一个电压输入稳定一个固定的电压值输出
时间: 2024-04-17 20:26:51 浏览: 193
要使用DSP28335实现两对EPWM的自动升降压稳压,并根据一个电压输入稳定一个固定的电压值输出,你可以使用两个PID控制器分别控制两对EPWM的占空比。下面是一个示例代码,演示了如何使用PID控制算法实现这个功能:
```c
#include "F2837xS_device.h"
// 定义PID控制器参数
#define KP 0.5
#define KI 0.2
#define KD 0.1
// 定义目标电压和实际电压变量
float targetVoltage = 3.3; // 目标电压
float actualVoltage = 0.0; // 实际电压
// 定义PID控制器变量
float error = 0.0; // 误差
float integral = 0.0; // 积分项
float derivative = 0.0; // 微分项
float outputA = 0.0; // 控制输出A
float outputB = 0.0; // 控制输出B
// 定义EPWM相关寄存器地址
volatile struct EPWM_REGS *EPwmRegs[6] = {&EPwm1Regs, &EPwm2Regs, &EPwm3Regs, &EPwm4Regs, &EPwm5Regs, &EPwm6Regs};
// 初始化EPWM模块
void initEPWM() {
// 配置GPIO引脚作为EPWM输出
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
EDIS;
// 配置EPWM时钟
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
EDIS;
// 初始化EPWM模块A
EALLOW;
EPwmRegs[0]->TBCTL.bit.PRDLD = TB_SHADOW;
EPwmRegs[0]->TBPRD = 1000; // 设置周期为1000个计数
EPwmRegs[0]->CMPA.bit.CMPA = 500; // 设置初始占空比为50%
EPwmRegs[0]->CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwmRegs[0]->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwmRegs[0]->AQCTLA.bit.CAU = AQ_SET; // 当计数器等于CMPA时,EPWM输出高电平
EPwmRegs[0]->AQCTLA.bit.CAD = AQ_CLEAR; // 当计数器等于CMPA时,EPWM输出低电平
EPwmRegs[0]->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwmRegs[0]->TBCTL.bit.PHSEN = TB_DISABLE;
EPwmRegs[0]->TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwmRegs[0]->TBCTL.bit.CLKDIV = TB_DIV1;
EPwmRegs[0]->TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EDIS;
// 初始化EPWM模块B,与模块A的配置相同
// ...
// 启动EPWM模块
EALLOW;
EPwmRegs[0]->TBCTL.bit.CTRMODE = TB_COUNT_UP;
// 启动EPWM模块B,与模块A的配置相同
// ...
EDIS;
}
// 更新EPWM占空比
void updateEPWM(float dutyCycleA, float dutyCycleB) {
Uint16 compareValueA = (Uint16)(dutyCycleA * EPwmRegs[0]->TBPRD);
Uint16 compareValueB = (Uint16)(dutyCycleB * EPwmRegs[1]->TBPRD);
EPwmRegs[0]->CMPA.bit.CMPA = compareValueA;
EPwmRegs[1]->CMPA.bit.CMPA = compareValueB;
}
// PID控制器
void pidController() {
error = targetVoltage - actualVoltage;
integral += error;
derivative = error - derivative;
outputA = KP * error + KI * integral + KD * derivative;
outputB = KP * error + KI * integral + KD * derivative;
// 限制输出范围
if (outputA < 0.0) {
outputA = 0.0;
}
if (outputA > 1.0) {
outputA = 1.0;
}
// 限制输出范围
if (outputB < 0.0) {
outputB = 0.0;
}
if (outputB > 1.0) {
outputB = 1.0;
}
// 更新EPWM占空比
updateEPWM(outputA, outputB);
}
int main(void) {
// 初始化系统和EPWM模块
InitSysCtrl();
initEPWM();
while (1) {
// 模拟采集实际电压值,这里假设为3.0V
actualVoltage = 3.0;
// 执行PID控制器
pidController();
}
}
```
在这个示例代码中,我们使用两个PID控制器分别计算EPWM模块A和模块B的输出值。然后,通过`updateEPWM()`函数将输出值作为两个EPWM模块的占空比进行更新。其他部分与之前的示例代码类似。
请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体的需求进行更多的配置和调整。希望对你有所帮助!
阅读全文