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/LSBfloat 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选项)