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.

[参考译文] CCS/MSP430FR2311:ADC 仅读取通道 A3 (P1.3 OA0O)和 A0 (P1.0)中的一个、单次转换模式

Guru**** 1728770 points
Other Parts Discussed in Thread: MSP430FR2311, LMT86
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/686779/ccs-msp430fr2311-adc-reading-only-one-of-channels-a3-p1-3-oa0o-and-a0-p1-0-single-conversion-mode

器件型号:MSP430FR2311
主题中讨论的其他器件: LMT86

工具/软件:Code Composer Studio

大家好、

我尝试在单通道模式下读取两个通道(一个一个一个一个一个)(我不需要一次转换所有通道)。 问题是、似乎只有一个通道被读取(首先启动的通道)、如果我在其中插入3V3、读数 大约为2045。 假设、如果我首先在通道 A0上启动转换、那么只有 A0将一直工作到结束

我将以这种方式配置 ADC:

void configADC (void)
{
//配置 ADC A0引脚
P1SEL0 |= BIT0;
P1SEL1 |= BIT0;

//配置 ADC10
ADCCTL0 &=~ADCENC; //禁用 ADC
ADCCTL0 = ADCSHT_2 | ADCON; // ADCON、S&H=16 ADC 时钟
ADCCTL1 = ADCSHP | ADCCONSEQ_0; // ADCCLK = MODOSC;采样定时器
ADCCTL2 = ADCRES; // 10位转换结果
ADCIE = ADCIE0; //启用 ADC 转换完成中断
} 

我尝试以这种方式读取它:

#define A3 true
#define A0 false
uint16_t g_adcResult

uint16_t analogRead (bool channel)
{
IF (通道)
ADCMCTL0 = ADCINCH_3 | ADCSREF_0; // A3 ADC 输入选择= OA 输出 Vref = DVCC

其他
ADCMCTL0 = ADCINCH_0 | ADCSREF_0; // A0 ADC 输入选择 Vref = DVCC

ADCCTL0 |= ADCENC | ADCSC; //采样和转换开始

_bis_SR_register (LPM0_bits);//输入 LPM0、ADC_ISR 将强制退出

返回 g_adcResult;
}

void main (void)
{
uint16_t adcTempTerm = 0;

//一些代码...

adcTempTerm = analogRead (A0)+ analogRead (A3);
} 

ADC ISR:

#pragma vector=ADC_vector
__interrupt void ADC_ISR (void)
{
switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))
{
案例 ADCIV_NONE:
中断;

ADCIV_ADCOVIFG 案例:
中断;

案例 ADCIV_ADCTOVIFG:
中断;

ADCIV_ADCHIIFG 案例:
中断;

ADCIV_ADCLOIFG 案例:
中断;

ADCIV_ADCINIFG 案例:
中断;

ADCIV_ADCIFG 案例:

G_adcResult = ADCMEM0;

_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);

中断;

默认值:
中断;
}
} 

我在尝试搜索有关如何正确设置单次转换的信息时遇到困难。 是否有办法实现我要做的事情? 请注意、我当前的程序只剩下48字节的内存。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据 SLAU45G 图20-23、ADCINCH 只能在 ADCENC=0时更改、但当您尝试切换通道时 ENC 仍然为1。 您需要自行清除它(发生时的单个指令)。

    此外、我还看到您通过 PSELx 向 ADC 提供 A0 (P1.0)的位置、但我看不到 A3 (P1.3)的设置。 这可以在相同的行/指令中完成。

    至于您的有趣阅读内容:您是否正在使用 Launchpad? 如果是、您是否移除了 J10 (P1.0)和 J8 (P1.3)上的跳线?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、不知怎么会错过它。 查看 SLAU45G 和各种 ADC 示例、这些示例似乎多次设置该位、而无需真正设置该位。

     现在、在我的代码中添加 ADCCTL0 &=~ADCENC 后、读数正确。

    uint16_t analogRead (bool channel)
    {
    ADCCTL0 &=~ADCENC;
    
    IF (通道)
    ADCMCTL0 = ADCOA; // A3 ADC 输入选择= OA 输出 Vref = DVCC
    
    其他
    ADCMCTL0 = ADCTS; // A0 ADC 输入选择= OA 输出 Vref = DVCC
    
    ADCCTL0 |= ADCENC | ADCSC; //采样和转换开始
    
    _bis_SR_register (LPM0_bits);//输入 LPM4、ADC_ISR 将强制退出
    
    返回 g_adcResult
    ;} 

    [引用用户="Bruce McKenney47378">此外、我看到您通过 PSELx 向 ADC 提供 A0 (P1.0)的位置、但我看不到 A3 (P1.3)的设置。 这可以在相同的行/指令中完成。[/quot]

    从数据表中、PSELx 同时配置 A3和 OA0O、因此当我配置运算放大器时、通道 A3就会被置位。 对我来说很奇怪、但引脚似乎支持"双"功能。

    [引用用户="Bruce McKenney47378">您的有趣阅读内容:您是否正在使用 Launchpad? 如果是、您是否移除了 J10 (P1.0)和 J8 (P1.3)上的跳线?

    我使用的是 MSP430FR2311 16引脚 PW 封装、由'FR5994 LP 编程。 "独立"版本的成本要低得多。 TI 不使用 PDIP 封装制造这些产品、这让人有点难过...

    我正在尝试在电烤箱中实现一些电子电路。 我有一个由变阻器、机械计时器驱动的模块、因此我将使用此 MSP、2004 LCD 模块、LMT86和热电偶(K 型)对其进行改进。

    再次感谢您的帮助。