工具/软件:Code Composer Studio
尊敬的先生/女士:
我将 CC3200与 CCS 结合使用、我遇到了一些奇怪的问题、看起来像是 CC3200芯片中的一些硬件问题。 因此、我正在与您联系以寻求帮助。
我使用 ADC 对标准正弦波进行采样、一个通道用于电压、一个通道用于电流。 ADC 在乒乓模式下持续工作、每 16ms 调用一次中断函数、对一组1000点进行采样、并根据每个中断1000点在中断函数中进行频率计算。 我们检查了原始样本、发现当频率计算的计算复杂性低于5000倍浮点乘法时、样本非常好。 但是、当频率计算的计算复杂性超过5000倍浮点乘法时、采样偶尔会异常、即大约每3-6秒、采样将如下所示。 采样看起来会突然暂停一段时间、然后恢复。 
总之、当中断中的计算复杂性有时可能影响采样时、看起来就像这样。 直接从 ADC 获得的样本不应受到计算的影响、对吗? 这对我来说非常奇怪。 您能帮助解决这个问题吗? 非常感谢您的参与。
我的代码如下所示。
void InitAdcDma (void){
无符号短整型状态;
UDMAInit();
PinTypeADC (PIN_59、0xFF);
PinTypeADC (PIN_600xFF);
/*电压通道*/
pChannelVoltageAdcChannelNum = ADC_CH_2;
pChannelVoltageDmaChannelNum = UDMA_CH16_ADC_CH2;
/*当前通道*/
pChannelCurrentAdcChannelNum = ADC_CH_3;
pChannelCurrentDmaChannelNum = UDMA_CH17_ADC_CH3;
//
//获取与指定通道关联的中断号
//
pChannelVoltageAdcIntNum = INT_ADCCH2;
pChannelCurrentAdcIntNum = INT_ADCCH3;
//
//设置电压 ADC 通道的传输
//
map_uDMAChannelAssign (pChannelVoltageDmaChannelNum);
UDMASetupTransfer (pChannelVoltageDmaChannelNum|UDMA_PRI_SELECT、UDMA_MODE_Pingpong、 M_TOTAL_DMA_SAMPples、 UDMA_SIZE 32、UDMA_ARB_1、 (void *)(0x4402E874+ pChannelVoltageAdcChannelNum)、UDMA_SRC_INC_NONE、 (void *)&(pChannelVoltageDmaDataDumpPing [0])、UDMA_DST_INC_32);
UDMASetupTransfer (pChannelVoltageDmaChannelNum|UDMA_ALT_SELECT、UDMA_MODE_Pingpong、 M_TOTAL_DMA_SAMPples、UDMA_SIZE 32、UDMA_ARB_1、 (void *)(0x4402E874+ pChannelVoltageAdcChannelNum)、UDMA_SRC_INC_NONE、(void *)&(pChannelVoltageDmaDataDumpPong[0])、UDMA_DST_INC_32);
//
//启用 uDMA
//
ADCDMAEnable (ADC_base、 pChannelVoltageAdcChannelNum);
//
//设置电压 ADC 通道的传输
//
map_uDMAChannelAssign (pChannelCurrentDmaChannelNum);
UDMASetupTransfer (pChannelCurrentDmaChannelNum|UDMA_PRI_SELECT、UDMA_MODE_pingpong、 m_total_dma_samples、 UDMA_SIZE_32、UDMA_ARB_1、 (void *)(0x4402E874+ pChannelCurrentAdcChannelNum)、UDMA_SRC_INC_NONE、 (void *)&(pChannelCurrentDmaDataDumpPing [0])、UDMA_DST_INC_32);
UDMASetupTransfer (pChannelCurrentDmaChannelNum|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、
m_total_dma_samples、 UDMA_SIZE_32、UDMA_ARB_1、 (void *)(0x4402E874+ pChannelCurrentAdcChannelNum)、UDMA_SRC_INC_NONE、 (void *)&(pChannelCurrentDmaDataDumpPong[0])、UDMA_DST_INC_32);
//
//启用 uDMA
//
ADCDMAEnable (ADC_base、 pChannelCurrentAdcChannelNum);
//
//设置电压 ADC
//
//#ifdef sl_platform_multi_threaded
// OSI_InterruptRegister (pChannelVoltageAdcIntNum、(P_OSI_INTR_Entry) ADCIntHandlerChV、INT_Priority_LVL_2);
//#else
//
//设置优先级
//
IntPrioritySet (pChannelVoltageAdcIntNum、INT_Priority_LVL_0);
IntPendClear (pChannelVoltageAdcIntNum);
ADCIntRegister (ADC_base、pChannelVoltageAdcChannelNum、ADCIntHandlerChV);
//#endif
STATUS = ADCIntStatus (ADC_base、 pChannelVoltageAdcChannelNum);
ADCIntClear (ADC_base、 pChannelVoltageAdcChannelNum、Status|ADC_DMA_DONE);
ADCIntEnable (ADC_base、 pChannelVoltageAdcChannelNum、ADC_DMA_DONE);
ADCChannelEnable (ADC_base、 pChannelVoltageAdcChannelNum);
//
//设置当前 ADC
//
//#ifdef sl_platform_multi_threaded
// OSI_InterruptRegister (pChannelCurrentAdcIntNum、(P_OSI_INTR_Entry) ADCIntHandlerChI、INT_Priority_LVL_2);
//#else
//
//设置优先级
//
IntPrioritySet (pChannelCurrentAdcIntNum、INT_Priority_LVL_2);
IntPendClear (pChannelCurrentAdcIntNum);
ADCIntRegister (ADC_base、pChannelCurrentAdcChannelNum、ADCIntHandlerChI);
//#endif
status = ADCIntStatus (ADC_base、 pChannelCurrentAdcChannelNum);
ADCIntClear (ADC_base、 pChannelCurrentAdcChannelNum、Status|ADC_DMA_DONE);
ADCIntEnable (ADC_base、 pChannelCurrentAdcChannelNum、ADC_DMA_DONE);
ADCChannelEnable (ADC_base、 pChannelCurrentAdcChannelNum);
//
//设置软件中断处理程序以处理城域数据
//
// #ifdef sl_platform_multi_threaded
// OSI_InterruptRegister (metrougation_SFT_INT_NUM、(P_OSI_INTR_Entry) ComputeSmartPlugMetrology、INT_Priority_LVL_3);
//// #else
//// SoftwareIntRegister (metrougation_SFT_INT_NUM、INT_Priority_LVL_3、ComputeSmartPlugMetrology);//1.024秒中断
// #endif
//
//启用 ADC
//
ADCTimerConfig (ADC_base、2^17);
ADCTimerEnable (ADC_base);
ADCEnable (ADC_base);
}
void ADCIntHandlerChV (void){
unsigned long ulChannelStructIndex、ulMode、ulControl;
tDMAControlTable *pControlTable;
unsigned long *pDataDumpBuff =空;
无符号短整型状态;
// unsigned short uiIndex;
STATUS = ADCIntStatus (ADC_base、 pChannelVoltageAdcChannelNum);
ADCIntClear (ADC_base、 pChannelVoltageAdcChannelNum、Status|ADC_DMA_DONE);
ulMode = MAP_uDMAChannelModeGet (pChannelVoltageDmaChannelNum | UDMA_PRI_SELECT);
if (ulMode = UDMA_MODE_STOP) {
ulChannelStructIndex = pChannelVoltageDmaChannelNum | UDMA_PRI_SELECT;
pDataDumpBuff =&(pChannelVoltageDmaDataDumpPing [0]);
}
其他
{
ulMode = MAP_uDMAChannelModeGet (pChannelVoltageDmaChannelNum | UDMA_ALT_SELECT);
//
//如果主控制结构体指示停止,则表示"A"
//接收缓冲完成。 UDMA 控制器仍应接收
//将数据输入"B"缓冲区。
//
if (ulMode = UDMA_MODE_STOP)
{
ulChannelStructIndex = pChannelVoltageDmaChannelNum | UDMA_ALT_SELECT;
pDataDumpBuff =&(pChannelVoltageDmaDataDumpPong[0]);
}
}
if (pDataDumpBuff!=空)
{
pChannelVoltageDmaBlockCount++;
ulChannelStructIndex &= 0x3f;
pControlTable = uDMAControlBaseGet ();
ulControl =(pControlTable[ulChannelStructIndex].ulControl &
μ~(UDMA_CHCTL_XFERSIZE_M | UDMA_CHCTL_XFERMODE_M));
ulControl |= UDMA_MODE_PINGONG |((M_TOTAL_DMA_SAMPS_1)<< 4);
uDMAChannelControlSet (ulChannelStructIndex、ulControl);
计算频率_EKF (pDataDumpBuff、M_TOTAL_DMA_SAMPLEs、pChannelVoltageDmaBlockCount);
//执行频率计算。
/*每秒计算原始计量参数*/
if (M_total_dma_blocks_per_sec = pChannelVoltageDmaBlockCount) {
if (pChannelVoltageDmaBlockCount = pChannelCurrentDmaBlockCount) {
pChannelVoltageDmaBlockCount = 0;
pChannelCurrentDmaBlockCount = 0;
}
}
ulChannelStructIndex &= 0x3f;
pControlTable =(tDMAControlTable *) HWREG (UDMA_BASE + UDMA_O_CTLBASE);
ulControl =(pControlTable[ulChannelStructIndex].ulControl &
μ~(UDMA_CHCTL_XFERSIZE_M | UDMA_CHCTL_XFERMODE_M));
ulControl |= UDMA_MODE_PINGONG |((M_TOTAL_DMA_SAMPS_1)<< 4);
pControlTable[ulChannelStructIndex].ulControl = ulControl;
#if 0
ArrayIndexV = 0;
printf ("\n\n\r\n\r\n");
while (ArrayIndexV < M_TOTAL_DMA_SAples)
{
printf ("%d\n"、(pDataDumpBuff[ArrayIndexV++]>2)& 0xFFF);
}
#endif
}
}