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.

[参考译文] MSP430FR6989:ADC SHT/TIMER!!!

Guru**** 2555640 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/597348/msp430fr6989-adc-sht-timer

器件型号:MSP430FR6989

大家好!

我正在处理该器件的 ADC 部分。 目前、我在确定如何设置10秒的数据收集时间方面遇到了困难? 如何设置计时器?

我在用户指南中看到、" ADC12CTL0中的 ADC12SHT0x 和 ADC12SHT1x 位控制采样定时器的间隔 "、SAMPCON 高电平/低电平决定了时间。

时间基于什么? 它是否与其他计时器(微秒)相同?

我是否必须循环运行并为"for loop"设置计时器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否已成功使用 ADC 模块读取引脚上的电压? 我想知道您在代码开发方面有多远。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只是做了一些基本的事情、比如通过将模拟转换为数字来开启 LED。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我刚刚完成了这一过程。 我能够读取引脚中的电压
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所有这些都取决于您在10秒内想要采集的样本数。 这将决定我们如何解决这个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    让我们以每秒100个样本的速率执行它
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、它将是1000个样本。 您能给我展示一下用于计算它的示例过程吗? 谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sabin、

    这意味着您需要100个样本/秒 我解决这个问题的方法是设置一个具有100Hz 中断的定时器。 然后、在每次中断时、我都会对 ADC 进行采样并存储结果。

    NIMA Eskandari

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

    谢谢你。
    我一直在尝试将100Hz 模拟信号数字化10秒、其峰间电压范围为1Vpeak。 我已经为它编写了一些代码。 但我无法获得 ADC12MEM0或电阻器盒中的任何值。 我无法确定如何获得1V 峰间电压范围。 希望得到您的帮助

     //注:我 已在下一个注释中发布了该程序的更新版本


    #include
    #define STOP_WATCHDOG 0x5A80 //停止看门狗计时器
    #define ACLK 0x0100 // Timer_A ACLK 源
    #define Up 0x0010 // Timer_A 向上计数模式
    #define ENABLE_Pins 0xFFFE //需要使用输入和输出
    #define ADC12_P84 0x0007 //将输入 P8.4用于模拟输入
    #define ADC12_P92 0x000A //将输入 P9.2用于模拟输入
    void ADC_Setup (void);
    MAIN ()

    WDTCTL = STOP_DOU狗;//停止看门狗计时器
    PM5CTL0 = ENABLE_Pins;//需要使用输入和输出
    TA0CCR0 = 400;//设置 Timer_0的值
    TA0CTL = ACLK + UP;//为 Timer_0设置 ACLK、UP 模式
    TA0CCTL0 = CCIE;//为 Timer_0启用中断
    TA1CCR0 = 40000;//设置 Timer_1的值
    TA1CTL = ACLK + UP;//为 Timer_1设置 ACLK、UP 模式
    TA1CCTL0 = CCIE;//为 Timer_1启用中断
    ADC_Setup();
    ADC12IER0 = ADC12IE0;//启用 ADC 中断
    _BIS_SR (GIE);//激活中断





    #pragma vector=TIMER0_A0_VECTOR
    _interrupt void Timer_A (void)

    ADC12CTL0 = ADC12CTL0 | ADC12ENC;//重新启用转换
    ADC12CTL0 = ADC12CTL0 | ADC12SC;//开始下一次转换


    //
    //*配置模数转换器外设********
    //


    void ADC_Setup (void)

    #define ADC12_SHT_16 0x0200 //采样保持的16个时钟周期
    #define ADC12_ON 0x0010 //用于打开 ADC12外设
    #define ADC12_SHT_SRC_SEL 0x0200 //选择采样保持源
    #define ADC12_12位0x0020 //选择12位分辨率
    #define ADC12_P84 0x0007

    ADC12CTL0 = ADC12SHT02 | ADC12_ON;//开启,设置采样保持时间
    ADC12CTL1 = ADC12_SHT_SRC_SEL;//指定采样保持时钟源
    ADC12CTL2 = ADC12_12位;// 12位转换结果
    ADC12MCTL0 = ADC12_P84;// P8.4是模拟输入

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

    我一直在尝试将100Hz 模拟信号数字化10秒、其峰间电压范围为1Vpeak。 我已经为它编写了一些代码。 但我无法获得 ADC12MEM0或电阻器盒中的任何值。  




    #include
    #define STOP_WATCHDOG 0x5A80 //停止看门狗计时器
    #define ACLK 0x0100 // Timer_A ACLK 源
    #define Up 0x0010 // Timer_A 向上计数模式
    #define ENABLE_Pins 0xFFFE //需要使用输入和输出
    #define ADC12_P84 0x0007 //将输入 P8.4用于模拟输入
    #define ADC12_P92 0x000A //将输入 P9.2用于模拟输入
    void ADC_Setup (void);
    MAIN ()

    WDTCTL = STOP_WATCHDOG;
    PM5CTL0 = ENABLE_Pins;
    TA0CCR0 = 400;//对于100Hz=10ms、400计数为10ms
    TA0CTL = ACLK + UP;//为 Timer_0设置 ACLK、UP 模式
    TA0CCTL0 = CCIE;//为 Timer_0启用中断
    TA1CCR0 = 40000;//计数1秒
    TA1CTL = ACLK + UP;//为 Timer_1设置 ACLK、UP 模式
    TA1CCTL0 = CCIE;//为 Timer_1启用中断
    ADC_Setup();
    _BIS_SR (GIE);//激活中断









    int ADC_value = ADC12MEM0和0x0FFF;//更改为12位二进制
    save[i]=adc_value;//保存数据
    i++;

    ADC12CTL0 &=~(ADC12ENC);//*** (如果我重置它是否重要?) //禁用转换


    //此函数计算10秒,因为中断计时器 A1需要1秒
    //最后,如果它达到10秒,那么它将禁用所有中断
    #pragma vector=TIMER0_A1_vector
    _interrupt void Timer_B (void


    //这是其它正常程序的基本程序
    void ADC_Setup (void)

    #define ADC12_SHT_16 0x0200 //采样保持的16个时钟周期
    #define ADC12_ON 0x0010 //用于打开 ADC12外设
    #define ADC12_SHT_SRC_SEL 0x0200 //选择采样保持源
    #define ADC12_12位0x0020 //选择12位分辨率
    #define ADC12_P84 0x0007
    ADC12CTL0 =ADC12_SHT_16 | ADC12_ON;//打开,设置采样保持时间
    ADC12CTL1 = ADC12_SHT_SRC_SEL;//指定采样保持时钟源
    ADC12CTL2 = ADC12_12位;// 12位转换结果
    ADC12MCTL0 = ADC12_P84;// P8.4是模拟输入

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

    请允许我花些时间浏览您的代码并查找任何错误。

    谢谢、
    NIMA
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否需要为 ADC12添加其他中断功能?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*-版权所有-、BSD_EX
    *版权所有(c) 2014、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430FR69xx 演示- ADC12,样本 A1,AVcc 参考,如果 A1 > 0.5*AVcc,则设置 P1.0
    //
    说明:在 A1上以 AVcc 为基准生成单个样本。
    //软件设置 ADC12SC 来启动采样和转换- ADC12SC
    //在 EOC 上自动清除。 ADC12内部振荡器乘以采样(16x)
    //和转换。 在主循环中、MSP430在 LPM0中等待节能、直到 ADC12
    //转换完成、ADC12_ISR 将在主循环中强制从 LPM0中退出//
    恢复。 如果 A1 > 0.5*AVcc,P1.0置位,否则复位。
    还显示了对//和 ADC12中断的完全正确的处理。
    //
    //
    //////// MSP430FR6989
    // --------
    // /|\| XIN|-
    // || |
    // -|RST XOUT|-
    // | |
    // --|P1.1/A1 P1.0|->LED
    //
    William Goh
    // Texas Instruments Inc.
    // 2014年4月
    //使用 IAR 嵌入式工作平台 V5.60和 Code Composer Studio V6.0构建
    //*********
    #include 
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    
    // GPIO 设置
    P1OUT &=~BIT0; //清除 LED 以开始
    P1DIR |= BIT0; //将 P1.0/LED 设置为输出
    P1SEL1 |= BIT1; //为 ADC 配置 P1.1
    P1SEL0 |= BIT1;
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    //配置 ADC12
    ADC12CTL0 = ADC12SHT0_2 | ADC12ON; //采样时间、S&H=16、ADC12打开
    ADC12CTL1 = ADC12SHP; //使用采样计时器
    ADC12CTL2 |= ADC12RES_2; // 12位转换结果
    ADC12MCTL0 |= ADC12INCH_1; // A1 ADC 输入选择;Vref=AVCC
    ADC12IER0 |= ADC12IE0; //启用 ADC 转换完成中断
    
    while (1)
    {
    _delay_cycles (5000);
    ADC12CTL0 |= ADC12ENC | ADC12SC;//开始采样/转换
    
    _bis_SR_register (LPM0_bits | GIE);// LPM0、ADC12_ISR 将强制退出
    __no_operation(); //对于调试器
    }
    }
    
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)
    #elif defined (__GNU__)
    void __attribute__((interrupt (ADC12_vector)))) ADC12_ISR #else
    
    !
    #endif
    {
    switch (__evo_in_range (ADC12IV、ADC12IV_ADC12RDYIFG))
    {
    ADC12IV_NONE 案例: 中断;//向量0:无中断
    案例 ADC12IV_ADC12OVIFG:中断;//向量2:ADC12MEMx 溢出
    情况 ADC12IV_ADC12TOVIFG:中断;//矢量4:转换时间溢出
    ADC12IV_ADC12HIIFG 案例:中断;//向量6:ADC12BHI
    案例 ADC12IV_ADC12LOIFG:中断;//向量8:ADC12BLO
    ADC12IV_ADC12INIFG 案例:中断;//向量10:ADC12BIN
    ADC12IV_ADC12IFG0案例: //向量12:ADC12MEM0中断
    IF (ADC12MEM0 >= 0x7ff) // ADC12MEM0 = A1 > 0.5AVcc?
    P1OUT |= BIT0; // P1.0 = 1
    其他
    P1OUT &=~BIT0; // P1.0 = 0
    
    //从 LPM0退出并继续执行 main
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);
    中断;
    ADC12IV_ADC12IFG1案例:中断;//向量14:ADC12MEM1
    案例 ADC12IV_ADC12IFG2:break;//向量16:ADC12MEM2
    ADC12IV_ADC12IFG3案例:中断;//向量18:ADC12MEM3
    案例 ADC12IV_ADC12IFG4:中断;//向量20:ADC12MEM4
    ADC12IV_ADC12IFG5案例:中断;//向量22:ADC12MEM5
    案例 ADC12IV_ADC12IFG6:中断;//向量24:ADC12MEM6
    案例 ADC12IV_ADC12IFG7:中断;//向量26:ADC12MEM7
    ADC12IV_ADC12IFG8案例:中断;//向量28:ADC12MEM8
    案例 ADC12IV_ADC12IFG9:中断;//向量30:ADC12MEM9
    案例 ADC12IV_ADC12IFG10:中断;//向量32:ADC12MEM10
    案例 ADC12IV_ADC12IFG11:中断;//矢量34:ADC12MEM11
    ADC12IV_ADC12IFG12案例:中断;//矢量36:ADC12MEM12
    案例 ADC12IV_ADC12IFG13:中断;//向量38:ADC12MEM13
    案例 ADC12IV_ADC12IFG14:中断;//向量40:ADC12MEM14
    案例 ADC12IV_ADC12IFG15:中断;//向量42:ADC12MEM15
    ADC12IV_ADC12IFG16案例:中断;//矢量44:ADC12MEM16
    案例 ADC12IV_ADC12IFG17:中断;//向量46:ADC12MEM17
    案例 ADC12IV_ADC12IFG18:中断;//向量48:ADC12MEM18
    案例 ADC12IV_ADC12IFG19:中断;//向量50:ADC12MEM19
    ADC12IV_ADC12IFG20案例:中断;//向量52:ADC12MEM20
    案例 ADC12IV_ADC12IFG21:中断;//矢量54:ADC12MEM21
    案例 ADC12IV_ADC12IFG22:中断;//向量56:ADC12MEM22
    案例 ADC12IV_ADC12IFG23:中断;//矢量58:ADC12MEM3
    案例 ADC12IV_ADC12IFG24:中断;//向量60:ADC12MEM24
    案例 ADC12IV_ADC12IFG25:中断;//向量62:ADC12MEM25
    案例 ADC12IV_ADC12IFG26:中断;//向量64:ADC12MEM26
    案例 ADC12IV_ADC12IFG27:中断;//向量66:ADC12MEM27
    案例 ADC12IV_ADC12IFG28:中断;//向量68:ADC12MEM28
    ADC12IV_ADC12IFG29案例:中断;//向量70:ADC12MEM29
    案例 ADC12IV_ADC12IFG30:中断;//向量72:ADC12MEM30
    案例 ADC12IV_ADC12IFG31:中断;//向量74:ADC12MEM31
    案例 ADC12IV_ADC12RDYIFG:break;//向量76:ADC12RDY
    默认值:break;
    }
    }
    

    请查看此示例代码的结构。

    尝试运行此代码并使用指定的 Analog 引脚读取模拟电压。 请告诉我您获得了什么结果。