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.

[参考译文] MSP430F5529:使用driverlib从ADC12读取-值总是很小,有时从不接收中断

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/653161/msp430f5529-reading-from-adc12-with-driverlib---always-small-value-and-sometimes-never-receives-interrupt

部件号:MSP430F5529

你(们)好

我是MSP430系列的新成员,希望能够为我提供任何帮助。

我正在尝试从板载ADC中读取。 但是我有两个问题:

1.对于某些通道值(在switch语句中),不调用中断,因此处理器卡在while循环中等待中断。 (我知道我需要添加代码以使循环超时)

2.对于调用中断的通道值,当我得到结果时,它总是一个小于15的小值。

下面是一些代码(主要基于DriverLib用户指南中的示例代码:

在main()顶部调用的主init函数中

//使用ADC12的内置振荡器初始化ADC12
ADC12_a_init (ADC12_a_base,
ADC12_A_SAMPLEHOLDSOURCE_SC,
ADC12_A_CLOCKSOURCE_ADC12OSC,
//ADC12_A_CLOCKDIVIDEBY_1);
ADC12_A_CLOCKDIVIDER_1); 

我从ADC读取的函数

uINT16_t READ_ANALOG (int channel){
//打开ADC12
ADC12_a_enable (ADC12_a_base);

//将采样计时器设置为采样和保持16个时钟周期
ADC12_A_setupSamplingTimer(ADC12_a_base,
ADC12_A_CYCLEHOLD_64_CYCLES,
ADC12_A_CYCLEHOLD_4_CYCLES,
0);

//使用指定的参考电压配置内存缓冲区的输入
ADC12_a_configureMemoryParam ={0};
Param.memoryBufferControlIndex = ADC12_a_memory_0 +通道;
param.inputSourceSelect = ADC12_a_input_A0 +通道;
Param.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_AVCC;
Param.NiverRefVoltageSourceSelect = ADC12_A_VREFNEG_AVSS;
Param.endOfSequence = ADC12_A_NOTENDOFSEQUENCER;
ADC12_A_configureMemory (ADC12_a_base,&param);

//开始单个转换,不重复或序列。
ADC12_a_startConversion(ADC12_a_base,
ADC12_A_MEMORY_0 +通道,
ADC12_A_SINGLECHANNEL);

//等待中断标志声明
//获取适当的中断ID,同样,如果参数是我们不使用的通道,则返回-1
开关(通道){
案例5:
while (!(ADC12_A_getInterruptStatus(ADC12_a_base, ADC12IFG5));
中断;
案例6:
while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG6));
中断;
案例7:
while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG7));
中断;
案例12:
while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG12));
中断;
案例13:
while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG13));
中断;
默认:
返回(-1);}


//获取值
UINT16_t data = ADC12_A_getResults (ADC12_a_base,ADC12_a_memory_0 + channel);

//禁用ADC
ADC12_a_disable (ADC12_a_base);

return(ddata);}

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

    感谢您使用MSP430,请在开始转换之前尝试清除中断吗?

    //启用内存缓冲区0中断
    ADC12_a_clearInterrupt (ADC12_a_base,
    ADC12IFG5);

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

    你(们)好

    感谢您的回复。 但是,它仍在while循环中挂起,等待中断。 还有其他想法吗?

    由于某些原因  ,READ_ANALOG (12)不会挂起(并返回一个值),而传递到该函数的其他信道会挂起。

    谢谢。

    以下是更新的代码

    uINT16_t READ_ANALOG (int channel){
    //打开ADC12
    ADC12_a_enable (ADC12_a_base);
    
    //将采样计时器设置为采样和保持16个时钟周期
    ADC12_A_setupSamplingTimer(ADC12_a_base,
    ADC12_A_CYCLEHOLD_64_CYCLES,
    ADC12_A_CYCLEHOLD_4_CYCLES,
    //假);
    0);
    
    //使用指定的参考电压配置内存缓冲区的输入
    ADC12_a_configureMemoryParam ={0};
    Param.memoryBufferControlIndex = ADC12_a_memory_0 +通道;
    param.inputSourceSelect = ADC12_a_input_A0 +通道;
    Param.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_AVCC;
    Param.NiverRefVoltageSourceSelect = ADC12_A_VREFNEG_AVSS;
    Param.endOfSequence = ADC12_A_NOTENDOFSEQUENCER;
    ADC12_A_configureMemory (ADC12_a_base,&param);
    
    开关(通道){
    案例4:
    ADC12_a_clearInterrupt (ADC12_a_base,ADC12IFG4);
    中断;
    案例5:
    ADC12_a_clearInterrupt (ADC12_a_base,ADC12IFG5);
    中断;
    案例14:
    ADC12_a_clearInterrupt (ADC12_a_base,ADC12IFG14);
    中断;
    案例15:
    ADC12_a_clearInterrupt (ADC12_a_base,ADC12IFG15);
    中断;
    默认:
    return(0);
    }
    
    
    
    
    //开始单个转换,不重复或序列。
    ADC12_a_startConversion(ADC12_a_base,
    ADC12_A_MEMORY_0 +通道,
    ADC12_A_SINGLECHANNEL);
    
    //等待中断标志声明
    //while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG0));
    //获取适当的中断ID,同样,如果参数是我们不使用的通道,则返回-1
    开关(通道){
    案例4:
    while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG4));
    中断;
    案例5:
    while (!(ADC12_A_getInterruptStatus(ADC12_a_base, ADC12IFG5));
    中断;
    案例14:
    while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG14));
    中断;
    案例15:
    while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG15));
    中断;
    默认:
    return(0);
    }
    
    //获取值
    UINT16_t data = ADC12_A_getResults (ADC12_a_base,ADC12_a_memory_0 + channel);
    
    //清除中断标志并开始另一个转换
    //ADC12_a_clearInterrupt (ADC12_a_base,ADC12IFG7);
    
    //禁用ADC
    ADC12_a_disable (ADC12_a_base);
    
    return(ddata);}
    
    

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

    您的代码中没有启用中断?

    ADC12_a_enableInterrupt (ADC12_a_base,ADC12IE0);

    此致
    KC