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**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1202596/msp430fr2433-read-adc-conversion-result

器件型号:MSP430FR2433

大家好

我正在处理的一个项目需要收集所有 ADC 转换结果、具体代码如下所示

#include

unsigned int ADC_result;

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止 WDT

//配置 GPIO
P1DIR |= BIT0;//将 P1.0/LED 设置为输出方向
P1OUT &=~BIT0;// P1.0 LED 关闭

//配置 ADC A1引脚
SYSCFG2 |= ADCPCTL1;

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

//配置 ADC10
ADCCTL0 |= ADCSHT_2 | ADCON;// ADCON、S&H 时钟
ADCCTL1 |= ADCSHP;// ADCCLK = MODOSC;采样计时器
ADCCTL2 |= ADCRES;// 10位转换结果
ADCIE |= ADCIE0;//启用 ADC 转换完成中断
ADCMCTL0 |= ADCINCH_1 | ADCSREF_1;// A1 ADC 输入选择;Vref=1.5V

//配置参考
PMMCTL0_H = PMMPW_H;//解锁 PMM 寄存器
PMMCTL2 |= INTREFEN;//启用内部基准
__delay_cycles (400);//基准稳定延迟

while (1)

ADCCTL0 |= ADCENC | ADCSC;//采样和转换开始
__ bis_SR_register (LPM0_bits | GIE);// LPM0、ADC_ISR 将强制退出
如果(ADC_Result < 0x155)
P1OUT &=~BIT0;//清除 P1.0 LED 关闭
方案
P1OUT |= BIT0;//将 P1.0 LED 设置为打开
__ delay_cycles (5000);
}
}

// ADC 中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=ADC_vector
__interrupt void ADC_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (ADC_vector))) ADC_ISR (void)
#else
#错误编译器不受支持!
#endif

开关(__ even_in_range (ADCIV、ADCIV_ADCIFG))

情况 ADCIV_NONE:
中断;
案例 ADCIV_ADCOVIFG:
中断;
案例 ADCIV_ADCTOVIFG:
中断;
案例 ADCIV_ADCHIIFG:
中断;
案例 ADCIV_ADCLOIFG:
中断;
案例 ADCIV_ADCINIFG:
中断;
案例 ADCIV_ADCIFG:
ADC_RESULT = ADCMEM0;
__ bic_SR_register_on_exit (LPM0_bits);//从 LPM0清除 CPUOFF 位
中断;
默认值:
中断;
}
}

我尝试读取 ADC_RESULT 的值、并将其添加到监视窗口、在此处设置一个断点。 我还将断点属性设置为"刷新所有窗口"、以便能够对数据进行恒定的更改视图。 但是、即使放入长周期信号波、每个周期只能获取大约15个样本、这意味着采样频率极低。 我确认整个采样和转换过程需要非常短的时间、比如50us、所以我不知道它有什么问题。  

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

    在通常为1MHz 的默认 MCLK 下、即5ms 的延迟。 或使用代码、最大采样率为200SPS。

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

    我添加了延迟注释、但结果没有太大变化。 我添加了一个5s 周期正弦波、但每5s 仅获取15个样本、这意味着采样频率约为2Hz

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

    使用监视窗口可能会减慢速度。 尝试在 ISR 中切换 GPIO、然后使用示波器观察。

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

    我不清楚您是如何对采样进行计数。 调试器入侵通常非常慢、并会影响程序的计时。

    我在 while (1)循环中添加了一个计数器、等待了大约10秒、看到大约2000个计数、听起来确实是200sps。

    在不入侵的情况下收集样本的一种方法是通过 UART。 如果你这样做、你可能需要返回到你的计时器触发器(在另一个线程中)。