This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好!
我要实时找到50Hz 正弦波的512点 ADC。 采样频率为1.6kHz、相当于每周期32个样本、512点 FFT 意味着16个此类周期。 代码应连续测量 FFT 输出。 谢谢! 下面是我设法获取采样数据的方法、但我不知道 下一步应该做什么。 请指导我。 谢谢! 以下是我的功能代码。
#include "F28x_Project.h"//设备头文件和示例 include 文件
#include "math.h"
//外部函数原型
extern void InitSysCtrl(void);
extern void InitPieCtrl (void);
extern void InitPieVectTable (void);
//此文件中找到的函数的原型语句。
void GPIO_select (void);
void Setup_ADC_conf (void);
void Setup_ePWM (void);
void ConfigureDAC (void);
中断空 ADC_ISR (空);
//全局变量
浮动 TS;
////// 读取反馈信号
浮动 Vac = 0;
//unsigned int Voltage2 = 0;
//unsigned int Voltage3 = 0;
浮动 IAC = 0;
//unsigned int Current2=0;
//unsigned int Current3=0;
//unsigned int index = 0;
float rand1 = 0;
//float rand2 = 0;
//float rand3 = 0;
浮点 Crand1 = 0;
//float Crand2 = 0;
//float Crand3 = 0;
////////////////////
//Lowpass 滤波器变量
//
浮点 MI=0.0;
浮点 M=0;
float VAC2=0;
浮点 VAC=0;
//float IO1=0;
float IO2=0;
float io=0;
float V_out=0.0;
//AC 电压变量
浮点 Vac_ref=0.0;//必须始终为零
float V_AC=0.0;
float I_AC_ref=0.0;
float I_AC=0.0;
///float Q_FILTER_UN=0.0、Q_FILTER_UI=0.0、Q_FILTER_OUT=0.0、Q_FILTER_UI、Q_FILTER_UUOU=0.6283;
浮点 Vac_error=0.0;
float I_AC1=0.0;
悬空 Vac_er_n=0.0;
悬空 Vac_er_n1=0.0;
浮点 KP_VAC = 0.04;
浮点 ki_VAC = 0.005;
float IAC_error=0.0;
float IAC_error1=0.0;
float IAC_er_n=0.0;
float IAC_ER_n1=0.0;
悬空 KP_IAC = 1;
float ki_IAC = 0.05;
浮点 KP_VD = 1;
float ki_VD = 0.5;
float Vd_er_n1 = 0;
float ID_i1 = 0.0;
float ID_I = 0;
float ID_p = 0;
float ID_ref = 0;
float IAC_I = 0;
//float KP_IAC = 0.3;//1.0e-3;//1.0e-3;1.0e-4
//float ki_IAC = 0.3;//10.0e-3;//2.0e-5;7.5e-3
float V_alpha_r=0.0;
float V_beta_r=0.0;
float V_alpha=0.0;
float V_beta = 0.0;
float Vd=0.0;
float VQ=0.0;
float Vd_r=0.0;
浮点 VQ_r=0.0;
float Vd_error=0.0;
float VQ_error=0.0;
浮点 KP_VQ = 2;
float ki_VQ = 0.5;
float Vd_er_n=0.0;
//float Vd_er_n1=0.0;
float VQ_er_n=0.0;
float VQ_er_n1=0.0;
//float ID_ref=0.0;
float IQ_ref=0.0;
float I_alpha_r=0.0;
float i_beta_r=0.0;
//float ID_p=0.0;
//float ID_I=0.0;
float IQ_p=0.0;
float IQ_I=0.0;
float IQ_i1=0;
float Vpv=0;
float IPV=0;
float P=0;
float P_OLD=0;
float inc=1;
float V_max=19;
float V_min=16;
浮点 Vref_PV.17.6;
float DeltaV=0.01;
float verror = 0;
float v_adc=0;
float v_ADC1=0;
float I_ADC=0;
float I_ADC1=0;
float Kp_vpv = 0.005;
float ki_vpv = 0.009;
浮点 D1 = 0.1;
浮点 DSH = 0.1;
float Vq00 = 0;
浮动 DW;
float dW0 = 0;
浮动 W;
悬空 W0;
浮点 Theta0 = 0;
浮点 θ;
浮点正弦;
浮点余弦;
//有符号 int V_dac;
//////////////////////////// 电压控制变量////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//电压 PI 控制器常数
////////////////////// 电流控制变量//////////////////////////////////////////////////////////////////////////////////////////////////////////
//电流 PI 控制器常数
//反转 Park 变换变量
//逆向克拉克变换变量
//正弦 PWM 脉冲上升
无符号 int PRD = 1562;// Fsw = 10000Hz
浮点 M1;
浮动 M2;
//######################################################################################################################
//主代码
//######################################################################################################################
void main (void)
{
InitSysCtrl();// DSP2837x_sysctrl.c 中的基本内核初始化
TS=0.000058;
W0=314.159265;
DINT;//禁用所有中断//
GPIO_SELECT();
Setup_ADC_conf();
Setup_ePWM ();// ePWM 初始化
ConfigureDAC();
InitPieCtrl();// PIE 表的基本设置;来自 DSP2833x_PIECTRL.c
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();// PIE 中的默认 ISR
EALLOW;
PieVectTable.ADCB1_INT =&ADC_ISR;//用于 ADCB 中断的函数
EDIS;
//在 PIE 中启用 ADCB INT:组1中断2
PieCtrlRegs.PIEIER1.bit.INTx2 = 1;
IER |= M_INT1;//为 ADC 启用 INT1
EINT;
ERTM;
while (1)
{
}
}
void GPIO_select (void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//启用 GPIO0上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;//启用 GPIO1上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;//启用 GPIO2上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;//启用 GPIO3上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0;//启用 GPIO4上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO5=0;//启用 GPIO5上的上拉
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;// GPIO4
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// GPIO17 = PWM6B
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;// GPIO12 = PWM7A
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;// GPIO13 = PWM7B
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;// GPIO14=PWM8A
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;// GPIO15 = PWM8B
GpioCtrlRegs.GPAMUX1.bit.GPIO5=1;// GPIO16=PWM6A
EDIS;
}
void Setup_ADC_conf (void)
{
EALLOW;
AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
// AdcSetMode (ADC_ADCB、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcbRegs.ADCCTL2.bit.Resolution = 0;// 12位分辨率
AdcbRegs.ADCCTL2.bit.SIGNALMODE = 0;//单端通道转换(仅12位模式)
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;//将脉冲位置设置为延迟
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
DELAY_US (1000);//延迟1ms 以允许 ADC 加电时间
EDIS;
EALLOW;
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 5;// SOC0将转换引脚 B5
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 14;//采样窗口为14个 SYSCLK 周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//在 ePWM7 SOCA/D 上触发
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 4;// SOC1将转换引脚 B4
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 14;//采样窗口为14个 SYSCLK 周期
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 5;//在 ePWM7 SOCA/D 上触发
AdcbRegs.ADCSOC2CTL.bit.CHSEL = 2;// SOC2将转换引脚 B2
AdcbRegs.ADCSOC2CTL.bit.ACQPS = 14;//采样窗口为14个 SYSCLK 周期
AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 5;//在 ePWM7 SOCA/D 上触发
AdcbRegs.ADCSOC3CTL.bit.CHSEL = 3;// SOC3将转换引脚 B3
AdcbRegs.ADCSOC3CTL.bit.ACQPS = 14;//采样窗口为14个 SYSCLK 周期
AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = 5;//在 ePWM7 SOCA/D 上触发
//AdcbRegs.ADCSOC4CTL.bit.CHSEL = 4;// SOC4将转换引脚 B3
//AdcbRegs.ADCSOC4CTL.bit.ACQPS = 14;//采样窗口为14个 SYSCLK 周期
//AdcbRegs.ADCSOC4CTL.bit.TRIGSEL = 5;//在 ePWM7 SOCA/D 上触发
//AdcbRegs.ADCSOC5CTL.bit.CHSEL = 2;// SOC5将转换引脚 B5
//AdcbRegs.ADCSOC5CTL.bit.ACQPS = 14;//采样窗口为14个 SYSCLK 周期
//AdcbRegs.ADCSOC5CTL.bit.TRIGSEL = 5;//在 ePWM7 SOCA/D 上触发
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 3;// SOC5的末尾将设置 INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}
void Setup_ePWM (void)
{
EPwm1Regs.TBCTL.bit.CLKDIV = 0;// CLKDIV = 1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;// HSPCLKDIV = 1
EPwm1Regs.TBCTL.bit.CTRMODE = 2;//向上-向下计数模式
EPwm1Regs.TBPRD = 1562;//计时器周期18.75 KHz
// TBPRD = 1/2 (100MHz/18.75kHz)
EPwm1Regs.CMPA.bit.CMPA = 0;//占空比
EPwm1Regs.AQCTLA.ALL = 0x0090;//在 CMPA 上清除 ePWM7A
//将 CMPA 上的 ePWM7A 设置为 down
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;//将 PWM1B 设置为零
EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;
EPwm1Regs.DBRED.bit.DBRED = 0;// 0.25微秒延迟
EPwm1Regs.DBFED.bit.DBFED = 0;//针对上升沿和下降沿
EPwm1Regs.DBCTL.bit.OUT_MODE = 3;// ePWM7A =红色
EPwm1Regs.DBCTL.bit.POLSEL = 2;// S3=1 ePWM7B 上的反相信号
EPwm1Regs.DBCTL.bit.IN_MODE = 0;// ePWM7A =红色和 FED 源
EPwm1Regs.ETSEL.ALL = 0;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;// ADC 触发
EPwm1Regs.ETSEL.bit.SOCASEL = 2;//触发周期匹配
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//触发第1个事件
///////////////////////////////////
EPwm2Regs.TBCTL.bit.CLKDIV = 0;// CLKDIV = 1
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;// HSPCLKDIV = 1
EPwm2Regs.TBCTL.bit.CTRMODE = 2;//向上-向下计数模式
EPwm2Regs.TBPRD = 1562;//计时器周期18.75 KHz
// TBPRD = 1/2 (100MHz/18.75kHz)
EPwm2Regs.CMPA.bit.CMPA = 0;//占空比
EPwm2Regs.AQCTLA.ALL = 0x0090;//在 CMPA 上清除 ePWM8A
//将 CMPA 上的 ePWM8A 置为低电平
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;//将 PWM2A 设置为零
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm2Regs.AQCTLB.bit.CAU = AQ_SET;//将 PWM2B 设置为零
EPwm2Regs.AQCTLB.bit.CAD = AQ_CLEAR;
EPwm2Regs.DBRED.bit.DBRED = 0;// 0.25微秒延迟
EPwm2Regs.DBFED.bit.DBFED = 0;//针对上升沿和下降沿
EPwm2Regs.DBCTL.bit.OUT_MODE = 3;// ePWM8A =红色
EPwm2Regs.DBCTL.bit.POLSEL = 2;// S3=1 ePWM8B 上的反相信号
EPwm2Regs.DBCTL.bit.IN_MODE = 0;// ePWM8A =红色和馈电源
///////////////////////////////////
EPwm3Regs.TBCTL.bit.CLKDIV = 0;// CLKDIV = 1
EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0;// HSPCLKDIV = 1
EPwm3Regs.TBCTL.bit.CTRMODE = 2;//向上-向下计数模式
EPwm3Regs.TBPRD = 1562;//计时器周期18.75 KHz
// TBPRD = 1/2 (100MHz/18.75kHz)
EPwm3Regs.CMPA.bit.CMPA =0;//占空比
EPwm3Regs.AQCTLA.ALL = 0x0090;//在 CMPA 上清除 ePWM9A
//将 CMPA 上的 ePWM9A 置为低电压
EPwm3Regs.DBRED.bit.DBRED = 0;// 0.25微秒延迟
EPwm3Regs.DBFED.bit.DBFED = 0;//针对上升沿和下降沿
EPwm3Regs.DBCTL.bit.OUT_MODE = 3;// ePWM9A =红色
EPwm3Regs.DBCTL.bit.POLSEL = 2;// S3=1 ePWM9B 上的反相信号
EPwm3Regs.DBCTL.bit.IN_MODE = 0;// ePWM9A =红色和 FED 源
///
}
空配置 DAC (空)
{
EALLOW;
DacaRegs.DACCTL.bit.DACREFSEL = 1;//使用 ADC 基准
DacaRegs.DACCTL.bit.LOADMODE = 0;//加载下一个 SYSCLK
DacaRegs.DACVALS.ALL = 0x0800;//设置中等范围
DacaRegs.DACOUTEN.bit.DACOUTEN = 1;//启用 DAC
DacbRegs.DACCTL.bit.DACREFSEL = 1;//使用 ADC 基准
DacbRegs.DACCTL.bit.LOADMODE = 0;//加载下一个 SYSCLK
DacbRegs.DACVALS.ALL = 0x0800;//设置中等范围
DacbRegs.DACOUTEN.bit.DACOUTEN = 1;//启用 DAC
EDIS;
}
中断空 ADC_ISR (空)
{
GpioDataRegs.GPASET.bit.GPIO6 = 1;
VAC = AdcbResultRegs.ADCRESULT0;//将结果存储为全局
V_ADC = AdcbResultRegs.ADCRESULT1;
I_ADC = AdcbResultRegs.ADCRESULT2;
IAC = AdcbResultRegs.ADCRESULT3;//将结果存储在全局范围内
rand1 =(Vac*3)/4095)-1.43;
V_ADC1 =((v_ADC*3)/4095);
I_ADC1 =((I_ADC*3)/4095);
Crand1 =((IAC*3)/4095)-1.440;
V_out = rand1*235.75;
Vpv = v_ADC1*11.50;
IPV = I_ADC1*2.27272727;
IO = Crand1*5.55;
//mppt
P = Vpv*IPV;
if (tere.<P_old))
{
inc=-inc;
}
vref_pv=vref_pv+inc*deltaV;
如果(Vref_pv>V_max)
{
VREF_PV=V_max;
}
IF (Vref_pv.v <V_min) .v
{
VREF_PV=V_min;
}
Verror = Vpv - Vref_pv;
P_OLD=P;
DSH = DSH + KP_vpv*镜像+ ki_vpv*镜像;
如果(DSH > 0.25)
{
DSH=0.25;
}
否则(DSH < 0.25)
{
DSH=0.25;
}
其他
{
DSH = 0.25;
}
D1 = DSH*125;
EPwm3Regs.CMPA.bit.CMPA = D1;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//软启动
// if (Vac_pk <=Vac_pK1)
//{Vac_pk1=Vac_pk;}
//否则
//{Vac_pk1=Vac_pK1+0.5;}
//Vac_ref = Vac_pk1*正弦;
// I_AC 电流限制器可避免瞬态电流感应
// if (I_AC>=3)
//{I_AC = 3;}
//否则(I_AC<=-3)
//{I_AC =-3;}
//否则
//{I_AC = I_AC;}
//总角度频率= W0+Delta (W)
W = W0;
//集成
Theta = Theta0+(W*TS);
if (Theta >= 6.283184)
{
Theta = 0;
}
//===================
Theta0 = Theta;
Sine = sin (Theta);
余弦= cos (Theta);
// 基于 DQ 的控制
V_alpha_r = Vac_ref;
V_beta_r = 0.0;
vd_r = cosine*V_alpha_r + sine*V_beta_r;
vq_r =-sine*V_alpha_r + cosine*V_beta_r;
V_alpha =V_out;
V_beta = 0.0;
VD = cosine*V_alpha + sine*V_beta;
Vq =-sine*V_alpha + cosine*V_beta;
vd_er_n1 = vd_r - vd;
Id_p=KP_Vd*Vd_er_n1;
Id_i=ID_i1+(ki_Vd*Vd_er_n1);
if (ID_I>3.0)
{ID_I=3.0;ID_i1=3.0;}
否则、如果(ID_I<-3.0)
{ID_i=-3.0;ID_i1=-3.0;}
其他
{ID_I=ID_I;}
Id_ref=ID_p+ID_I;
vq_er_n1 = vq_r - vq;
IQ_p=KP_VQ*VQ_ER_n1;
IQ_i=IQ_i1+(ki_VQ*VQ_er_n1);
if (IQ_I>3.0)
{IQ_I=3.0;IQ_i1=3.0;}
否则、如果(IQ_I<-3.0)
{IQ_i=-3.0;IQ_i1=-3.0;}
其他
{IQ_I=IQ_I;}
IQ_ref=IQ_p+IQ_I;
I_alpha_r = cosine*ID_ref - sine*IQ_ref;
i_beta_r = sine*ID_ref + cosine*IQ_ref;
I_AC_ref = I_alpha_r;
if (i_ac_ref>3.0)
{I_AC_ref=3.0;}
否则、如果(IAC_I<-3.0)
{I_AC_ref=-3.0;}
其他
{I_AC_ref=I_AC_ref;}
// I_AC_ref = 3* sin;//电流环路调谐的固定基准
IAC_ER_n1 = I_AC_ref-IO;
IAC_ERROR=IAC_error1+(ki_IAC*IAC_ER_n1);
if (IAC_ERROR>0.9)
{IAC_ERROR=0.9;
IAC_error1=0.9;}
否则、如果(IAC_ERROR<-0.9)
{IAC_ERROR=-0.9;
IAC_error1=-0.9;}
其他
{IAC_ERROR=IAC_ERROR;}
MI =(KP_IAC*IAC_ER_n1)+IAC_ERROR;
如果(MI > 0.7)
{MI = 0.7;}
否则(MI <-0.7)
{MI =-0.7;}
其他
{MI = MI;}
//比较值提升
M=0.7*正弦;
M1 =(M)*(781)+(781);
M2 =(-M)*(781)+(781);
EPwm1Regs.CMPA.bit.CMPA = M1;
EPwm2Regs.CMPA.bit.CMPA = M2;
//EPwm3Regs.CMPA.bit.CMPA = 25;
IAC_error1=IAC_ERROR;
//Vac_i1=Vac_I;
ID_i1=ID_I;
IQ_i1=IQ_I;
//================================================
// Uan =正弦;
// UBN = sin (Theta-2.094395);
// UCN = sin (Theta+2.094395);
//================================================
GpioDataRegs.GPACLEAR.bit.GPIO6=1;
//////////////// 发援会的产出////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DacaRegs.DACVALS.ALL =(((rand1+1.43)*4095)/3);
//DacbRegs.DACVALS.ALL =(((Crand3+1.6634)* 4095)/3.045);
//从中断返回
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACK.all = PIEACK_Group1;//确认 PIE 组1以启用进一步的中断
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//源代码结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================