基于DSP28335写一个EPWM错误联防模块用于过流保护
时间: 2024-03-04 21:52:20 浏览: 264
EPWM错误联防模块用于过流保护,其基本思路是通过比较系统实际输出电流和设定电流值之间的误差,判断系统是否出现过流情况。具体实现过程如下:
1. 通过ADC采集电流信号,并将采集到的电流值与设定电流值进行比较,得到电流误差值。
2. 将电流误差值传入PID控制器中进行控制,得到控制量。
3. 将控制量作为EPWM模块的占空比输入,控制系统输出电流。
4. 若电流误差值超过一定阈值,说明系统出现过流情况,此时EPWM错误联防模块将通过GPIO口向外部发送错误信号,同时停止系统输出电流。
5. 在过流情况消除后,EPWM错误联防模块将自动恢复系统输出电流,继续进行正常工作。
需要注意的是,在实际应用中,EPWM错误联防模块还需要进行多项参数调试和测试,以确保系统能够准确、可靠地进行过流保护,避免对系统和设备造成不必要的损害。
相关问题
基于DSP28335写一个EPWM错误联防模块
EPWM错误联防模块的实现需要考虑以下几个方面:
1. ADC采集电流信号:首先需要将电流信号输入到DSP28335的ADC模块中进行采样,并将采样结果存储到相应的寄存器中。
2. 比较电流误差值:将ADC采集到的电流值与设定电流值进行比较,计算得到电流误差值,并将其存储到相应的寄存器中。
3. PID控制:将电流误差值传入PID控制器中进行控制,得到控制量,并将其作为EPWM模块的占空比输入,控制系统输出电流。
4. 过流保护:若电流误差值超过一定阈值,说明系统出现过流情况,此时EPWM错误联防模块将通过GPIO口向外部发送错误信号,同时停止系统输出电流。
5. 错误恢复:在过流情况消除后,EPWM错误联防模块将自动恢复系统输出电流,继续进行正常工作。
下面是一个基于DSP28335的EPWM错误联防模块的示例代码:
```
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define PWM_PERIOD 1000 // PWM周期
#define MAX_CURRENT 5 // 最大电流值
#define KP 0.5 // PID控制器的P参数
#define KI 0.2 // PID控制器的I参数
#define KD 0.1 // PID控制器的D参数
#define THRESHOLD 0.1 // 过流保护阈值
float32 adc_result; // ADC采样结果
float32 set_current; // 设定电流值
float32 current_error; // 电流误差值
float32 last_error; // 上一时刻的电流误差值
float32 pid_out; // PID控制器输出
float32 duty_cycle; // PWM占空比
void InitEPwm(void)
{
EPwm1Regs.TBPRD = PWM_PERIOD; // PWM周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // up-down计数模式
EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 分频系数为1
EPwm1Regs.CMPA.half.CMPA = 0; // 初始占空比为0
EPwm1Regs.AQCTLA.bit.CAU = 2; // 当计数器计数到CMPA时,PWM输出高电平
EPwm1Regs.AQCTLA.bit.CAD = 1; // 当计数器计数到CMPA时,PWM输出低电平
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA
EPwm1Regs.ETSEL.bit.SOCASEL = 2; // 计数器计数到零点时触发SOCA
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // SOCA触发一次后重新计数
EPwm1Regs.TBCTL.bit.PHSEN = 1; // 使能相位补偿
}
void InitADC(void)
{
AdcRegs.ADCTRL1.bit.ADCREFSEL = 1; // 内部基准电压
AdcRegs.ADCTRL1.bit.ADCBGPWD = 1; // 使能内部参考电压缓冲电路
AdcRegs.ADCTRL1.bit.ADCPWDN = 1; // 使能ADC模块
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0; // 只采集一个通道
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // 选择ADCINA0通道
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // PWM触发ADC采样
AdcRegs.ADCSOC0CTL.bit.ACQPS = 14; // 采样周期为15个ADC时钟周期
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // 选择ADCINT1中断
AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; // 使能ADCINT1中断
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; // 中断触发一次后自动清除
}
void InitPID(void)
{
last_error = 0;
pid_out = 0;
}
void InitGPIO(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // 将GPIO0配置为GPIO模式
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // 配置GPIO0为输出模式
EDIS;
}
void InitSystem(void)
{
InitEPwm();
InitADC();
InitGPIO();
InitPID();
}
void CalculatePID(void)
{
current_error = set_current - adc_result; // 计算电流误差值
pid_out = KP * current_error + KI * (current_error + last_error) + KD * (current_error - last_error); // PID控制器输出
last_error = current_error; // 保存当前误差值
}
void SetDutyCycle(void)
{
if (pid_out > 1) pid_out = 1; // 控制占空比在0~1之间
if (pid_out < 0) pid_out = 0;
duty_cycle = pid_out * PWM_PERIOD; // 计算PWM占空比
EPwm1Regs.CMPA.half.CMPA = (Uint16)duty_cycle; // 设置PWM占空比
}
void CheckOverCurrent(void)
{
if (current_error > THRESHOLD) { // 电流误差值超过阈值,触发过流保护
EPwm1Regs.AQCTLA.bit.CAU = 1; // 停止输出PWM信号
GpioDataRegs.GPASET.bit.GPIO0 = 1; // 设置GPIO0输出高电平
}
else {
EPwm1Regs.AQCTLA.bit.CAU = 2; // 恢复输出PWM信号
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // 设置GPIO0输出低电平
}
}
__interrupt void ADC_ISR(void)
{
adc_result = AdcResult.ADCRESULT0 * 3.3 / 4096; // 计算ADC采样结果
CalculatePID();
SetDutyCycle();
CheckOverCurrent();
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除ADC中断标志位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除PIE中断标志位
}
int main(void)
{
InitSysCtrl();
InitPieCtrl();
IER = M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
InitSystem();
EINT;
ERTM;
while(1);
return 0;
}
```
以上代码仅为示例,具体实现过程可能会因具体应用场景而有所不同。在实际应用中,还需要根据具体需求进行相应的调试和优化。
基于DSP28335将EPWM、ADC、PID模块结合写一个稳压程序
好的,下面我来介绍一下基于DSP28335的EPWM、ADC、PID模块结合实现稳压程序的步骤。
1. EPWM模块配置
首先需要配置EPWM模块的初始化参数,包括时钟分频、计数周期、计数模式等。EPWM模块的配置需要在初始化函数中进行,具体代码如下:
```
// 初始化EPWM模块
void Init_EPWM(void)
{
// 设置时钟分频
EPwm1Regs.TBCTL.bit.HSPCLKDIV = EPWM_TBCTL_HSPCLKDIV_DIV4;
// 设置计数周期
EPwm1Regs.TBPRD = 1000;
// 设置计数模式为向上计数
EPwm1Regs.TBCTL.bit.CTRMODE = EPWM_TBCTL_CTRMODE_UP;
// 使能计数器
EPwm1Regs.TBCTL.bit.PHSEN = 0;
EPwm1Regs.TBCTL.bit.PRDLD = EPWM_TBCTL_PRDLD_IMMEDIATE;
EPwm1Regs.TBCTL.bit.SYNCOSEL = EPWM_TBCTL_SYNCOSEL_EPWMXSYNC;
EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
// 设置占空比
EPwm1Regs.CMPA.bit.CMPA = 500;
// 使能EPWM输出
EPwm1Regs.AQCTLA.bit.ZRO = EPWM_AQCTLA_ZRO_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = EPWM_AQCTLA_CAU_SET;
// 使能EPWM模块
EPwm1Regs.TBCTL.bit.CTRMODE = EPWM_TBCTL_CTRMODE_UP_DOWN;
}
```
2. ADC模块配置
接下来需要配置ADC模块的初始化参数,包括时钟分频、采样窗口、采样周期等。ADC模块的配置需要在初始化函数中进行,具体代码如下:
```
// 初始化ADC模块
void Init_ADC(void)
{
// 设置时钟分频
AdcRegs.ADCCTL2.bit.PRESCALE = 6;
// 设置采样窗口和采样周期
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // 选择ADC通道0
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 选择软件触发
AdcRegs.ADCSOC0CTL.bit.ACQPS = 39; // 设置采样窗口和采样周期
// 使能ADC模块
AdcRegs.ADCCTL1.bit.ADCPWDNZ = 1;
}
```
3. PID模块实现
接下来需要实现PID控制算法,根据实际需求调整比例系数、积分系数和微分系数。具体代码如下:
```
// PID控制算法
float PID(float setpoint, float feedback)
{
float error = setpoint - feedback;
float pout = Kp * error;
integral += error * dt;
float iout = Ki * integral;
float derivative = (error - pre_error) / dt;
float dout = Kd * derivative;
float output = pout + iout + dout;
pre_error = error;
return output;
}
```
4. 稳压程序实现
最后,将EPWM模块、ADC模块和PID模块结合起来,实现稳压程序。具体代码如下:
```
// 稳压程序
void voltage_regulator(void)
{
float setpoint = 3.3; // 设定电压
float feedback = 0; // 实际电压
// 读取ADC值
AdcRegs.ADCSOCFRC1.bit.SOC0 = 1;
while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0);
feedback = AdcResult.ADCRESULT0 * 3.3 / 4096;
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
// 调用PID控制算法计算输出
float output = PID(setpoint, feedback);
// 更新EPWM占空比
EPwm1Regs.CMPA.bit.CMPA = output / 3.3 * 1000;
}
```
以上就是基于DSP28335将EPWM、ADC、PID模块结合写一个稳压程序的步骤。需要注意的是,具体实现还需要根据实际需求进行调整和完善。
阅读全文