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.

[参考译文] MSP430F5438A:MSP430F5438A ADC 采样频率

Guru**** 2589265 points
Other Parts Discussed in Thread: MSP430F5438A, Z-STACK

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/687288/msp430f5438a-msp430f5438a-adc-sampling-frequency

器件型号:MSP430F5438A
Thread 中讨论的其他部件:MSPWAREZ-STACK

您好、先生、  
这是我的 ADC 配置

ADC12CTL0 = ADC12ON + ADC12SHT0_4 + ADC12MSC;        
ADC12CTL1 = ADC12SHP + ADC12CONSEQ_2 + ADC12SSEL_3 + ADC12DIV_4;

8位分辨率

ADC12SSEL_3 =(SMCLK 1.045Mhz)

ADC12SHT0_4 = 64个 ADC12CLK 周期

ADC12DIV_4 = 5分频

所以、

ADC 时钟频率= ADC 源时钟/预分频器 x 分频   器//  预分频器= 1.

                                     = 1.045Mhz / 1 x 5

                                     = 209Khz

ADC 采样频率 = ADC 时钟频率/((转换周期)+(SAMPLE_HOLD 周期)+ 1)

转换周期= ADC 分辨率+ 1 = 8+1 = 9

ADC 采样频率= 209000 /((9)+(64)+1)

                                            = 2824.324 = 2.8khz

ADC 采样频率= 2.8khz

SIR,请说明高于 ADC 采样频率计算是否正确? 如果不是、请传达正确的计算方式。

提前感谢

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

    您好、Shiva、

    感谢您发帖。 我看到您正在使用多个采样和转换(ADC12MSC)位来连续采样、并且您正在使用重复单通道模式(ADC12CONSEQ_2)。 我完成了您的计算、它们看起来是正确的、尽管我不确定分母中的额外1来自您的方程式(如下所示)。

    ADC 采样频率= 209000 /(9 + 64 + 1)

    也许、您假设同步时间(tsync)是最坏的情况、但由于您使用的是脉冲采样模式、此同步只会在第一个采样之前发生、而不会再次发生。 以下主题中对此进行了讨论、以供您参考。

    希望这对您有所帮助!

    此致、

    James

    MSP 客户应用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复、
    主席先生,请仔细研究经修改的公式,并让我知道其正确性。

    ADC 时钟频率= ADC 源时钟/预分频器 x 分频器//预分频器= 1.
    ADC 采样频率= ADC 时钟频率/((转换周期)+(SAMPLE_HOLD 周期))

    此外、
    我们是否可以更改 ADC 转换的 ACLK、MCLK、SMCLK 时钟频率?
    因为在 UCS 框图中、AClK、SMCLK、MCLK 有分频器、如果互换如何更改、这些分频器是软件可选的。

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

    您好!

    是的、您可以更改 ADC 模块的时钟源。 您可以在《MSP430x5xx 和 MSP430x6xx 系列用户指南 》(通读 ADC12_A 一章)中找到有关如何执行此操作的更多详细信息以及适用的寄存器。 此外、我 建议参考 CCS 中 Resource Explorer 中的代码示例。 您可能还需要安装 MSPWare。

    此致、

    James

    MSP 客户应用

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

    感谢您的回复
    主席先生,
    1) 1)我要问的是 ACLK = 32768、SMCLK = 1.048MHz、MCLK = 1.048MHz 的频率是固定的还是不固定的? 如果这些问题未得到解决、如何更改?
    2) 2)请检查以下代码

    #include "msp430f5438A.h"
    #include
    #include
    #include

    void adcfunction (void);
    void adcInit (void);
    char buffer[100];
    静态 Int16_t SavedADC12MEM1;
    浮点值;

    #pragma vector=ADC12_vector
    _interrupt void ADC12_ISR (void)

    SavedADC12MEM1 = ADC12MEM0;
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);

    void adcInit (void)

    P6SEL |= BIT7;
    P6DIR &=~BIT7;

    REFCTL0 |= REFMSTR+REFVSEL_2+REFON+REFTCOFF;
    ADC12CTL0 = ADC12ON + ADC12SHT0_2 + ADC12MSC;
    ADC12CTL1 = ADC12SHP + ADC12CONSEQ_2 + ADC12SSEL_3 + ADC12DIV_4;
    ADC12CTL2 = ADC12PDIV + ADC12RES_0;
    ADC12MCTL0 = ADC12INCH_7+ ADC12SREF_1;
    ADC12IE = BIT0;
    _DELAY_CYCLES (10);


    void adcfunction (void)(空)

    ADC12CTL0 |= ADC12ENC | ADC12SC;

    _bis_SR_register (LPM0_bits+GIE);
    __no_operation();


    int main (空)

    WDTCTL = WDTPW + WDTHOLD;
    内部电压;

    adcInit();
    while (1)


    adcfunction();
    电压= SavedADC12MEM1;
    P5SEL |= BIT6 + BIT7;
    UCA1CTL1 |= UCSWRST;
    UCA1CTL1 |= UCSSEL_SMCLK;
    UCA1BR0 = 9;
    UCA1BR1 = 0;

    UCA1MCTL = UCBRS_0;

    UCA1CTL1 &=~UCSWRST;
    int k=0;

    sprintf (buffer、"%d"、电压);

    while (buffer[k])

    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF =缓冲器[k++];

    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF ='\r\n';
    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF ='\n';

    _bis_SR_register (LPM0_bits+GIE);




    ADC 时钟频率=(ADC 时钟源)/((预分频器)*(分频器))
    ADC 采样频率=(ADC 时钟频率)/(转换周期+采样保持周期)

    ADC 时钟= 1048576/4*5 = 52428.8Hz
    ADC 采样频率= 52428.8 /(9+16)= 2097.152Hz = 2.097KHz

    i)我的采样频率计算是否正确?

    ii)在函数发生器中,我提供正弦波,因为输入的频率(0.1Hz 至1000Hz)幅值为1Vpp,我使用 Python 复制输出(正弦波)我能够在0.1Hz 至1Hz 但不超过1Hz 的频率下重现正弦波, 我已经达到1KHz、但没有使用、我无法重现输出。 我的代码中有任何错误、请通知我。 在 python 中、当我初始化 UART 时、我将以115200波特率读取 COM 端口。

    输入频率为1Hz 的第一个输出图片

    输入频率为10Hz 的第二个输出图片

    输入频率为0.1Hz 的第三个输出图片

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要回答您的问题:通过调整驱动它们的基础时钟、可以调整 MCLK/SMCLK/ACLK。 示例 msp430x54xA_UCS _2.c [SLAC375F]、例如显示了如何将 DCO 切换到12MHz。 请记住、这将影响 CPU (MCLK)和 UART (SMCLK)。

    我建议、不要尝试微调系统以间接调节 CONSEQ=2采样率、而是使用计时器对 ADC (ADC12SHS)和 CONSEQ=0进行定速。 这将使您能够独立于其他所有内容来调节采样率。

    我对采样率的算术运算符合您的要求。 不过、我怀疑您的 UART 会限制采样率。 在115200bps 时、理论上可以得到115200/10/5=2304sps、但这假设您保持 UART 完全处于繁忙状态、我怀疑您不是、这是由于 TXIFG 和 sprintf ()调用上的旋转所致。

    我不太确定应该在10Hz 布线中看到什么、因为与其他布线相比、细节要少得多。 一个观察结果是、0附近的读数需要较少的字符(3而不是5)、这可能是您在0附近获得的样本比在峰附近获得的样本更多的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复、

    实际上,我的高级职员使用了用于 MSP430f5438a 的 Z-stack,他使用了 ADC 并通过 UART 传输了数据,我看到的代码是 Genericapp.c 文件,他没有更改时钟,所以我认为 SMCLK 将是1.04mhz, 但在 UART 配置中,他在 BRO = 26、BR1 = 0的12MHz 时钟上使用了460800波特率,并且接收到的校正波形也是正确的。 这是如何实现的

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

    您能否将您的代码与其代码进行比较以了解有何不同?  在他之前的帖子中有很多好的反馈、我同意您不应尝试间接调整采样率。 关于 UART 波特率、 我不建议使用波特率为460800波特的1.04MHz DCO 频率-您需要更高的频率、而12MHz 是一个很好的开始位置。 您可以使用 USCI UART 波特率计算器、根据 DCO 频率(时钟速度)和所需波特率快速计算 USCI 分频器。

    我针对1.04MHz 和12MHz 执行了此操作。 请注意较低时钟速度的高位误差。

    此致、

    James

    MSP 客户应用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复、
    我能够计算 UART (USCIA1 (USB-UART))的波特率以及 ADC 的采样频率。 先生、请参阅我之前文章中的代码、其中有任何 ADC 初始化错误、也有 UART 和计算错误。请告诉我。

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

    您是否了解过我们的代码示例? 您可以在 CCS 内的 Resource Explorer 中找到它们。 这将为您提供更多帮助、而不是目前的任何帮助。 我建议从 ADC 代码示例开始、谨慎地逐步添加代码、而不是告诉您所有需要修复的问题。

    从根本上说、您不使用 ADC ISR。 您的 ADC 代码将在 while (1)循环中执行、因此采样的速度和频率取决于 CPU 频率以及在 adcfunction()之后 while (1)循环中执行的操作量。

    您一直在询问如何设置采样率、但您的代码中未使用该速率。 在 adcfunction()中,您将手动触发 ADC12ENC (启用转换)和 ADC12SC (开始转换)位。 相反、您应该设置采样率(如前所述)、然后只启用和启动一次转换。 然后,正如您在下面的代码示例中看到的那样,ADC ISR 以采样率触发,捕获数据,然后返回到 main()。

    在下面的'msp430x54xA_ADC12_07.c'代码示例中、有一个名为"Results[]"的数组、其中保存 ADC 转换。 首先、您可以增大该数组的大小以捕获更多数据、运行代码、然后通过调试器停止代码以查看捕获的结果。

    msp430x54xA_ADC12_07.c

    /*-版权所有-、BSD_EX
    *版权所有(c) 2012、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430F543xA 演示- ADC12_A、重复单通道转换
    //
    说明:此示例展示了如何
    使用“重复单通道”模式在//单通道上执行重复转换。 AVCC 用于
    //基准、并在通道 A0上执行重复转换。 每个
    //转换结果被移动到一个名为 results[]的8元素数组中。 通过
    //向通道 A0施加电压然后运行进行测试。 在
    //调试器中打开监视窗口并查看结果。 在索引增量行//中设置 Breakpoint1
    以查看数组值按顺序变化、而 Breakpoint 以查看
    指定 Num_for_results 的"Results[]"中的整个//转换结果数组。
    //这甚至可以在 LPM4模式下运行、因为 ADC 有自己的时钟(MODOSC)
    //
    // MSP430F5438A
    // --------
    // /|\| |
    // || |
    // -|RST |
    // | |
    // 输入电压-->|P6.0/A0 |
    // | |
    //
    
    //// M Morales
    // Texas Instruments Inc.
    // 2009年6月
    //使用 CCE 版本:3.2.2和 IAR Embedded Workbench 版本:4.11b
    //*********
    
    #include 
    
    #define Num_for_Results 8
    
    volatile unsigned int Results[Num_for_results];
    //在这方面需要是全局的
    //示例。 否则、会显示
    //编译器删除它是因为它
    //不用于任何操作。
    
    int main (void)
    {
    WDTCTL = WDTPW+WDTHOLD; //停止看门狗计时器
    
    P6SEL |= 0x01; //启用 A/D 通道 A0
    
    /*初始化 ADC12_A */
    ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC;//打开 ADC12,设置采样时间
    //设置多个采样转换
    ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2; //使用采样定时器、设置模式
    ADC12IE = 0x01; //启用 ADC12IFG.0
    ADC12CTL0 |= ADC12ENC; //启用转换
    ADC12CTL0 |= ADC12SC; //开始转换
    
    _bis_SR_register (LPM4_bits + GIE); //输入 LPM4,启用中断
    __NO_OPERATION (); //对于调试
    器}
    
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector=ADC12_vector
    __interrupt void ADC12ISR (void)
    #Elif defined (__GNU__)
    void __attribute__((interrupt (ADC12_vector))#void ADC12ISR
    
    (void))(void 编译器#12ISR (void)))不支持!错误!错误!
    #endif
    {
    static unsigned char index = 0;
    
    switch (__even_in_range (ADC12IV、34))
    {
    case 0:break; //向量0:无中断
    情况2:中断; //向量2:ADC 溢出
    情况4:中断; //向量4:ADC 时序溢出
    情况6: //向量6:ADC12IFG0
    结果[索引]= ADC12MEM0; //移动结果
    索引++; //将结果索引递增,取模;在此处设置 Breakpoint1
    
    如果(索引==8)
    索引= 0; //重置索引;在此处设置断点
    
    案例8:中断; //向量8:ADC12IFG1
    大小写10:break; //向量10:ADC12IFG2
    大小写12:break; //向量12:ADC12IFG3
    case 14:break; //向量14:ADC12IFG4
    情况16:中断; //向量16:ADC12IFG5
    情况18:中断; //向量18:ADC12IFG6
    案例20:中断; //向量20:ADC12IFG7
    case 22:break; //向量22:ADC12IFG8
    case 24:break; //向量24:ADC12IFG9
    大小写26:break; //向量26:ADC12IFG10
    case 28:break; //向量28:ADC12IFG11
    case 30:break; //向量30:ADC12IFG12
    大小写32:break; //向量32:ADC12IFG13
    case 34:break; //向量34:ADC12IFG14
    默认值:break;
    }
    } 

    此致、

    James

    MSP 客户应用