请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP432P401R 您好,
我在前面发布了一个问题,关于尝试使用DMA快速获得多通道采样,但没有任何运气。 此后,我开始采用无DMA的多通道采样,并发现此解决方案足以达到~150ksps,足以对70kHz的波进行采样。 我需要将此信道设为>200ksps,这将使总转速达到600ksps,因为我需要三个信道。 这完全在设备的1Msps限制范围内,因此应该可以实现。
(在我当前的用例中,我基本上在1000个样本后停止采样,将数据转储到串行,然后重新开始采样。)
有人能建议如何更快地获得此采样吗? 我尝试使用DMA,速度更快,但无法使其在多个通道上工作。
/* DriverLib包括*/ #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/* Standard包括*/ #include <stdint.h> #include <stdbool.h> #include <stddef.h> /* statics */ static volatile int index =0; static volatile states1[1000] static int.int vues1[1000 /*停止监视程序*/ MAP_WDT_A_HoldTimer(); /*设置闪存等待状态*/ MAP_FlashCTL_setWaitState(FLASH_BANK0, 1); MAP_FlashCTL_setWaitState(FLASH_Bank1, 1); /*将DCO设置为48MHz */ MAP_PCM_setPowerState(PCM_AM_LDO_VCORE1); MAP_CS_setDCOCenteredFrequency (CS_DCO_Frequency_48); /*启用FPU以进行浮点操作*/ MAP_FPU_enableModule(); MAP_FPU_enableLazyStacking(); //![单采样模式配置] /*初始化ADC (MCLK/1/4)*/ MAP_ADC14_enableModule(); MAP_ADC14_INITModule (ADC_CLOCKSOURCE_MCLK,ADC_PREDIVIDER_1,ADC_DIVIDER_2,0); MAP_ADC14_setResolution (ADC_8位); /*配置GPIO (5.5 A0)*/ MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P5, GPIO GPIO第三模块功能); MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P5, GPIO GPIO第三模块功能); MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P4, GPIO GPIO第三模块功能); /*配置ADC内存*/ MAP_ADC14_configureMultiSequenceMode (ADC_MEM0,ADC_MEM2,TRUE); MAP_ADC14_configureConversionMemory (ADC_MEM0,ADC_VREFPOS_AVCC_VREFNEG_VSS, ADC_INPUT_A0,FALSE); MAP_ADC14_configureConversionMemory (ADC_MEM1,ADC_VREFPOS_AVCC_VREFNEG_VSS, ADC_INPUT_A1,FALSE); MAP_ADC14_configureConversionMemory (ADC_MEM2,ADC_VREFPOS_AVCC_VREFNEG_VSS, ADC_INPUT_A10,FALSE); /*配置采样计时器*/ MAP_ADC14_enableSampleTimer(ADC_AUTOMATICAL_ITED); /*启用/切换转换*/ MAP_ADC14_enableConversion(); MAP_ADC14_ToggleConversionTrigger(); /*启用中断*/ MAP_ADC14_enableInterrupt (ADC_INT0); MAP_Interrupt_enableInterrupt (INT_ADC14); MAP_Interrupt_enableMaster(); 同时(1) { MAP_PCM_GotoLPM0(); } }/* ADC中断处理程序。 只要 ADC_MEM0的转换*完成,就会调用该处理程序。 */ void ADC14_IRQHandler (void) { UINT64_t status = MAP_ADC14_getEnabledInterruptStatus(); MAP_ADC14_clearInterruptFlag (状态); IF (ADC_INT0和状态) { //NB:getMultiSequenceResult较慢 value1[index]= MAP_ADC14_getResult(ADC_MEM0); value2[index]= MAP_ADC14_getResult (ADC_MEM1); value3[index+]= MAP_ADC14_getResult (ADC_MEM2); 如果(索引>= 1000){ 索引= 0; } } }