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**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/759709/tm4c123ge6pm-adc-multi-channel-interrupt

器件型号:TM4C123GE6PM

大家好、这是 Namha。  

我在实现多通道 ADC 中断功能时遇到问题。

我想使用 timer0和1的两个 ADC 中断处理程序。

(ADC 采样频率:1MHz)

但 ADC0SS3IntHandler 只能工作、ADC1SS3IntHandler 不能工作。

下面附上了 ADC 初始化和处理程序代码。 是设置问题还是另一个问题?  

///-------------------------------- ADC 初始化------------------------------------------------------- //  

空 ADCInit (空)

//初始化 ADC
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//ADC 外设
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);//ADC 外设
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);

用于 ADC 通道的//引脚
ROM_GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);

//*** ADC
ROM_ADCReferenceSet (ADC0_BASE、ADC_REF_INT);
ROM_ADCReferenceSet (ADC1_base、ADC_REF_INT);
ROM_ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_TIMER、0);
ROM_ADCSequenceConfigure (ADC1_base、3、ADC_TRIGGER_TIMER、3);
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_ADCSequenceEnable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ROM_ADCSequenceEnable (ADC1_base、ADC_SEQUENSE_NUMBER);
//rom_ADCHardwareOversampleConfigure (ADC0_BASE、txLeakageOversamplingNumber);
//rom_ADCHardwareOversampleConfigure (ADC1_base、txLeakageOversamplingNumber);

//***时间器0
ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);
SamplePeriod = ROM_SysCtlClockGet ()/(1000*ADC_MAX_SAMPLING_RATE);
ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、SamplePeriod - 1);//采样频率1MHz
ROM_TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);

//***时间器1
ROM_TimerConfigure (Timer1_base、timer_CFG_PERIODICRACRACASE);
ROM_TimerLoadSet (Timer1_base、timer_A、SamplePeriod - 1);//采样频率1MHz
ROM_TimerControlTrigger (Timer1_base、timer_A、true);

//***中断
ROM_IntEnable (INT_TIMER0A);
ROM_IntEnable (INT_TIMER1A);
ROM_TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
ROM_TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT);
ROM_IntEnable (INT_ADC0SS3);
ROM_IntEnable (INT_ADC1SS3);
ROM_ADCIntEnable (ADC0_BASE、ADC_SEQUENCE_NUMBER);
ROM_ADCIntEnable (ADC1_base、ADC_SEQUENCE_NUMBER);

ROM_IntMasterEnable();
ROM_TimerEnable (TIMER0_BASE、TIMER_A);
ROM_TimerEnable (Timer1_base、timer_A);

//------------------------------------------ 处理程序------------------------------------------------------- //

空 Timer0IntHandler (空)

ROM_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);

空 Timer1 IntHandler (空)

ROM_TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);

空 ADC0SS3IntHandler (空)

ROM_ADCIntClear (ADC0_BASE、3);

ADC0Value[0]= 0;

ROM_ADCSequenceDataGet (ADC0_BASE、3、ADC0Value);//从 ADC 获取数据并将其存储在 ADC1Value 中
adcRawData_0[ADCCurrentIndex_0]=* ADC0Value;
ADCCurrentIndex_0++;

if (ADCCurrentIndex_0 >= 2048)

ADCCurrentIndex_0 = 0;


空 ADC1SS3IntHandler (空)

ROM_ADCIntClear (ADC1_BASE、3);
ADC1Value[0]= 0;

ROM_ADCSequenceDataGet (ADC1_base、3、ADC1Value);//从 ADC 获取数据并将其存储在 ADC1Value 中
adcRawData_1_[ADCCurrentIndex_1]=* ADC1Value;
ADCCurrentIndex_1++;

if (ADCCurrentIndex_1 >=2048)

ADCCurrentIndex_1 = 0;


谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从定时器到 ADC 只有一个触发信号。 启用两个计时器的触发器将触发两个 ADC。 我怀疑您一直在 ADC0的中断例程中、并且从未有时间为 ADC1提供服务。 如果您希望两个 ADC 以相同的速率同时转换、只需使用一个计时器。 您可能还需要降低采样率、直到您确定有足够的 CPU 时间在下一个中断周期到来之前完全处理每个中断周期。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bob。
    感谢您的回复。
    我尝试使用一个计时器。 这两个处理程序按照您的建议工作。
    但是、采样频率仅在640Khz 或更低频率下工作、不会在高于该频率的频率下工作。 ADC0处理程序以正确的频率运行、但 ADC1处理程序在高于330KHz 的频率下无法工作。 两个 ADC 处理程序是否无法在高于 Hz 的频率下运行?

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

    我怀疑问题是您无法像收集数据那样快速处理数据。 我在.zip 文件中附加了一个项目、该项目以1M 样本/秒的速率在2个通道上进行同步转换。 为此、我使用 uDMA 读取两个 ADC。 即使缓冲1000次转换、也需要80%的 CPU 时间对2000个采样(每个 ADC 1000个)进行简单平均、然后再完成下一个采样。 (使用 CCS 的"File""Import"函数将此项目添加到您的 CCS 工作区。)

    /cfs-file/__key/communityserver-discussions-components-files/908/ADCwDMA2.zip

    下面是一个显示执行时间的逻辑分析器快照。 信号 PD2在 CPU 空闲时为高电平、在计算平均值时为低电平。 在计算 其中一个 ADC0缓冲器的平均值时、PD3为高电平。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bob
    感谢您的努力。
    您的建议对我帮助很大。
    我无法出于任何原因使用 DMA。
    但根据您的建议、我使用单个计时器触发器、通过两个 ADC 模块获得450kHz 的采样频率。

    再次感谢。

    此致、
    Namha Lee