大家好、这是 namha。
我在计算 ADC 采样时间时发现了一个奇怪的现象。
ADC 结果值存储在变量中。 总采样时间取决于变量的类型。
使用两个具有两个变量的 ADC 模块接收2048个 ADC 数据。
我将采样频率设置为450kHz。
我测量了我完成 for 循环的时间。
但是、当 FFT_Buffer 数组的类型声明为 uint16_t 或 uint32_t 时、for 循环的运行时间为4520us、当它声明为 float32_t 时、运行时间为5560us。
(换句话说、float32_t 类型比 uint16_t 或 uint32_t 类型花费250ns 的时间存储在一个变量中。)
1.将 ADC 值存储在变量中的时间是否取决于变量类型? 如果是、原因是什么?
2. ADC 模块采样频率的误差率是多少?
我的来源如下。
(三 主页代码
int main (空)
{
uint32_t ADCCurrentIndex = 0;
ROM_SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_24MHZ);//将计时设置为从 PLL 运行
ROM_FPUEnable();
ROM_FPULazyStackingEnable();
GPIO_initGeneral ();//为 LED 启用 GPIO 引脚(PF2和 PF3)。
GPIO_NMisable();
G_bUSBConfigured = false;//最初未配置。
SystemTick_enable();//启用系统节拍。
SPIInit();
I2CInit();
ADCInit();
AFEInit();
PLLInit();
//USBBulk_init();
SetPllFreq (2);//2MHz
DELAY_ms (1000);// AEF 设置等待
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_0、0);//端口 B 引脚0 초기화
ADCEnable();
while (1)
{
// 循环的进度时间????
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_0、GPIO_PIN_0);// GPIO 周期测试、低电平
对于(ADCCurrentIndex=0;ADCCurrentIndex < 2048;ADCCurrentIndex++)
{
ROM_ADCIntClear (ADC0_BASE、3);
ROM_ADCIntClear (ADC1_BASE、3);
while (!ROM_ADCIntStatus (ADC0_BASE、3、0));
while (!ROM_ADCIntStatus (ADC1_base、3、0));
FFT_Buffer[2*ADCCurrentIndex + 0]= HWREG (ADC0_BASE + ADC_O_SSFIFO3);//
FFT_Buffer[2*ADCCurrentIndex + 1]= HWREG (ADC1_BASE + ADC_O_SSFIFO3);
}
ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_0、0);// GPIO 周期测试、低电平
//AFEChannelSelect (0);
//DoFFT (FFT_Points、0);
//delay_ms (1);
}
}
(二 ADCInit()
空 ADCInit()
{
uint32_t SamplePeriod = 0;
//初始化 ADC
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//ADC 外设
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);//ADC 外设
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
用于 ADC 通道的//引脚
ROM_GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
ROM_ADCSequenceConfigure (ADC0_BASE、ADC_SEQUENCE_NUMBER、ADC_TRIGGER_TIMER、0);
ROM_ADCSequenceConfigure (ADC1_base、ADC_SEQUENTER_NUMBER、ADC_TRIGGER_TIMER、0);
ROM_ADCSequenceStepConfigure (ADC0_BASE、ADC_SEQUENCE_NUMBER、0、ADC_CTL_D | ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);
ROM_ADCSequenceStepConfigure (ADC1_base、ADC_Sequence_Number、0、ADC_CTL_D | ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END);
ROM_ADCHardwareOversampleConfigure (ADC0_BASE、txLeakageOversamplingNumber);
ROM_ADCHardwareOversampleConfigure (ADC1_base、txLeakageOversamplingNumber);
ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);
SamplePeriod =(ROM_SysCtlClockGet ()/450000);//计算450KHz 的时间周期、通过
ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、SamplePeriod - 1);//采样频率
ROM_TimerEnable (TIMER0_BASE、TIMER_A);
ROM_TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
ROM_ADCSequenceEnable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ROM_ADCSequenceEnable (ADC1_base、ADC_SEQUENSE_NUMBER);
ROM_ADCIntEnable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ROM_ADCIntEnable (ADC1_base、ADC_SEQUENCE_NUMBER);
}
此致、
Namha