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.

[参考译文] MSP430FR4133:多 ADC 通道定序读数示例

Guru**** 2589265 points
Other Parts Discussed in Thread: MSP430FR4133

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/684196/msp430fr4133-multiple-adc-channel-sequencing-reading-probblem

器件型号:MSP430FR4133

您好,

 我正在处理 MSP430FR4133 Launchpad 的 ADC。 我尝试读取单通道在 ADC 通道 A8下工作正常、但当我尝试使用 通道序列 和重复通道序列模式使用 ADCSC 位作为 ADC 采样保持源时、它不工作。我为引脚 NO P8.0提供恒定的0.50 Vdc 分别为 A8和 A7的 P1.7提供了我粘贴在图像中的随机值。由于基准是1.5V 内部 ADC 和10位 ADC、因此我期望大约为342个十进制数。

电路配置为接地短路、常见0.5V 电压通过分压器和一个值为100欧姆和2.2uF 电容的低通 RC 滤波器直接馈入 ADC 通道。

我还尝试了一个分压器阵列、它的输出电压在0到1.25V 之间变化、步长为125mV、使用10步进旋转开关。在这种配置下、我使用单通道、当我获得84~85十进制计数的步长 我要切换旋转开关、它完全正确、但相同的配置不适用于多通道。

下面是我的代码

 

#include

int ADC_Result [2];//10位 ADC 转换结果数组
unsigned char i;

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止 WDT

//配置 ADC A7~8引脚
SYSCFG2 |= ADCPCTL8 | ADCPCTL7;

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

//配置 ADC
ADCCTL0 |= ADCSHT_2 | ADCMSC | ADCON;// 16ADCclks、MSC、ADC 打开
ADCCTL1 |= ADCSHP | ADCCONSEQ_1;// ADC 时钟 MODCLK、采样计时器、s/w 三态、单序列
ADCCTL2 |= ADCRES;//10位转换结果
ADCMCTL0 |= ADCINCH_8 | ADCSREF_1;// A7~8 (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 (GIE);
__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 (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)


其他

一----;

ADCIFG = 0;
中断;
默认值:
中断;

这是仅在采样代码更改中出现的相同代码、即我更改了 ADC 通道并删除了 LPM 模式

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Ajay
    首先、您可以帮助测试 FR4133代码示例"msp430fr413x_ADC10_10.c"吗?
    仔细查看提供的代码、我认为问题是(来自 UG)"一个通道序列被采样和转换一次。 序列从 ADCINCHx 位选择的通道开始、递减到通道 A0。 每个 ADC 结果都被写入 ADCMEM0。 该序列在通道 A0转换后停止"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MSC=1时的 CONSEQ=1 (或=3)是 FR2/4上的一项挑战、因为只有一个结果字且没有 DMA。

    SLAU45G 图20-11显示、如果 SHT=2 (16时钟采样)、则每次转换(16+12+1)=29个 ADC 时钟。 您应该预算至少30个 CPU 时钟来进入/退出 ISR、以及您在该处想要执行的任何操作(因此、在50个 CPU 时钟上猜猜一猜)。 MODCLK 以大约5倍的 CPU 时钟运行、因此每次转换在大约5个 CPU 时钟内运行。

    结果:在第二个样本覆盖前、您将无法成功获取第一个样本。 (即使 ADCCLK=SMCLK[1MHz]、也不会成功。) 我完全不相信 ADC10_10也能正常工作、尽管我还没有尝试过。

    也许最简单的解决方法是使用 ACLK (REFOCLK=32kHz)、尽管这相当慢。

    或者、使用 SMCLK 和 ADCDIV=7会使您(29*8)=232 CPU 时钟捕捉样本、如果您不执行任何其他操作、这应该足够了。

    请记住、ADC 将通过通道6-0持续递减计数、每次中断(每个时钟为232个 CPU)、这将需要一段时间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很好奇,所以我尝试了示例 msp430fr413x_ADC10_10.c,实际上它失败了--在这种情况下,症状是它从未退出 LPM,因为中断彼此过运行,"I"永远不会达到0。

    在该示例中、将 ADCSSEL_2 [SMCLK]与 ADCDIV_1 [/2]结合使用是足够的(只是勉强足够的)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include

    int ADC_Result [2]; // 8位 ADC 转换结果数组
    int i=1;
    int a=0;
    int main (空)

    WDTCTL = WDTPW | WDTHOLD; //停止 WDT

    //配置 ADC A7~8引脚
    SYSCFG2 |= ADCPCTL7 | ADCPCTL8;

    //配置 XT1振荡器
    P4SEL0 |= BIT1 | BIT2; // P4.2~P4.1:晶振引脚

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

    FRCTL0 = FRCTLPW | NWAITS0; //将 FRAM 等待状态数设置为0

    CSCTL4 = SELMS_DCOCLKDIV | SELA_XT1CLK; //设置 ACLK = XT1;MCLK = SMCLK = DCO

    操作

    CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1和 OFIFG); //测试振荡器故障标志


    //配置 ADC
    ADCCTL0 |= ADCSHT_2 | ADCMSC | ADCON; // 16ADCclks、MSC、ADC 打开
    ADCCTL1 |= ADCSHP | ADCCONSEQ_3|ADCSSEL_1; // ADC 时钟 ACLK、采样计时器、s/w 三态、重复通道序列
    ADCCTL2 |= ADCRES; // 10位转换结果
    ADCMCTL0 |= ADCINCH_8 | ADCSREF_1; // A7-8 (EOS);Vref=1.5V
    ADCIE |= ADCIE0; //启用 ADC 转换完成中断

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

    while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态
    ADCCTL0 |= ADCENC | ADCSC; //采样和转换开始
    _bis_SR_register (GIE);
    while (1)

    A++;
    if (a=10000)//仅用于检查
    A=0;



    // 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 (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)

    I = 1;

    其他

    一----;

    ADCIFG = 0;
    中断;
    默认值:
    中断;




    我已经使用 ACLK 的时钟32KHz 来检查此情况,并给出相同的结果,因为十进制等效计数从425,777,1023,764,722,719,764,612 (这是任意随机值)开始变化,而我希望输出计数大约为342个十进制数,相当于0.5V (参考1.5V)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,
    我的电路基本上是三个电阻器阵列网络(每个网络可生成0至1.25V 的电压阶跃为125mV)、其中的旋转开关控制输出电压、后跟截止频率为大约725Hz (100欧姆和2.2UF 电容)的低通滤波器 每个网络。
    这个电路我已经使用 MSP432 Launch Pad (14位 ADC)按顺序使用2个通道进行了测试、给出了1700的正确十进制阶跃、对应于125mV
    现在、MSP430FR4133与我在之前的答复中提到的问题相同。

    我在回复中粘贴了两个不同的代码   

    第一个是具有内部时钟5MHz 的单序列

    并使用32KHz 的 ACLK 重复该序列

    它们是否与 TI 的建议一样正确? 或者不是.if、那么我应该在代码中更改什么。

    此 MSP430FR4133 Launchpad 实际上是否支持多通道定序? 是否有人在 MSP430FR4133 LaunchPad 上执行此操作实际上是顺序通道采样? 如果是、请建议我应该进行哪些更改来处理顺序采样。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >请记住、ADC 将通过通道6-0持续递减计数、每次中断、
    您的索引方案将存储来自通道6-0的结果、而不是来自8-7的结果。 此处最简单的更改可能是将 ADC_Result 扩展到9个条目以全部存储、然后忽略前7个条目。

    *是否有人在 MSP430FR4133 LaunchPad 上执行此操作实际上是顺序通道采样?
    根据我之前的回答:我昨天晚上就这样做了。 我没有使用 CONSEQ=3、因为您询问了 CONSEQ=1、但原理是完全相同的。

    未经请求:
    >ADCIFG = 0;
    我建议您不要这样做、因为读取 ADCMEM0会清除 ADCIFG0。 它现在可能不会引起问题、但最终会导致问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    使用 TI 提供的代码仍然无法获得任何顺序采样结果。 但是、我需要手动切换通道并读取多个通道(因为它会降低输出速率的速度、但我的应用程序很慢、所以我可以使用它。

    """*是否有人在 MSP430FR4133 LaunchPad 上执行此操作实际上是顺序通道采样?
    根据我之前的回答:我昨天晚上就这样做了。 我没有使用 CONSEQ=3、因为您询问了 CONSEQ=1、但原理是完全相同的。"
    尊敬的 Bruce、您在处理顺序采样时表现良好、然后您可以粘贴您的应用(控制器)正常工作的代码。我已经尝试过 TI 提供的代码"msp430fr413x_ADC10_10.c"、它不起作用、我也通过将 ADC 寄存器设置为我的来制作代码 顺序采样应用(无 LPM 模式)、需要用户指南帮助、用户指南也不起作用(我粘贴了上面的所有代码)、因此如果您有工作代码、请粘贴该代码以检查我的代码在哪里出错以及您在示例代码中所做的更改。 或者、如果您愿意、也可以通过我的个人电子邮件 ID " ajaykhedekar1234@gmail.com "发送给我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我这里没有我的材料、但我想:

    >在该示例中、将 ADCSSEL_2 [SMCLK]与 ADCDIV_1 [/2]一起使用是足够的(勉强足够的)。

    [另请参阅 SLAU45G 表20-4]意味着我将 msp430fr413x_ADC10_10.c [SLAC625E]的第89行从以下内容更改为:

    > ADCCTL1 |= ADCSHP | ADCCONSEQ_1; // ADC 时钟 MODCLK、采样计时器、s/w trig、单序列

    为此:

    > ADCCTL1 |= ADCSHP | ADCCONSEQ_1_ADCSSEL_2|ADCDIV_1; // SMCLK/2,采样计时器,s/w trig,单序列

    您是否尝试过这样的操作? 我建议的其他更改如何?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好
    感谢您的评论、很抱歉迟到了!
    正确的是、msp430fr413x_ADC10_10.c 无法正常工作。 原因是 ADCMC.ADCCTL0多次设置采样转换。ADC 的中断处理花费的时间比 ADC 转换更长。 这会导致在 msp430fr413x_ADC10_10.c 代码示例中未正确处理 ADC 转换结果。
    我们将更新 ADC 重复模式代码示例。 我们建议不要在重复模式中使用多个采样和转换设置。