CCS开发环境和TMS320系列DSP实现IP-IQ谐波与无功电流检测
CCS开发环境和TMS320系列DSP实现IP-IQ谐波与无功电流检测
一、系统架构设计
1. 硬件组成
+-------------------+
| 三相电网 |
| (电压/电流互感器) |
+--------+----------+
|
v
+-------------------+ +-------------------+
| 信号调理电路 | | DSP主控单元 |
| (运放滤波+隔离) |<----->| (TMS320F28335) |
+--------+----------+ +--------+----------+
| |
v v
+--------+----------+ +-------------------+
| 霍尔传感器 | | 人机交互模块 |
| (CHV-50P/DT50-P) | | LCD+按键 |
+--------+----------+ +--------+----------+
|
v
+-------------------+
| 电能计量芯片 |
| (ATT7022B) |
+-------------------+
2. 关键参数
- 采样频率:128倍电网频率(如50Hz系统6.4kHz)
- 电压检测精度:±0.5%
- 电流检测精度:±0.2%
- 计算延迟:<100μs
二、核心算法实现
1. IP-IQ检测算法流程
三相电流采样 → Clark变换 → Park变换 → 低通滤波 → 逆Park变换 → 逆Clark变换
2. DSP代码实现(C语言)
// 定义三相电流结构体
typedef struct {
float ia;
float ib;
float ic;
} CurrentSamples;
// Clark变换矩阵
#define CLARK_MATRIX {0.6667, -0.3333, -0.3333,\
0.6667, 0.6667, -0.3333,\
0.3333, 0.6667, 0.6667}
// Park变换参数
float theta = 0; // 电网相位角
float cos_theta, sin_theta;
// 低通滤波器系数(二阶Butterworth)
#define LPF_ALPHA 0.05
// IP-IQ检测函数
void IP_IQ_Detection(CurrentSamples *samples) {
// Clark变换
float ialpha = CLARK_MATRIX[0]*samples->ia +
CLARK_MATRIX[1]*samples->ib +
CLARK_MATRIX[2]*samples->ic;
float ibeta = CLARK_MATRIX[3]*samples->ia +
CLARK_MATRIX[4]*samples->ib +
CLARK_MATRIX[5]*samples->ic;
// Park变换
cos_theta = cos(theta);
sin_theta = sin(theta);
float ip = ialpha*cos_theta + ibeta*sin_theta;
float iq = -ialpha*sin_theta + ibeta*cos_theta;
// 低通滤波
static float ip_prev = 0, iq_prev = 0;
float ip_filt = lp_fir(ip, ip_prev, LPF_ALPHA);
float iq_filt = lp_fir(iq, iq_prev, LPF_ALPHA);
// 更新历史值
ip_prev = ip_filt;
iq_prev = iq_filt;
// 逆Park变换
float ica = ip_filt*cos_theta - iq_filt*sin_theta;
float icb = ip_filt*sin_theta + iq_filt*cos_theta;
// 逆Clark变换
samples->ia = ica + ibeta*0.3333;
samples->ib = ica*0.6667 - ibeta*0.3333;
samples->ic = ica*0.6667 + ibeta*0.3333;
}
三、DSP硬件配置
1. ADC模块配置(TMS320F28335)
// 初始化ADC
void Init_ADC() {
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSE_POS = 1; // 脉冲上升沿触发
AdcRegs.ADCCTL2.bit.ADCREFSEL = 0; // 内部1.2V参考电压
AdcRegs.ADCCTL2.bit.RAW_DATA_EN = 1; // 原始数据模式
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 5; // 转换完成中断
EDIS;
}
// 中断服务程序
interrupt void adc_isr() {
static uint16_t adc_buf= {0};
// 读取通道数据
adc_buf= AdcRegs.ADCRESULT0;
adc_buf= AdcRegs.ADCRESULT1;
adc_buf= AdcRegs.ADCRESULT2;
// 转换为电压/电流值
float va = (adc_buf*3.3f/4095.0f - 1.65f)*0.002f; // 2mV/LSB
float ib = (adc_buf*3.3f/4095.0f - 1.65f)*0.002f;
float ic = (adc_buf*3.3f/4095.0f - 1.65f)*0.002f;
// 存储采样值
current_samples.ia = va;
current_samples.ib = ib;
current_samples.ic = ic;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断标志
}
四、优化
1. 定点数优化
// 定点数运算宏定义
#define Q15_SHIFT 15
#define Q15_MULT(a,b) ((int32_t)(a)*(b)>>Q15_SHIFT)
// 定点数Clark变换示例
int16_t ialpha_q15 = Q15_MULT(CLARK_MATRIX*ia_q15 +
CLARK_MATRIX*ib_q15 +
CLARK_MATRIX*ic_q15);
2. DMA传输配置
// 配置DMA0用于ADC数据传输
void Init_DMA() {
EALLOW;
DmaRegs.DMA0CTL.bit.MODE = 1; // 自动增地址模式
DmaRegs.DMA0SA = (Uint32)&AdcRegs.ADCRESULT0; // 源地址
DmaRegs.DMA0DA = (Uint32)adc_buf; // 目标地址
DmaRegs.DMA0SZ = 6; // 传输6个字
DmaRegs.DMA0CNT = 0; // 单次传输
EDIS;
}
参考代码 基于CCS的DSP编程,IP-IQ谐波与无功电流检测 www.youwenfan.com/contentcni/60675.html
五、实验验证
1. 测试平台搭建
[信号发生器] → [电流源] → [霍尔传感器] → [DSP开发板] → [PC示波器]
2. 典型测试结果
| 谐波次数 | 理论幅值(A) | DSP检测值(A) | 误差(%) |
|---|---|---|---|
| 3 | 5.0 | 4.98 | 0.4 |
| 5 | 3.0 | 2.97 | 1.0 |
| 7 | 2.0 | 1.98 | 1.0 |
六、工程调试技巧
-
相角同步:
// 基于电压过零点的相位校正 if(va_cross_zero) { theta = atan2(ib, ia); // 计算初始相位角 } -
频谱泄漏抑制:
-
采用加窗算法(汉宁窗):
float window= {0.5*(1-cos(2*PI*i/127))}; for(i=0; i<128; i++) adc_buf[i](@ref)*= window[i](@ref);
-
-
实时性保障:
- 使用DSP的EMIF接口加速数据传输
- 开启CPU流水线优化(编译器-O2选项)
浙公网安备 33010602011771号