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.

[参考译文] MSP430FR2433:ADC 采样响应

Guru**** 2551110 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/893818/msp430fr2433-adc-sampling-response

器件型号:MSP430FR2433

是否有人在更高的采样频率下使用了10位 ADC? 我想知道在较高的频率下、响应是否是线性的。  

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

    您好、Kunal、

    ADC 采样值的线性度似乎与采样频率无关。

    也许您可以在10位 ADC 模式下进行一些测试。

    此致

    Johnson

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

    看来、一些 esp32的用户指出、它不会忠实地拾取高音频。 只是想知道原因、我将使用 MSP430进行大约80ksps 的音频采样

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

    您好、Kunal、

    当 该模块以80kps 的速率运行并返回更新时、我将测试采样值的线性度。

    此致

    Johnson

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

    您好、Kunal、

    我做了一些测试,并将一些来自我身边的数据作为您的参考:

    测试环境:

    VREF:3.3V

    ADC:10位

    速度:80kps

    电压 0.6. 0.7. 0.8. 0.9. 1 1.1. 1.2. 1.3. 1.4. 1.5 1.6. 1.7. 1.8 1.9. 2. 2.1 2.2. 2.3. 2.4 2.5. 2.6. 2.7. 2.8. 2.9. 3.
    ADC 值 186. 215. 249. 277. 309. 344. 373. 405. 435 465 500 529 561. 591. 619 651. 684 716) 745-45 779 809) 840) 869) 901. 935.

    测试日期显示 该值的线性度很好、我没有发现任何问题。

    此致

    Johnson

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

    嗨、Johnson、您能分享您使用的确切代码吗?

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

    有我的测试代码作为您的参考:

    #include 
    
    void Software_Trim (); //获取最佳 DCOFTRIM 值
    #define MCLK_FREQ_MHz 的软件调整8. // MCLK = 8MHz
    unsigned int ADC_value = 0;
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    
    //配置 GPIO
    P1DIR |= BIT0; //将 P1.0设置为输出方向
    P1OUT &=~BIT0; //清除 P1.0
    
    //配置 ADC A1引脚
    SYSCFG2 |= ADCPCTL1;
    
    //配置 XT1振荡器
    P2SEL0 |= BIT0 | BIT1; // P2.0~P2.1:晶振引脚
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    _bis_SR_register (SCG0); //禁用 FLL
    CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
    CSCTL1 = DCOFTRIMEN | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
    CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
    _DELAY_CYCLES (3);
    _BIC_SR_register (SCG0); //启用 FLL
    Software_Trim (); //软件调整以获得最佳 DCOFTRIM 值
    
    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
    //默认 DCODIV 为 MCLK 和 SMCLK 源
    
    //配置 ADC
    ADCCTL0 |= ADCON | ADCMSC; // ADCON
    ADCCTL1 |= ADCSHS_2 | ADCCONSEQ_2; //重复单通道;TA1.1 TRIG 采样开始
    ADCCTL2 |= ADCRES; // 10位转换结果
    ADCMCTL0 |= ADCINCH_1 | ADCSREF_0; // A1 ADC 输入选择;Vref=1.5V
    ADCIE |= ADCIE0; //启用 ADC 转换完成中断
    
    //配置引用
    PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
    PMMCTL2 |= INTREFEN; //启用内部基准
    _DELAY_CYCLES (400); //基准趋稳延迟
    
    ADCCTL0 |= ADCENC; // ADC 使能
    
    
    // ADC 转换触发信号- TimerA1.1 (80KHz 导通周期)
    TA1CCR0 = 100-1; // PWM 周期
    TA1CCR1 = 50-1; // TA1.1 ADC 触发
    TA1CCTL1 = OUTMOD_4; // TA1CCR0切换
    TA1CTL = tassel__SMCLK | MC_1 | TACLR; // ACLK、向上计数模式
    
    _bis_SR_register (LPM0_bits | GIE); //输入带中断的 LPM3
    }
    
    // ADC 中断服务例程
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector=ADC_vector
    __interrupt void ADC_ISR (void)
    #Elif defined (__GCOMPILE__)
    void __attribute__(((nC_vector)#interrupt
    
    !void (nc)#inc Compiler (void)错误!
    #endif
    {
    switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))
    {
    案例 ADCIV_NONE:
    中断;
    ADCIV_ADCOVIFG 案例:
    中断;
    案例 ADCIV_ADCTOVIFG:
    中断;
    ADCIV_ADCHIIFG 案例:
    中断;
    ADCIV_ADCLOIFG 案例:
    中断;
    ADCIV_ADCINIFG 案例:
    中断;
    ADCIV_ADCIFG 案例:
    ADC_Value = ADCMEM0;
    // 如果(ADCMEM0 < 0x155) // ADCMEM = A0 < 0.5V?
    // P1OUT &=~BIT0; //清除 P1.0 LED 关闭
    // else
    // P1OUT |= BIT0; //将 P1.0 LED 设置为打开
    ADCIFG = 0;
    中断; //将 CPUOFF 位从0 (SR)清零
    默认值:
    中断;
    }
    }
    
    void Software_Trim ()
    {
    unsigned int oldDcotTap = 0xFFFF;
    unsigned int newDcoTap = 0xFFFF;
    unsigned int newDcoDelta = 0xFFFF;
    unsigned int bestDcoDelta = 0xFFFF;
    unsigned int csCtl0Copy = 0;
    unsigned int csCtl1Copy = 0;
    无符号 int csCtl0Read = 0;
    无符号 int csCtl1Read = 0;
    unsigned int dcoFreqTrim = 3;
    unsigned char endLoop = 0;
    
    操作
    {
    CSCTL0 = 0x100; // DCO 抽头= 256
    操作
    {
    CSCTL7 &=~DCOFFG; //清除 DCO 故障标志
    } while (CSCTL7 & DCOFFG); //测试 DCO 故障标志
    
    __DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
    //建议等待24个经过分频的 FLL 参考时钟周期
    while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));
    
    CSCCtl0Read = CSCTL0; //读取 CSCTL0
    CSCCtl1Read = CSCTL1; //读取 CSCTL1
    
    oldDcoTap = newDcoTap; //记录上次的 DCOTAP 值
    NewDcoTap = csCtl0Read & 0x01ff; //获取此次的 DCOTAP 值
    dcoFreqTrim =(csCtl1Read & 0x0070)>>4;//获取 DCOFTRIM 值
    
    if (newDcoTap < 256) // DCOTAP < 256
    {
    newDcoDelta = 256 - newDcoTap; // DCPTAP 和256之间的增量值
    if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
    endLoop = 1; //停止 while 循环
    其他
    {
    dcoFreqTrim --;
    CSCTL1 =(csCtl1Read &(~(DCOFTRIM0+DCOFTRIM1+DCOFTRIM2)))|(dcoFreqTrim <4);
    }
    }
    其他 // DCOTAP >= 256
    {
    newDcoDelta = newDcoTap - 256; // DCPTAP 和256之间的增量值
    if (oldDcoTap < 256) // DCOTAP 交叉256
    endLoop = 1; //停止 while 循环
    其他
    {
    dcoFreqTrim++;
    CSCTL1 =(csCtl1Read &(~(DCOFTRIM0+DCOFTRIM1+DCOFTRIM2)))|(dcoFreqTrim <4);
    }
    }
    
    if (newDcoDelta < bestDcoDelta) //记录最接近256的 DCOTAP
    {
    csCtl0Copy = csCtl0Read;
    csCtl1Copy = csCtl1Read;
    bestDcoDelta = newDcoDelta;
    }
    
    }while (endLoop =0); //轮询直至 endLoop = 1
    
    CSCTL0 = csCtl0Copy; //重新加载锁定的 DCOTAP
    CSCTL1 = csCtl1Copy; //重新加载锁定的 DCOFTRIM
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到 FLL 被锁定
    }
    

    此致

    Johnson