主题中讨论的其他器件:TM4C123
您好!
这是名称。
我想将 ADC 采样频率增加到超过1MHz。 但高于600kHz 的频率不会增加。
我同时使用 ADC0和 ADC1两个模块、我使用 timer0作为触发器、我正在处理轮询。
这里有一些问题。
1、为什么采样频率增加不超过1MHz?
2. 我想使用外部振荡器以32MHz 的频率运行 ADC 时钟。 我能否按如下所示使用 API?
'ADC_CLOCK _SRC_PLL'是什么意思?
ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、15);//将 ADC 配置为在480MHz 除以15时使用 PLL 以获得32MHz 的 ADC 时钟
ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、15);//将 ADC 配置为使用480MHz 的 PLL 除以15以获得32MHz 的 ADC 时钟。
3、 'ADC_REF_EXT_3V'在下面的代码中是什么意思?
ADCReferenceSet (ADC0_BASE、ADC_REF_EXT_3V)
以下是我的代码。
---------------------------------------- 函数-------------------------------------------------------
空 ADCInit()
{
uint32_t SamplePeriod = 0;
//初始化 ADC
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//ADC0外设
SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);//ADC1外设
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);// ADC 触发器
SysCtlDelay (10);
ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、15);//将 ADC 配置为使用480MHz 的 PLL 除以15即可获得 ADC
// 32MHz 时钟。
ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、15);//将 ADC 配置为使用480MHz 的 PLL 除以15即可获得 ADC
// 32MHz 时钟。
SysCtlDelay (10);//设置时钟配置的时间
用于 ADC 通道的//引脚
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
ADCSequenceConfigure (ADC0_BASE、ADC_SEQUENCE_NUMBER、ADC_TRIGGER_TIMER、0);
ADCSequenceConfigure (ADC1_base、ADC_SEQUENTER_NUMBER、ADC_TRIGGER_TIMER、0);
ADCSequenceStepConfigure (ADC0_BASE、ADC_SEQUENCE_NUMBER、0、ADC_CTL_D | ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);//差分模式、Timer0触发器
ADCSequenceStepConfigure (ADC1_BASE、ADC_SEQUENSE_NUMBER、0、ADC_CTL_D | ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END);//差分模式、Timer0触发器
ADCHardwareOversampleConfigure (ADC0_BASE、g_ui32AdcOverSamplingNumber);
ADCHardwareOversampleConfigure (ADC1_base、g_ui32AdcOverSamplingNumber);
ADCIntClear (ADC0_BASE、ADC_SEQUENCE_NUMBER);// ADC0中断标志清零
ADCIntClear (ADC1_base、ADC_SEQUENCE_NUMBER);// ADC1中断标志清零
TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICASE);
SamplePeriod = g_ui32SysClock / 800000;//计算500kHz 的时间周期
TimerLoadSet (TIMER0_BASE、TIMER_A、SamplePeriod - 1);//采样频率
TimerEnable (TIMER0_BASE、TIMER_A);
TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
TimerControlStall (TIMER0_BASE、TIMER_A、TRUE);//通过在断点停止计时器来帮助调试
ADCReferenceSet (ADC0_BASE、ADC_REF_EXT_3V);// ADC0外部基准电压设置
ADCReferenceSet (ADC1_base、ADC_REF_EXT_3V);// ADC0外部基准电压设置
ADCSequenceEnable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ADCSequenceEnable (ADC1_base、ADC_SEQUENSE_NUMBER);
}
void ADCAcquire_Org (uint32_t ADCDataLength)
{
uint32_t ui32ADCCurrentIndex = 0;
ADCEnable();// ADC 启动
//GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、GPIO_PIN_0);
for (ui32ADCCurrentIndex=0;ui32ADCCurrentIndex < ADCDDataLength /2;ui32ADCCurrentIndex++)
{
ADCIntClear (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ADCIntClear (ADC1_base、ADC_SEQUENCE_NUMBER);
while (!ADCIntStatus (ADC0_BASE、ADC_SEQUENCE_NUMBER、0));
while (!ADCIntStatus (ADC1_base、ADC_SEQUENCE_NUMBER、0));
G_ui16AdcRawData[2*ui32ADCCurrentIndex + 0]=(Q15_t) HWREG (ADC0_BASE + ADC_O_SSFIFO3);
G_ui16AdcRawData[2*ui32ADCCurrentIndex + 1]=(Q15_t) HWREG (ADC1_BASE + ADC_O_SSFIFO3);
}
//GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、0);
ADCDisable();// ADC 停止
}
void ADCEnable()
{
ADCIntEnable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ADCIntEnable (ADC1_base、ADC_SEQUENCE_NUMBER);
}
void ADCDisable()
{
ADCIntDisable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ADCIntDisable (ADC1_base、ADC_SEQUENCE_NUMBER);
}
---------------------------------------- 主----------------------------------------------------
int main (空)
{
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、TM4C129_MAIN_CLK);
FPUEnable();
FPULazyStackingEnable();
。
。
。
。
IntMasterEnable();// 20190312_LNH,全局中断使能
while (1)
{
ADCAcquire_Org (FFT_Points);// 20190312_LNH
ARM_Q15_TO_float (g_ui16AdcRawData、g_ui32AdcRawData、FFT_Points);// 20190312_Lnh、整数到浮点变化。
对于(i = 0;i < FFT_points;i++) g_ui32AdcRawData[i]= g_ui32AdcRawData[i]* FloatScale;// 20190312_Lnh、缩放整数到浮点
DELAY_ms (1);// 20190312_LNH
}