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.

MSPM0L1306-Q1: MSPM0L1306-Q1的ADC初始化代码

Part Number: MSPM0L1306-Q1
Other Parts Discussed in Thread: SYSCONFIG

 用MSPM0L1306-Q1 (VSSOP 28封装)做了一个板子,现在可以开机和运行LED闪烁程序。

现在在用TI SDK包里面的 ti_msp_dl_config.c里面的热敏电阻检测的ADC代码去做,但是读ADC一直都是0,请问可以发一个ADC初始化的完整代码吗? 比如热敏电阻检测的ADC代码,单次转换然后去读ADC的值,就是这些的代码例子,麻烦了。谢谢。

  • 下面是我的ADC初始化代码,还请麻烦看一下哪里有错误,是从A4/PA22(VSSOP28 的25 PIN)做温度电阻采样,或者缺了什么代码,谢谢。

    NVIC_EnableIRQ(ADC_INST_INT_IRQN);

    DL_OPA_reset(THERMISTOR_OPA_INST);

    DL_ADC12_reset(ADC_INST);

    DL_OPA_enablePower(THERMISTOR_OPA_INST);

    DL_ADC12_enablePower(ADC_INST);

    thermistor_OPA_init();

    thermistor_TIMER_ADC_init();

    void thermistor_OPA_init(void)
    {
    DL_OPA_disableRailToRailInput(THERMISTOR_OPA_INST);
    DL_OPA_setGainBandwidth(THERMISTOR_OPA_INST, DL_OPA_GBW_HIGH);
    DL_OPA_init(
    THERMISTOR_OPA_INST, (DL_OPA_Config *) &gTHERMISTOR_OPA_INSTConfig0);
    DL_OPA_enable(THERMISTOR_OPA_INST);
    }

    void thermistor_ADC_init(void)
    {
    DL_ADC12_setClockConfig(
    ADC_INST, (DL_ADC12_ClockConfig *) &gADC_INSTClockConfig);

    /* Repeatedly sample a particular channel */
    DL_ADC12_initSingleSample(ADC_INST, DL_ADC12_REPEAT_MODE_ENABLED,
    DL_ADC12_SAMPLING_SOURCE_AUTO, DL_ADC12_TRIG_SRC_EVENT,
    DL_ADC12_SAMP_CONV_RES_12_BIT,
    DL_ADC12_SAMP_CONV_DATA_FORMAT_UNSIGNED);

    DL_ADC12_configConversionMem(ADC_INST, DL_ADC12_MEM_IDX_0,
    DL_ADC12_INPUT_CHAN_4, DL_ADC12_REFERENCE_VOLTAGE_VDDA,
    DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED,
    DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_TRIGGER_NEXT,
    DL_ADC12_WINDOWS_COMP_MODE_DISABLED);

    /* 26 / 8MHz (of the sample clock, SYSOSC / 4) = 3.25us sampling period */
    DL_ADC12_setSampleTime0(ADC_INST, 26);

    /* Disable automatic power down mode to get non-zero ADC result */
    DL_ADC12_setPowerDownMode(ADC_INST, DL_ADC12_POWER_DOWN_MODE_MANUAL);

    DL_ADC12_clearInterruptStatus(
    ADC_INST, DL_ADC12_INTERRUPT_MEM0_RESULT_LOADED);
    DL_ADC12_enableInterrupt(ADC_INST, DL_ADC12_INTERRUPT_MEM0_RESULT_LOADED);

    /* Set subscriber channel for the timer */
    DL_ADC12_setSubscriberChanID(ADC_INST, 1);

    DL_ADC12_enableConversions(ADC_INST);
    }

    下面是while(1)里面的单次读ADC代码

    DL_ADC12_startConversion(ADC_INST);

    gAdcResult = DL_ADC12_getMemResult(ADC_INST, DL_ADC12_MEM_IDX_0);

    DL_ADC12_enableConversions(ADC_INST);

    麻烦看看上面的ADC初始化和读的代码是否有问题,非常的谢谢!

  • Hello Shine,

    1). 我看到您这周的问题都集中在外设的初始化代码方面,最好的办法是下载我们的Sysconfig, 直接图形化配置您所需要的外设,然后Sysconfig可以生成.c和.h文件,里面会显示您所需要的外设初始化代码。但是我记得您说您的电脑是32位的,无法安装Sysconfig。但是没有关系,我们有在线版本的Sysconfig,您可以访问这个网址并使用其中online Sysconfig:TI Developer Zone。您可以图形化配置您所需要的外设之后,可以找到.c 和.h文件,在其中找到您所需要的初始化代码。在右上角有一个类似芯片的图案,旁边有一个左右箭头的图案,点击它您就可以找到Sysconfig生成的.h和.c配置文件。

    2). 关于ADC单次转换的使用代码 请参考SDK中的adc12_single_conversion。以及您的这个初始化代码中有OPA,说明也用到了OPA。我觉得您的意思应该是热敏电阻接在了OPA的输入处,然后OPA输出连接ADC,由ADC来采样。如果是这样的话,PA22是ADC的输入没错,但它不是OPA的输入,如果您初始化了OPA,但实际还是直接在ADC的输入处接了热敏电阻,可能会导致因为模拟信号没有经过放大,太弱而无法被ADC正确采样。具体每一个GPIO的function,即可以作为哪个外设的输出或者输入口,请参考芯片的datasheet.

    3). 如果您使用的OPA和ADC的配合使用,他们在内部的连接方式以及注意事项和使用方法,请参照我们的user guide进行学习。同时OPA+ADC的使用的example code在我们的SDK中也可以找到。如果您只是单纯使用ADC的话,请检查您的初始化配置到底使用了哪些外设。而每个外设的初始化代码请参考1)来获取。

    4). 我在SDK中没有找到明确说明是对热敏电阻进行采样且使用了OPA和ADC的示例代码,如果方便的话,可以分享下您使用的example code的名称以及他在SDK中的具体位置。

    5). L1306芯片的user guide和datasheet都可以从Ti.com进行下载使用。通过这两个手册和online 版的Sysconfig您几乎可以得到任何您想要使用的外设或者外设搭配的初始化代码。

    Best Regards,

    Janz Bai 

  • 好的,我先试一下,谢谢您!

  • Ok you are welcome