大家好、
我将面临一个有关 ADC 的奇怪问题。 我想尽快转换温度传感器的 X 倍(在将来它将是一个模拟信号)。 因此、我启用 ADC、使用 ADC 处理程序和中断将结果放入全局变量中、我想等待我的 X 样本。 但是、即使完成了样本、我也无法使用循环来等待 X 样本的末尾。 我不明白为什么代码在采样结束后卡住。
实际上、如果我将行放在while(adc_seq < 1000{}主代码的末尾以等待采样结束、那么代码就会卡住。 如果我不使用该行、则它可以正常工作。 我必须确保在开始剩余代码之前完成 X 个样本、因此我必须等待。 有人有想法吗?
提前感谢
静态 int adc_seq = 0;
静态 uint32_t adc_data[1000];
void adC0seq3_Handler (void){
uint32_t ADC0Value[1];
ADCSequenceDataGet (ADC0_BASE、3、ADC0Value);//检索值。
ADC_DATA[ADC_SEQ]=(1475 -((2475 * ADC0Value[0]))/4096)/10;//数据表中的公式 VNREF 0和 VREFP 3.3全部*10以避免小数。
if (ADC_SEQ < 1000){// ADC 必须仍然工作
ADC_SEQ++;
ADCIntClear (ADC0_BASE、3);
}
否则{//在1000个样本后禁用 ADC
ADCSequenceDisable (ADC0_BASE、3);
}
}
void InitConvertADC (void){
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//启用 ADC0。
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)){}//等待 ADC0就绪。
ADCSequenceDisable (ADC0_BASE,3);//序列发生器必须在 ADC0的 config:SS3之前被禁用
ADCIntDisable (ADC0_BASE、3);//禁用 ADC0中断
IntDisable (INT_ADC0SS3_TM4C129);//禁用 ADC0序列3的中断功能
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_AUSE、0);//使用 ADC0、 采样序列发生器3始终触发
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END);
ADCIntClear (ADC0_BASE、3);//清除中断标志。
IntEnable (INT_ADC0SS3_TM4C129);//启用中断功能。
ADCIntEnable (ADC0_BASE、3);//启用序列发生器中断。
ADCSequenceEnable (ADC0_BASE、3);//启用序列发生器 ADC0 seq3.
}
int main (void)
{
while (ADC_SEQ < 1000){
ADC_DATA[ADC_SEQ]= 0;
ADC_SEQ++;
}
ADC_SEQ = 0;//复位 ADC_SEQ
BoardInit();//初始化板。
CONsComInit();//通过 UART0初始化与计算机的通信。
UARTprintf ("\033[2J\033[H");
UARTprintf ("test\n\n");//打印横幅
InitConvertADC(); //开始转换
while (ADC_Seq < 1000{} //如果使用此行,则代码被卡住,我再也不会走远了。 如果未使用、则可以正常工作。
UARTprintf ("\n 模数转换现已完成\n");
}