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:将 ADC12_A 初始化为单通道单次转换模式

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/817024/msp430f5529-initializing-adc12_a-for-single-channel-single-conversion-mode

器件型号:MSP430F5529

您好!  

因此、我只想在具有延迟的 while 环路中读取引脚 P6.5 (A5)上的电压值。  

我的时钟初始化为 MCLK 为20MHz、SMCLK 为10MHz、ACLK 为32k、所有这些都经过测试(我实际上已根据此时钟完成了基于 SPI 的图形 LCD 驱动程序、确保其正常工作)

这就是代码:  

void adc_init (void)
{
P6SEL|=0x20;//P6.5不是 GPIO
P8DIer&=~0x20;//P6.5为输出

ADC12CTL0&=~0x0002;//ADC12_A 禁用转换 ADC12ENC
ADC12CTL0&=~0x0010;//ADC12_A 关闭 ADC12ON

ADC12CTL0|=0x0400;//采样保持时间= 64个 ADC12CLK 周期

//采样定时器需要 SHI 信号的上升沿来触发每个采样和转换。

REFCTL0&=~0x0080;//REFMSTR=0、基准系统在可用时由 ADC12_A 模块内的传统控制位控制
ADC12CTL0|=0x0020;//ADC12_A 基准发生器打开。 在带有 REF 模块的器件中、这个位只有在 REF 模块的 REFMSTR 位被设定为0时才有效
ADC12CTL0|=0x0040;//ADC12_A 是基准发生器电压并且= 2.5V、这个位只有在 REF 模块的 REFMSTR 位被设定为0时才有效

//ADC12SC 开始采样和转换

ADC12CTL1|=0x5000;//转换起始地址为 ADC12MEM5

//ADC12_A 采样保持源选择为 ADC12SC 位

//ADC12_A 采样保持脉冲模式选择:SAMPCON 信号来源于采样输入信号

ADC12CTL1|=0x00E0;//ADC12_A 时钟分频8
ADC12CTL1|=0x0180;//ADC12_A 时钟源为 SMCLK

//单通道、单次转换

ADC12CTL2|=0x0100;//ADC12_A 预分频器。 该位将选定的 ADC12_A 时钟源预分频4
ADC12CTL2|=0x0080;//温度传感器关闭

ADC12MCTL5|=0x0010;ADC12MCTL5&=~0x0060;//VR+= VREF+和 VR-= AVSS
ADC12MCTL5|=0x0005;ADC12MCTL5&=~0x0009;//通道选择为 A5

__DELAY_CYCLES (100000);
} 
无符号短整型 ADC_Read (void)
{
无符号短整型值= 0;


ADC12CTL0|=0x0010;//ADC12_A 在 ADC12ON 上
ADC12CTL0|=0x0001;//开始采样和转换 ADC12SC
ADC12CTL0|=0x0002;//ADC12_A 启用转换 ADC12ENC

//__delay_cycles (2000);

while (((ADC12CTL1&0x0001)=1);
值= ADC12MEM5;

返回值;

} 

这在主函数中  

while (1)
{

volatile unsigned short value_for_adc= adc_read ();
_DELAY_CYCLES (2000000);


}

我没有得到真正的值、实际上我得到的是零!

我不关心我们是否将基准更改为 VCC、但我只是希望它连接到 ADC 模块2.5V 基准。

我的问题在哪里?

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

    >      ADC12CTL0|=0x0001; //start sample and conversion ADC12SC

    >    ADC12CTL0|=0x0002; //ADC12_A enable conversion ADC12ENC
    假设注释正确识别了这些位(我建议您使用 MSP430.h 中的名称)、您应该颠倒这两条语句的顺序。 当 ENC=0时、SC 无效。 [参考用户指南(SLAU208Q)图28-7]

     

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

    不是真的。 该寄存器的条件是 ADC12END 应该仍然为0以更改任何位、因此当我尝试向它们轻扫 while ()时、循环会一直运行

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

    没人知道???

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

    让我检查您的问题。

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

    您好!

    这是一个奇怪的问题、因为您的应用非常简单、可用于 ADC。

    我建议您在 读取转换结果之前更改用于检查 ADC10BUSY 位的代码、以检查 ADC12IFG5位、该位 在 ADC10MEM5存储器寄存器加载转换结果时置位。

    while (((ADC12CTL1&0x0001)=1);
    值= ADC12MEM5; 

    您可以参考具有 ADC 示例代码的 MSP430F5529外设示例。

    http://dev.ti.com/tirex/explore/node?devices=MSP430F5529&node=AJCSV2LZ8O0d-pWVa2kudQ__IOGqZri__LATEST

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

    您可能还需要添加:

    > ADC12CTL1 |= 0x200;

    因为 SC 在这么短的时间内处于开启状态。

    ----------

    >ADC12MCTL5|=0x0005;ADC12MCTL5&=~0x0009;//通道选择为 A5

    这应该是:

    >ADC12MCTL5|=0x0005;ADC12MCTL5&=~0x0008;//通道选择为 A5

    ----------

    此外、由于 我在上面描述的内容、读数将会出错。

    [编辑:固定措辞]

    ----------

    [编辑:标注为通过:]

    >ADC12CTL1|=0x0180;//ADC12_A 时钟源为 SMCLK

    与评论相反、这设置(离开) ADCCLK=ADC12OSC、而不是 SMCLK。 我(再次)建议您使用 msp430.h 中的位名称  

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

    您好!

    我已经听不到您的意见了一周,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。