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.

[参考译文] MSPM0G3106-Q1:ADC 配置问题

Guru**** 2665185 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1590943/mspm0g3106-q1-adc-configuration-issue

器件型号: MSPM0G3106-Q1
主题: SysConfig 中讨论的其他器件

尊敬的团队:

我已经尝试将 ADC 配置为在引脚 A1_0、A1_1 和 A1_2 处读取电压。

我已将引脚连接到示波器、在示波器上、我可以看到它们具有稳定的 2V 电压、但 ADC 值不是恒定的、在 0.2V 至 1.9V 之间振荡。

以下是我的配置、它无法按预期工作、甚至我尝试了 SDK 中的示例 ADC 代码、该代码使用了中断和计时器、其中我遇到了相同问题。

 

静态常量 DL_TimerA_ClockConfig gTIMER_SampleClockConfig ={
  .clockSel  = DL_TIMER_CLOCK_BUSCLK、
  divideRatio = DL_TIMER_CLOCK_Divide_1、
  .prescale  = 0U、
};

/*
 *计时器加载值(计数器从此处开始)的计算公式为 (timerPeriod * timerClockFreq)- 1
 * TIMER_Sample_INST_LOAD_VALUE =(0.0625ms * 80000000Hz)- 1
 */
静态常量 DL_TimerA_TimerConfig gTIMER_SampleTimerConfig ={
  .period  = TIMER_Sample_INST_LOAD_VALUE、
  .timerMode = DL_TIMER_TIMER_MODE_PERIOCY_UP、
  .startTimer = DL_TIMER_STOP、
};

SysConfig_weak void SYSCFG_DL_TIMER_Sample_init (void){

  DL_TimerA_setClockConfig (TIMER_Sample_INST、
    (DL_TimerA_ClockConfig *)&gTIMER_SampleClockConfig);

  DL_TimerA_initTimerMode (TIMER_Sample_INST、
    (DL_TimerA_TimerConfig *)&gTIMER_SampleTimerConfig);
  DL_TimerA_enableShadowFeatures (TIMER_Sample_INST);
  DL_TimerA_enableClock (TIMER_Sample_INST);

  DL_TimerA_enableEvent (TIMER_Sample_INST、DL_TIMERA_EVENT_ROUTE_1、(DL_TIMERA_EVENT_CC0_UP_EVENT |
    DL_TIMERA_EVENT_CC1_UP_EVENT);

  DL_TimerA_setPublisherChanID (TIMER_Sample_INST、DL_TIMERA_Publisher _INDEX_0、TIMER_Sample_INST_PUB_0_CH);

 

}

 

/* ADC0 初始化*/
静态常量 DL_ADC12_ClockConfig gADC1ClockConfig ={
  .clockSel   = DL_ADC12_clock_SYSOSC、
  divideRatio  = DL_ADC12_clock_divide_1、
  .freqRange   = DL_ADC12_clock_FREQ_RANGE_24_TO_32、
};
SysConfig_weak void SYSCFG_DL_ADC1_init (void)

  DL_ADC12_setClockConfig (ADC1_INST、(DL_ADC12_ClockConfig *)&gADC1ClockConfig);

  DL_ADC12_initSeqSample (ADC1_INST、
    DL_ADC12_REPEAT_MODE_ENABLED、DL_ADC12_SAMPLING_SOURCE_AUTO、DL_ADC12_TRIG_SRC_EVENT、
    DL_ADC12_SEQ_START_ADDR_00、DL_ADC12_SEQ_END_ADDR_02、DL_ADC12_SAMP_CONV_RES_12_BIT、
    DL_ADC12_SAMP_CONV_DATA_FORMAT_unsigned);
  DL_ADC12_configConversionMem (ADC1_INST、ADC1_ADCMEM_0、
    DL_ADC12_INPUT_CHAN_0、DL_ADC12_REFERENCE_VOLTAGE_VDDA、DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP1、DL_ADC12_AVERAING_MODE_DISABLED、
    DL_ADC12_BURN_OUT_SOURCE_DISABLED、DL_ADC12_TRIGGER_MODE_AUTO_NEXT、DL_ADC12_Windows_COMP_DISABLED);
  DL_ADC12_configConversionMem (ADC1_INST、ADC1_ADCMEM_1、
    DL_ADC12_INPUT_CHAN_1、DL_ADC12_REFERENCE_VOLTAGE_VDDA、DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0、DL_ADC12_AVERAING_MODE_DISABLED、
    DL_ADC12_BURN_OUT_SOURCE_DISABLED、DL_ADC12_TRIGGER_MODE_AUTO_NEXT、DL_ADC12_Windows_COMP_DISABLED);
  DL_ADC12_configConversionMem (ADC1_INST、ADC1_ADCMEM_2、
    DL_ADC12_INPUT_CHAN_2、DL_ADC12_REFERENCE_VOLTAGE_VDDA、DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0、DL_ADC12_AVERAING_MODE_DISABLED、
    DL_ADC12_BURN_OUT_SOURCE_DISABLED、DL_ADC12_TRIGGER_MODE_AUTO_NEXT、DL_ADC12_Windows_COMP_DISABLED);
  DL_ADC12_configHwAverage (ADC1_INST、DL_ADC12_HW_AVG_NUM_ACC_128、DL_ADC12_HW_AVG_DEN_DIV_BY_128);
  DL_ADC12_setSampleTime0 (ADC1_INST、80);
  DL_ADC12_setSampleTime1 (ADC1_INST、80);
  DL_ADC12_setSubscripberChanID (ADC1_INST、ADC1_INST_SUB_CH);
  DL_ADC12_enableConversions (ADC1_INST);
}

/*为 timer_Sample 定义*/
#define TIMER_Sample_INST                         (TIMA1)
#define TIMER_Sample_INST_IRQHandler               TIMA1_IRQHandler
#define TIMER_Sample_INST_INT_IRQN                (TIMA1_INT_IRQn)
#define TIMER_Sample_INST_LOAD_VALUE                   (1599U)
#define TIMER_Sample_INST_PUB_0_CH                      (2)

/*为 ADC1 定义*/
#define ADC1_INST                              ADC1
#define ADC1_INST_IRQHandler                   ADC1_IRQHandler
#define ADC1_INST_INT_IRQN                    (ADC1_INT_IRQn)
#define ADC1_ADCMEM_0                     DL_ADC12_MEM_IDX_0
#define ADC1_ADCMEM_0_REF             DL_ADC12_REFERENCE_VOLTAGE_VDDA
#define ADC1_ADCMEM_0_REF_VOLTAGE_V                      3.3
#define ADC1_ADCMEM_1                     DL_ADC12_MEM_IDX_1
#define ADC1_ADCMEM_1_REF             DL_ADC12_REFERENCE_VOLTAGE_VDDA
#define ADC1_ADCMEM_1_REF_VOLTAGE_V                      3.3
#define ADC1_ADCMEM_2                     DL_ADC12_MEM_IDX_2
#define ADC1_ADCMEM_2_REF             DL_ADC12_REFERENCE_VOLTAGE_VDDA
#define ADC1_ADCMEM_2_REF_VOLTAGE_V                      3.3
#define ADC1_INST_SUB_CH                           (2)
#define GPIO_ADC1_C7_PORT                          GPIOA
#define GPIO_ADC1_C7_PIN                      DL_GPIO_PIN_15
#define GPIO_ADC1_C3_PORT                          GPIOA
#define GPIO_ADC1_C3_PIN                      DL_GPIO_PIN_16
#define GPIO_ADC1_C2_PORT                          GPIOA
#define GPIO_ADC1_C2_PIN                      DL_GPIO_PIN_17  

 

 

这里的问题是什么、我每 2ms 读取一次 ADC、如下所示、这是不准确的

CHA = DL_ADC12_getMemResult (ADC1、DL_ADC12_MEM_IDX_0);
        CHB = DL_ADC12_getMemResult (ADC1、DL_ADC12_MEM_IDX_1);
        CHC = DL_ADC12_getMemResult (ADC1、DL_ADC12_MEM_IDX_2);

 

帮助我找到解决方案