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.

[参考译文] MSP432P401R:快速多通道采样MSP432

Guru**** 2584395 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/615143/msp432p401r-fast-multichannel-sampling-msp432

部件号: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;
}
}
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Julian,
    提高速度的一种方法是从SRAM而不是闪存运行IRQ。 这可以在CCS中完成,但使用ramfunc属性:

    __attribute___((ramfunc)
    void ADC14_IRQHandler (void)

    UINT64_t状态;
    //打开LED

    //在12kHz频率下切换,类似于6kHz时钟
    //MAP_GPIO设置输出高引脚(GPIO_PORT_P1, GPIO_PIN0);
    P1OUT |= BIT0;

    状态= ADC14_getEnabledInterruptStatus();
    MAP_ADC14_clearInterruptFlag (状态);
    IF (状态和ADC_INT8)

    MAP_ADC14_DisableConversion();
    /*在DMA通道0上强制软件传输*/
    MAP_DMA_requestSoftwareTransfer(0);
    /*在DMA通道1上强制软件传输*/
    MAP_DMA_requestSoftwareTransfer(1);
    /*在DMA通道2上强制软件传输*/
    MAP_DMA_requestSoftwareTransfer(2);

    MAP_ADC14_enableConversion();
    }
    //map_gPIO_setOutputLowOnPin (gPIO_PORT_P1,gPIO_PIN0);
    P1OUT &=~BIT0;
    }

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

    您的意思是简单地在IRQHandler前面添加__attribute___((ramfunc),还是实施DMA软件传输? 我已经很难尝试后者;但简单地插入__attribute__((ramfunc))似乎不会改变采样频率。

    朱利安
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Julian,
    将函数置于SRAM中将允许在48Mhz时执行,而无需等待。 如果IRQ花费的时间过长,您将错过ADC中断,并且可能会遇到这样的情况:您只能看到每隔一个或每隔三个转换。 我尝试在这里提供一个'更快'的实施:

    e2e.ti.com/.../226.703万

    此致,
    Chris