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.

[参考译文] CCS/MSP430F5529:A12上的 ADC12

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/684951/ccs-msp430f5529-adc12-on-a12

器件型号:MSP430F5529

工具/软件:Code Composer Studio

我在使用 ADC12获取值时遇到了一个奇怪的问题。 我想测量 A12上的电压。  电压读数应为0.89v、但我正在使用的代码似乎没有读出。  它只是得到0.0A 的帮助会很好。

谢谢、

------

float 电压;

float bat_voltage (void)
{
ADC12CTL0 = ADC12SHT02 + ADC12ON; // 16个样本-采样时间、ADC12打开
ADC12CTL1 = ADC12SHP; //使用采样计时器
ADC12MCTL0 = ADC12INCH_12 + ADC12EOS; //选择 A12作为源输入
ADC12IE = 0x01; //启用中断
ADC12CTL0 = ADC12ENC; //启用转换
P7SEL |= BIT0; //选择 ADC 进行电池电压测量

int voltctl = 1000; //读取计时器以获取电压读数...然后放弃
while (voltctl >0)
{
ADC12CTL0 |= ADC12SC; //采样和转换开始
voltcttl-; //递减读取定时器
_bis_SR_register (LPM0_bits + GIE); // LPM0、ADC12_ISR 将强制退出
}
if (voltctl = 0)
{
电压= 99.9; //如果此代码超时,请将电压更改为99.9以指示错误
}
其他
{
__no_operation(); //调试
}
返回电压;
}
//
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=ADC12_vector
__interrupt void ADC12ISR (void)
#Elif defined (__GNU__)
void __attribute__((interrupt (ADC12_vector))#defineer (void ADC12ISR

(void)))(void 编译器错误))(不支持 ADC12ISR!
#endif
{
switch (__even_in_range (ADC12IV、34))
{
case 0:break; //向量0:无中断
情况2:中断; //向量2:ADC 溢出
情况4:中断; //向量4:ADC 时序溢出
情况6:中断; //向量6:ADC12IFG0
情况8:中断; //向量8:ADC12IFG1
大小写10:break; //向量10:ADC12IFG2
大小写12:break; //向量12:ADC12IFG3
case 14:break; //向量14:ADC12IFG4
情况16:中断; //向量16:ADC12IFG5
情况18:中断; //向量18:ADC12IFG6
案例20:中断; //向量20:ADC12IFG7
case 22:break; //向量22:ADC12IFG8
case 24:break; //向量24:ADC12IFG9
大小写26:break; //向量26:ADC12IFG10
case 28:break; //向量28:ADC12IFG11
情况30: //向量30:ADC12IFG12
电压= ADC12MEM12; //从 A12移动结果,IFG 被清除
_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);//退出活动 CPU
break;
case 32:break; //向量32:ADC12IFG13
case 34:break; //向量34:ADC12IFG14
默认值:break;
}
} 

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

    尊敬的 Chris:

    将 ADC12CTL0寄存器中的 ADC12ENC 位置位时、将覆盖先前的设置:

    ADC12CTL0 = ADC12ENC; 

    启用 ADC 转换的正确方法是使用|=操作:

    ADC12CTL0 |= ADC12ENC; 

    此致、  
    Caleb Overbay

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

    谢谢 Caleb、

    这很有帮助。  但我仍然看不到任何数据。  今天、我将尝试在 LaunchPad 上尝试使用此代码、以删除任何硬件变量。 然后、我将尝试一个示例代码并对其进行修改、直到我看到发生了什么情况。   

    我本以为用户会提供足够的信息、这样我就可以设置任何类型的 ADC、但只是描述了寄存器、并不清晰。  

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

    这就是代码示例出现的原因。 driverLib 手册提供了一个示例:

    /*初始化 ADC (MCLK/1/4)*/
    MAP_ADC14_enableModule ();
    MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_4、
    0);
    /*配置 GPIO (5.5 A0)*/
    MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN5、
    GPIO_TIVE_MODULE_Function);
    //配置 ADC 内存*/
    MAP_ADC14_configureSingleSampleMode (ADC_MEM0、TRUE);MAP_ADC_REVC_ADC_REVA0
    
    、ADC_REEP_ADC_REV0_ADC_REOPEN_ADC14、ADC_ADC_ADC0 false);
    //配置采样计时器*/
    MAP_ADC14_enableSampleTimer (ADC_MANUAL_DETERY);
    //启用/切换转换*/
    MAP_ADC14_enableConversion();
    MAP_ADC14_TOGLEConversionTrigger();
    
    // ADC 中断处理程序。 每当
    ADC_MEM0完成转换*时、就会调用此处理程序。
    */
    void ADC14_IRQHandler (void)
    {
    uint64_t status = MAP_ADC14_getEnabableInterruptStatus ();
    MAP_ADC14_clearInterruptFlag (status);
    if (ADC_INT0 & status)
    {
    ADCResult = MAP_ADC14_getResources(ADC14);
    ADC14_Contract_ADC14_ADC3.3V);ADC14_Contractuertog_ADC14_Conversion_ADC384 (
    *= ADC14);ADC14_ADC=ADC=ADC=ADC=ADC