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.

[参考译文] TM4C123GE6PM:根据变量类型的 ADC 采样时间延迟

Guru**** 2380860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/772319/tm4c123ge6pm-adc-sampling-time-delay-according-to-variable-type

器件型号:TM4C123GE6PM

大家好、这是 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    函数 HWREG()的返回值为"volatile uin32_t"类型。 将其存储为 uint16_t 非常重要、不需要额外的周期。 但是、将其存储为 float 需要进行整数到浮点的转换、这需要额外的周期。 查看在反汇编窗口中生成的汇编代码、您将看到附加指令。

    当使用定时器触发 ADC 转换器时、只要 ADC 不忙于其它序列、采样频率的精度等于系统时钟的精度。