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.

[参考译文] CC2530 ADC 问题

Guru**** 2539500 points
Other Parts Discussed in Thread: TIMAC, CC2530

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/569225/cc2530-adc-problem

器件型号:CC2530
主题中讨论的其他器件:TIMACZ-STACK

您好!

我正在使用 CC2530F128 ADC、但我无法读取输入(值始终为0)。 我已经尝试使用 ADC 寄存器、使用 TIMAC ADC 库和 z 堆栈库、并且始终会获得相同的结果。 我还尝试读取 温度传感器、结果为0。 但在所有情况下、由于 ADCCON1.EOC 被置位、转换已经完成。

读取温度传感器的代码:

 ADCCON3 = 0x3E;
 while (!(ADCCON1 & 0x80));
 //使用 adcValue 的所有14 MSB
 ADC_Result = ADCL >> 2;
 ADC_Result |= ADCH << 6;

读取通道0的代码:

   P0DIR = 0x00;  //TODO 进入卷
   P0SEL = 0xFF;    //TODO Funcion Periferico
   HalAdcSetReference (HAL_ADC_REF_125V);
   ADC_Result = HalAdcRead (HAL_ADC_CHN_AIN0、HAL_ADC_Resolution_14);

出什么问题了?

谢谢。

Ruben

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

    器件型号:CC2530

    您好!

    我正在使用 CC2530F128 ADC、但我无法读取输入(值始终为0)。 我已经尝试使用 ADC 寄存器、使用 TIMAC ADC 库和 z 堆栈库、并且始终会获得相同的结果。 我还尝试读取 温度传感器、结果为0。 但在所有情况下、由于 ADCCON1.EOC 被置位、转换已经完成。

    读取温度传感器的代码:

     ADCCON3 = 0x3E;
     while (!(ADCCON1 & 0x80));
     //使用 adcValue 的所有14 MSB
     ADC_Result = ADCL >> 2;
     ADC_Result |= ADCH << 6;

    读取通道0的代码:

       P0DIR = 0x00;  //TODO 进入卷
       P0SEL = 0xFF;    //TODO Funcion Periferico
       HalAdcSetReference (HAL_ADC_REF_125V);
       ADC_Result = HalAdcRead (HAL_ADC_CHN_AIN0、HAL_ADC_Resolution_14);

    出什么问题了?

    谢谢。

    Ruben

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请尝试参阅 sunmaysky.blogspot。tw/.../cc2530-adc-howto-in-ti-z-stack.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 YiKai、

    我使用了与示例相同的代码:

    HalAdcSetReference (HAL_ADC_REF_125V);
    ADC_Result = HalAdcRead (HAL_ADC_CHN_AIN0、HAL_ADC_Resolution_10);

    ADC_Result 始终为0。 实际上、我无法修改变量 ADC_Result。 我已定义 uint16 ADC_Result = 0xFF;在观察窗口中、我可以看到值为0。 例如,如果我执行 DE 代码 ADC_Result = 1;,则该值不会改变(它一直为0)。 为什么会发生这种情况?

    谢谢。

    Ruben
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    AIN0被映射到 P0.0。 您是否使用万用表检查其上的电压?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    确保您已将引脚配置为 ADC、输入和外设。

    在下面、您可以在引脚 P0.4处找到 ADC 输入的示例。
    ADC 配置为使用 AVDD5作为电压基准和7位 ENOB 设置

    //ADC
    APCFG = 0x10;//0b00010000;//[0] P0.4模拟 IO
    ADCCON1 = 0x33;//0b00110011;//[7] EOC (只读)|[6] Start_conversion |[5:4] Start Trigger (ADCCON1.ST)|[3:2] reserved (00)|[1:0] reserved (11)
    ADCCON2 = 0x80;//0b10000000;//[7:6] AVDD5 REF |[5:4] 7位|[3:0]通道|(单次转换)

    //I/O 引脚
    P0SEL = 0x3C;//0b00111100;//[7:0]{1}-外设{0}-GPIO
    P0DIR = 0xEA;//0b1110101010;//[7:0]{0}-输入|{1}-输出

    ADCCON2 |= 0x04;//通道4

    if (ADCCON1 & 0x80)//检查 EOC ...
    VAR = ADCH;//读取任何"虚拟"剩余值。

    ADCCON1 |= 0x40;//开始转换

    while (!(ADCCON1 & 0x80));等待 EOC


    uint16 var;
    VAR = ADCL;//接收 LSB
    var |=((uint16) ADCH << 8);//接收 MSB。
    var = var >> 8;//旋转8位,因为它们在使用7位时无关

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

    我已经解决了。 问题是 IAR 不在 XDATA 中声明变量、并且它一直读取0。

    感谢您的回复。

    鲁本