您好!
我想正确设置 ADC。
但我不理解数据表中的所有连接:
在数据表的第1389页可以找到以下数据:
-ADC 转换时钟频率= 16MHz
-ADC 转换率= 1Msps
-ADC 采样时间= 250ns
-ADC 转换时间= 1us
从触发到转换开始的延迟= 2个 ADC 时钟
这些数据是如何相关的?
我的硬件配置如下所示:
void init_SYS_CLOCK()
{
MAP_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL |
SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
MAP_SysCtlDelay(10);
}
void init_WTIMER_5()
{
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER5);
while(!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_WTIMER5));
// WTimer 5A is PD6 and the trigger for adc
MAP_TimerConfigure(WTIMER5_BASE, TIMER_CFG_SPLIT_PAIR |
TIMER_CFG_A_PERIODIC);
// Set ADC sampling frequency to be 44KHz every 22.725uS
MAP_TimerLoadSet(WTIMER5_BASE, TIMER_A, (SysCtlClockGet()/44000) - 1);
// Enable the ADC trigger output for Timer A.
TimerControlTrigger(WTIMER5_BASE, TIMER_A, true);
TimerEnable(WTIMER5_BASE, TIMER_A);
}
void init_uDMA_MIC0()
{
// adc mic setup
// uDMA Channel 14
MAP_uDMAChannelAssign(UDMA_CH14_ADC0_0);
MAP_uDMAChannelAttributeDisable(14,
UDMA_ATTR_ALTSELECT |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
MAP_uDMAChannelControlSet(14 | UDMA_PRI_SELECT,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE |
UDMA_DST_INC_16 | UDMA_ARB_4);
MAP_uDMAChannelControlSet(14 | UDMA_ALT_SELECT,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE |
UDMA_DST_INC_16 | UDMA_ARB_4);
MAP_uDMAChannelAttributeEnable(14, UDMA_ATTR_USEBURST);
}
void init_ADC0()
{
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
while(!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0));
ADCClockConfigSet(ADC0_BASE, ADC_CLOCK_SRC_PIOSC |
ADC_CLOCK_RATE_FULL, 1);
SysCtlDelay(10);
}
void init_ADC0_MIC0()
{
MAP_GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_2);
MAP_IntDisable(INT_ADC0SS0);
MAP_ADCIntDisable(ADC0_BASE, 0);
MAP_ADCSequenceDisable(ADC0_BASE, 0);
//MAP_ADCHardwareOversampleConfigure(ADC0_BASE, 32);
MAP_ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_TIMER, 0);
MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH5);
MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH5);
MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH5);
MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_CH5 | ADC_CTL_IE);
MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_CH5);
MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 5, ADC_CTL_CH5);
MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 6, ADC_CTL_CH5);
MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 7, ADC_CTL_CH5 |
ADC_CTL_IE | ADC_CTL_END);
// ------------------ //
// Priority Levels
// Priority 4 = 0xE0 ->lower
// Priority 3 = 0x60
// Priority 2 = 0x20
// Priority 1 = 0x00 ->higher
// ------------------ //
MAP_IntPrioritySet(INT_ADC0SS0, 0xE0); // Priority 4 !!!
}
void start_ADC0()
{
recordMusic_ADC0();
MAP_ADCSequenceEnable(ADC0_BASE, 0);
MAP_ADCIntClear(ADC0_BASE, 0);
MAP_ADCSequenceOverflowClear(ADC0_BASE, 0);
MAP_ADCSequenceUnderflowClear(ADC0_BASE, 0);
MAP_ADCSequenceDMAEnable(ADC0_BASE, 0);
MAP_ADCIntEnable(ADC0_BASE, 0);
MAP_IntEnable(INT_ADC0SS0);
}
void recordMusic_ADC0()
{
#ifndef DEBUG_OFF
DEBUG_PC4 = GPIO_PIN_4; // Rec
#endif
if (mic0BuffersStatus[0] == EMPTY)
{
// start primary channel to buffer in ADCBufferForFft0
MAP_uDMAChannelTransferSet(14 | UDMA_PRI_SELECT,
UDMA_MODE_PINGPONG,
(void *)(ADC0_BASE + ADC_O_SSFIFO0),
&mic0Buffers[0], 1024);
MAP_uDMAChannelEnable(14 | UDMA_PRI_SELECT);
mic0BuffersStatus[0] = FILLING;
#ifndef DEBUG_OFF
DEBUG_PA2 = GPIO_PIN_2; // ADC Start Pri1
#endif
}
if (mic0BuffersStatus[1] == EMPTY)
{
// start alternate channel to buffer in ADCBufferForFft1
MAP_uDMAChannelTransferSet(14 | UDMA_ALT_SELECT,
UDMA_MODE_PINGPONG,
(void *)(ADC0_BASE + ADC_O_SSFIFO0),
&mic0Buffers[1], 1024);
MAP_uDMAChannelEnable(14 | UDMA_ALT_SELECT);
mic0BuffersStatus[1] = FILLING;
#ifndef DEBUG_OFF
DEBUG_PA3 = GPIO_PIN_3; // ADC Start Alt1
#endif
}
#ifndef DEBUG_OFF
DEBUG_PA2 = 0; // ADC Start Pri1
DEBUG_PA3 = 0; // ADC Start Alt1
#endif
}
80MHz 上的 CPU 时钟。
ADC 时钟频率为16MHz。
ADC 转换速率为1Msps。
WTimer5A 设置为44kHz。
如果硬件过采样关闭、如何立即计算采样率?
我想了解这种关系。
并且对一些计算示例也非常满意。
我刚刚使用 Logig Analyzer 检查了我的设置、发现计时器频率对采样率没有影响。
只有当我打开硬件过采样时、我才会获得低采样率。
