您好,
我想在一段时间内从两个ADC信道连续传输。 我已经阅读了Chris Sterzik在此处发布的解决方案
其中DMA来源两个连续信道,但仅来源一次。 我不知道该如何修改以允许连续转换。
谢谢!
Federico
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.
您好,
我想在一段时间内从两个ADC信道连续传输。 我已经阅读了Chris Sterzik在此处发布的解决方案
其中DMA来源两个连续信道,但仅来源一次。 我不知道该如何修改以允许连续转换。
谢谢!
Federico
您好,Chris:
感谢您的快速回答。
ADC配置为自动模式和脉冲。 我希望ADC同时对两个通道进行采样(理想情况下),并在给定时间内尽可能多地进行采样,这由外部信号和另一个中断决定。
我的理解是否正确,您的建议如下:
MAP_ADC14_configureMultiSequenceMode (ADC_MEM0,ADC_MEM1,TRUE); MAP_ADC14_configureConversionMemory (ADC_MEM0, ADC_VREFPOS_INTBUF_VREFNEG_VSS, ADC_INPUT_A1,FALSE); MAP_ADC14_configureConversionMemory (ADC_MEM1, ADC_VREFPOS_INTBUF_VREFNEG_VSS, ADC_INPUT_A2,FALSE); MAP_DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH7_ADC14, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH7_ADC14, UDMA_MODE_PINGPON,(void*)&ADC14->MEM[0], data_array1,sample_length); MAP_DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH7_ADC14, UDMA_MODE_PINGPON,(void*)&ADC14->MEM[1], data_array2,sample_length);
是否会在data_array1中保存第一个通道的sample_length个样本和data_array2中第二个通道的相同数量的样本?
我不需要在工作时访问这些值,我可以在收集完所有数据后访问这些值。 我n´t无法锁定UC以便采样和保存。
此致,
Federico
我正在尝试此代码,但它不起作用。
/******************************************************************************** **************** configuración ó n de ADC14 ********************** ***************** / // Inicializo el módulo Ω ADC ADC14_enableModule(); // Seteo el MCLK como reloj ADC14_INITModule (ADC_CLOCKSOURCE_MCLK,ADC_PREDIVIDER_1,ADC_DIVIDER_1, 0); //配置中心参数以使用户可以使用perif é rico GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P5, GPIO _PIN5 | GPIO _PIN4,GPIO _STILEARY_MODULE_FUNCTION); // Configuro conversión secuencial de memoria 0 y 1, en bucle MAP_ADC14_configureMultiSequenceMode (ADC_MEM0,ADC_MEM1,TRUE); // Asigno las Memorias a los canales del ADC,referencia AVCC ADC14_configureConversionMemory (ADC_MEM0,ADC_VREFPOS_AVCC_VREFNEG_VSS, ADC_INPUT_A0,FALSE); ADC14_configureConversionMemory (ADC_MEM1,ADC_VREFPOS_AVCC_VREFNEG_VSS, ADC_INPUT_A1,FALSE); // Cambia entre canales automáticamente í ADC14_enableSampleTimer(ADC_AUTOMATICATE_IREDATE); /******************************************************************************** / /******************************************************************************** ************************** configuración de DMA ********************** ***************** / dma_enableModule(); DMA_setControlBase(controlTable); MAP_DMA_赋 值通道(DMA_CH7_ADC14); DMA_disableChannelAttribute(DMA_CH7_ADC14, UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | udma_attr_high _priority | udma_attr_REQMAK); MAP_DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH7_ADC14, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH7_ADC14, UDMA_MODE_PINGPON,(void*)&ADC14->MEM[0], voltaje,sample_length); MAP_DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH7_ADC14, UDMA_MODE_PINGPON,(void*)&ADC14->MEM[1], corriente,sample_length); MAP_DMA_赋 值中断(DMA_INT1,7); MAP_Interrupt_enableInterrupt (INT_DMA_INT1); MAP_DMA_enableChannel(7); // Habilito interrupiones generales MAP_Interrupt_enableMaster(); // inicio conversión ADC14->CTL0 || ADC14_CTL0_ENC | ADC14_CTL0_SC;
如果我只在突发模式和基本模式下转换一个信道,则会正常工作。 我不知道该代码有什么问题。
谢谢
您好,
我发现DMA在多个通道中不工作的问题是错误ADC53,因为我在黑色启动板上测试。 我换了一个红色的(修订版 c)并且它有效。
但是,经过一些测试后,我意识到ADC的数据是错误的:首先它传输所有CH1,然后传输所有CH2,而我想要的是每个通道交替传输。
我使用的代码是:
// Inicializo el módulo Ω ADC MAP_ADC14_enableModule(); // Seteo el MCLK como reloj MAP_ADC14_INITModule (ADC_CLOCKSOURCE_MCLK,ADC_PREDIVIDER_1,ADC_DIVIDER_1, 0); //配置中心参数以使用户可以使用perif é rico MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P5, GPIO _PIN5 | GPIO _PIN4,GPIO _STILEARY_MODULE_FUNCTION); // Configuro conversión secuencial de memoria 0 y 1, en bucle MAP_ADC14_configureMultiSequenceMode (ADC_MEM0,ADC_MEM1,TRUE); // Asigno las Memorias a los canales del ADC,referencia AVCC 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); ADC14_setPowerMode (ADC_ULL_POWER_MODE); // Cambia entre canales automáticamente í MAP_ADC14_enableSampleTimer(ADC_AUTOMATICAL_ITED); /*MAP_ADC14_enableInterrupt (ADC_INT0); MAP_ADC14_enableInterrupt (ADC_INT1); //启用中断 MAP_Interrupt_enableInterrupt(INT_ADC14);*/ /******************************************************************************** / /******************************************************************************** ************************** configuración de DMA ********************** ***************** / MAP_DMA_enableModule(); MAP_DMA_setControlBase(controlTable); MAP_DMA_赋 值通道(DMA_CH7_ADC14); MAP_DMA_DisableChannelAttribute(DMA_CH7_ADC14, UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | udma_attr_high _priority | udma_attr_REQMAK); MAP_DMA_enableChannelAttribute(DMA_CH7_ADC14, UDMA_ATTR_USEBURST); MAP_DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH7_ADC14, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH7_ADC14, UDMA_MODE_PINGPON,(void*)&ADC14->MEM[0], voltaje,sample_length); MAP_DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH7_ADC14, UDMA_MODE_PINGPON,(void*)&ADC14->MEM[1], corriente,sample_length); MAP_DMA_赋 值中断(DMA_INT1,7); MAP_Interrupt_enableInterrupt (INT_DMA_INT1); MAP_DMA_enableChannel(7); // Habilito interrupiones generales MAP_Interrupt_enableMaster(); // inicio conversión MAP_ADC14_enableConversion(); MAP_ADC14_ToggleConversionTrigger();
谢谢!
Federico