大家好
我正在处理的一个项目需要收集所有 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、所以我不知道它有什么问题。