主题中讨论的其他部件: C2000WARE
由于我的客户无法在论坛上发帖,我为他提交了一个问题。
"我正在使用TMDSPREX2.8335万板,我正在尝试转储两个信号:
1)外部50 Hz正弦信号,范围在1伏和2伏之间
2) 1 V直流信号
正确转换信号后,我尝试在同一图形窗口中观察外部交流信号和内部产生的单位振幅50 Hz正弦波。 我在图形窗口中查看外部转储50 Hz信号时发现两个异常。 这些建议如下:
a)频率远高于50 Hz
b)数据未正确记录,且所获得的图解中存在突然中断
我用于ADC初始化,正弦波生成和绘制数据的代码如下所示:
//本示例中使用的全局变量
UINT32 EPwm3TimerIntCount,EPwm5TimerIntCount,CpuTimer0IntCount = 1;
浮子占空比= 0.405 ,omega = 2* 3.1415926535 *50,ref_sine = 0,时间= 0,ref_sine_offset = 0, wt = 0,wt_offset = 0;
float ref_sin弦_n = 0,ref_sine_offset_n = 0;
float voltage_grid = 0,voltage_pv = 0,current_grid = 0,current_pv = 0,volte_offset = 0;
//用于绘图的变量
Int plot_count = 0,样本= 0;
float array_sine[400][2],array_sine_offset[400];
Void主(void)
{
InitSysCtrl();
dint;//禁用CPU中断
InitPieCtrl();//禁用所有外围设备中断
InitEPwmTimer();//启动所需的ePWM寄存器并配置中断要求
IER = 0x0000;//禁用所有中断
IFR = 0x0000;//清除所有中断的标志
InitPieVectorTable();
//************** ADC初始化和配置开始************ //
InitAdc();//基本ADC设置(包括校准)
AdcRegs.ADCTRL1.ALL =0;//初始化前清除ADCTRL1
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF;//采样和保持(15+1)=16个ADC周期
AdcRegs.ADCTRL1.bit.cps = 0;//进一步除以1
ADcRegs.ADCTRL1.bit.con_run =1;// ADC的连续运行模式
ADcRegs.ADCTRL1.bit.SEQ_CASC=1;// ADC的级联模式(16状态)
AdcRegs.ADCTRL2.ALL =0;//初始化前清除ADCTRL2
AdcRegs.ADCTRL2.bit.so_SEQ1 = 1;//启动SEQ1
// AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;//重置SEQ2
// AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//在SEQ1上启用中断
ADcRegs.ADCTRL3.bit.SMODE_SEL = 0;// ADC的连续同步转换
AdcRegs.ADCTRL3.bit.ADCCLKPS = 3;// 3,因为ADC的DSP2833x_sysctrl.c FCLK是75 MHz而不是150 MHz;
//75/(2*3)= 12.5 兆赫
AdcRegs.ADCMAXCONV.ALL = 0x0001;// 2个转换
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x2;//将ADCINA2分配给CONV00
// AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0xA;//将ADCINB2分配给conv01
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x3;//将ADCINA3分配给conv02
// AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 11;//将ADCINB3分配给conv03
// AdcRegs.ADCCHSELSEQ2.bit.CONV04 =4;//将ADCINA4分配给conv04
//************** ADC初始化和配置结束************ //
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.TINT0 =&CPU_timer0_ISR;
PieVectorTable.EPWM3_INT =&epwm3/timer_isr;
PieVectorTable.EPWM5_INT =&epwm5_TIMER_ISR;
EDIS;
ConfigCpuTimer(&CpuTimer0150,25);//以25 us或40 kHz的频率生成TINT0
CpuTimer0Regs.tcr.all = 0x4000;
//初始化计数器:
EPwm3TimerIntCount = 1;
EPwm5TimerIntCount = 1;
IER |=1;//启用timer0中断
IER |=4;//为ePWM3和ePWM5启用INT3
/*启用TINT0
//在PIE中启用EPWM3A INT:组3中断3
//在PIE中启用EPWM5A INT:组3中断5
*/
PieCtrlRegs.PIEIER1.bit.INTx7=1;
PieCtrlRegs.PIEIER3.bit.INTx3=1;
PieCtrlRegs.PIEIER3.bit.INTx5=1;
//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM
}
中断无效CPU_TIMER0_ISR(void)
{
CpuTimer0IntCount++;
//********************** 从ADC读取值开始于********************** //
volt_grid = AdcRegs.ADCRESULT0>4;//从ADCINA2读取网格电压到ADCResult2寄存器的volt_grid
current_grid = AdcRegs.ADCRESULT1>>4;//从ADCINB2读取网格电流到ADCResult3寄存器中的current_grid
// voltage_PV = AdcRegs.ADCRESULT6>>4;//从ADCINA3读取PV电压到ADCResult6寄存器中的volt_PV
// current_PV = AdcRegs.ADCRESULT7>4;//从ADCINB3读取PV电流到ADCResult7寄存器的current_PV
// volte_offset = AdcRegs.ADCRESULT8>4;//从ADCINA4读取参考电压到ADCResult8寄存器的volt_offset
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除SEQ1生成的中断
//********************** 读取ADC的值********************** //
IF (时间> 0.02)
时间=0;
wt = omega*time;
wt_offset = omega*(Time - 0.0001);//第二个正弦波的偏移量为100微秒
ref_sine = fabs (sin (wt));
ref_sine_n = sin (wt);
ref_sine_offset = fabs (sin (wt_offset));
ref_sine_offset_n = sin (wt_offset);
如果(plot_count == 0)
{
IF (样本> 399)
样本= 0;
array_sine[sample][0]= voltage_grid/1000;
array_sine[sample][1]= ref_sine_n;
array_sine_offset[sample]= ref_sine_offset_n;
示例++;
plot_count = 2;
}
图解计数--;
时间=时间+ 0.0.0025万 ;
PieCtrlRegs.PIEACG.ALL = PIEACK_GROUP1;
}
有关的图解如下:

您可以看到数据没有正确记录,并且与内部正弦相比,从ADC获得的正弦至少要快5倍。"
非常感谢你的帮助。
此致,
