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.

[参考译文] MSP430FR2311:读取多个 ADC 输入。

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/587012/msp430fr2311-reading-multiple-adc-inputs

器件型号:MSP430FR2311

大家好、我有一个来自 Resource Explorer 的示例代码、它在其中读取2个引脚上的 ADC 值。 引脚1.0、1.1并将 ADC 值存储在 ADC_Result Array 中。 如果我将所有2个端口插入3.3V、我会得到255、这是3.3V 时的8位转换结果、但我希望得到10位结果。 如何更改?

#include 

unsigned char adc_result[2]; // 8位 ADC 转换结果数组
unsigned char i;

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT

//配置 ADC A0~2引脚
P1SEL0 |= BIT0 + BIT1;
P1SEL1 |= BIT0 + BIT1;

//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

//配置 ADC
ADCCTL0 |= ADCSHT_2 | ADCMSC | ADCON; // 16ADCclks、MSC、ADC 打开
ADCCTL1 |= ADCSHP | ADCCONSEQ_1 | ADCSSEL_1; // ADC 时钟 ACLK、采样计时器、s/w trig、单序列
ADCCTL2 |= ADCRES_1; //10位转换结果
ADCMCTL0 |= ADCINCH_1 | ADCSREF_1; // A0~2 (EOS);Vref=1.5V
ADCIE |= ADCIE0; //启用 ADC 转换完成中断

//配置引用
PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
PMMCTL2 |= INTREFEN; //启用内部基准
_DELAY_CYCLES (400); //基准趋稳延迟
__no_operation();

while (1)
{
I = 1;
while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态
ADCCTL0 |= ADCENC | ADCSC; //采样和转换开始
_bis_SR_register (LPM0_bits | GIE); //输入带中断的 LPM0
__no_operation(); //仅用于调试
_delay_cycles (5000);
__no_operation();
}
}

// ADC 中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=adc_vector
__interrupt void adc_isr (void)
#elif defined (__GNU__)
void __attribute__((interrupt (adc_vector))))) adc_isr
#else error
编译器#void (void)!
#endif
{
switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))
{
案例 ADCIV_NONE:
中断;
ADCIV_ADCOVIFG 案例:
中断;
案例 ADCIV_ADCTOVIFG:
中断;
ADCIV_ADCHIIFG 案例:
中断;
ADCIV_ADCLOIFG 案例:
中断;
ADCIV_ADCINIFG 案例:
中断;
ADCIV_ADCIFG 案例:
ADC_RESULSE[i]= ADCMEM0;
if (i ==0)
{
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS); //存在 LPM0
}
其他
{
i--;
}
中断;
默认值:
中断;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您将把10位结果放入一个字符中。 将其设为 uint16_t
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答。 我的另一个问题是如何将 ADC 的基准设置为3.3V、因为现在它显示的是针对诸如2.9的高值的1023、但这些值不是3.3V。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您必须为基准设置正确的寄存器。 我不知道这个处理器。 您需要查看数据表。

    我强烈建议您切换到 driverlib。 它使事情变得简单得多。

    ETA:

    您需要更改此行:

    PMMCTL2 |= INTREFEN;

    VCC 作为基准的任何值。