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.

[参考译文] 编译器/CC2541:ADC 读取和电池百分比

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/940366/compiler-cc2541-adc-read-and-battery-percentage

器件型号:CC2541
Thread 中讨论的其他器件: BLE-STACK

工具/软件:TI C/C++编译器

您好,  

uint16 adc=0;


P0SEL = 0x00;


P0DIR = 0x00;


P0INP = 0xFF;

APCFG = 0xC0;


ADC = HalAdcRead (HAL_ADC_CHN_VDD3、HAL_ADC_Resolution_12);//P0.7


printf ("adc:%d\n"、adc);

我将获取输出为  

ADC:4.

ADC:3.

ADC:2.

ADC:1.

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

    您的问题是什么?

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

    我的问题是、正如我在上面提到的代码和输出、我得到的 ADC 值显然是错误的。 在我使用的 Android 应用中、显示的电池百分比为100%。  

    ADC 值不正确、那么我如何获得100%电池、而实际上电池是50%可用。  

    即使我尝试过、ADC = HalAdcRead (HAL_ADC_CHN_AIN7、HAL_ADC_Resolution_12);//P0.7、但结果相同。  

    此致、

    Yatin Baluja   

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

    尝试使用电源为 ADC 输入引脚提供1V 电压、并确保您可以首先读取正确的 ADC 读数。

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

    我现在测试了、从扩展电源提供1V 电压。 结果与相同  

    ADC:4.

    ADC:3.

    ADC:2.

    ADC:1.

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

    这很不可能。 您是否使用万用表检查 ADC 引脚上的物理电压?

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

    您好、Yatin、

    我假设您已参考 了 YK 的博客 、但也请参阅 CC2531外设软件示例

    此致、
    Ryan

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

    尊敬的  

    我有两个具有 CC2541的引脚。 一个引脚为 P0_7、另一个引脚为 P0_3。 我想将 P0_7定义为输入 GPIO 引脚、将 P0_3定义为输出 GPIO 引脚。 我如何将这些声明为所需。  

    此致、

    Yatin Baluja  

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

    您可以使用以下代码将 P0_7设置为输入 GPIO 引脚、将 P0_3设置为输出 GPIO 引脚。

    P0SEL&=!(BV (7)|BV (3));

    P0DIR |= BV (3);

    P0DIR &=!BV (7);

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

    好的、如果我想从这些引脚读取模拟值、特别是将作为输入引脚的 P0_7引脚、并且我想读取模拟值、该怎么办  

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

    因为我想读取 ADC 的 P0_7引脚的模拟值、但我不知道如何将引脚设置为输入、并在 P0_7引脚处读取 ADC 的模拟值

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

    如果您使用 BLE-STACK、则可以使用 API HalAdcRead (HAL_ADC_CHN_AIN7、...) 对 P0.7进行 ADC 读数。

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

    顺便说一下、您是否在项目中定义了 HAL_ADC=true 以使 ADC 驱动程序正常工作?

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

    是的、在预处理器中、我定义了 HAL_ADC = true;

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

    尊敬的

    void ADC_Handle (void)


      P0SEL&=!(BV (7));


      P0DIR &=!BV (7);   


      uint16 adc=0;


      ADC = HalAdcRead (HAL_ADC_CHN_AIN7、HAL_ADC_Resolution_12);//P0.7


      printf ("ADC 值:%d'\n"ADC);

    为什么我要获得这样的输出

    ADC 值:4

    ADC 值:3

    ADC 值:2.

    ADC 值:1.

    我得不到这个。  

    此致、

    Yatin Baluja

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

    在您致电 HalAdcRead 进行 ADC 读取之前、请删除"P0SEL&=!(BV (7))"和"P0DIR &=!BV (7);"。

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

    已删除并已检查。  

    相同的输出。  

    void ADC_Handle (void)

      uint16 adc=0;


      ADC = HalAdcRead (HAL_ADC_CHN_AIN7、HAL_ADC_Resolution_12);//P0.7


      printf ("ADC 值:%d'\n"ADC);

    ADC 值:4

    ADC 值:3

    ADC 值:2.

    ADC 值:1.

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

    如果您使用示波器检查 P0.7、那么它的电压是多少?

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

    我有两个电阻器、每个10K 与 P0_7引脚连接。 我将检查两个电阻器上的电压。  

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

    我建议您删除连接到 P0.7的所有内容、并使用电源直接为 P0.7提供1.0V 至 P0.7、以便首先读取 ADC。

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

    还可以,但是要检查读数 我需要连接 CC2541调试器以检查 print 语句和值。

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

    是的、使用 CC 调试器和 IAR 调试是检查 ADC 读数的最简单方法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将在其中附加一个视频、在该视频中、我将外部电源连接到 PIN、但仍然获得相同的输出。 此致、 Yatin Baluja
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    无法查看您的附加视频。

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

    e2e.ti.com/.../IMG_5F00_6099.mp4

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

    现在、我想您可以观看视频。  

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

    我无法从您的视频中看到您的 CC2541板连接的详细信息。 我只需测试 P0.7即可在我的 TICC2541DK 上读取 ADC 数据、我很确信它可以正常工作。 我使用以下代码供您参考。

    UINT16 ADC;
    
    HalAdcSetReference (HAL_ADC_REF_125V);
    
    while (1)
    {
    ADC=HalAdcRead (HAL_ADC_CHN_AIN7、HAL_ADC_Resolution_10);
    } 

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

    我有自定义 PCBA。 我无法从 PCBA 获取或插入任何部件。  

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

    我认为您的定制板上一定会有问题。 我只能建议您先调试硬件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UINT16 ADC;
    
    HalAdcSetReference (HAL_ADC_REF_125V);
    
    while (1)
    {
    ADC=HalAdcRead (HAL_ADC_CHN_AIN7、HAL_ADC_Resolution_10);
    } 


    进行了比较。 我将得到值"4"作为 ADC 值
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这意味着您的 P0.7连接到接近0V。

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

    是否有办法解决这个问题??

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

    您是否检查了硬件? 顺便说一下、您是自行设计硬件还是从第三方购买硬件?

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

    这是第三方设计、因为我的客户做了这件事并转发给我

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

    由于它是第三方硬件、您应该联系制造商以获得帮助。

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

    尊敬的

    使用以下代码。 我将获得 ADC 值:5632如果我是否在 P0_7上连接电池、我将获得此输出。 " ADC 值:5632"

    void ADC_Init (void)

    //APCFG |=0x84;
    //P0SEL |= 0x84;
    //P0DIR &=~0x84;
    P0SEL&=!(BV (7));
    P0DIR &=!BV (7);

    /*********
    *函数:read_advalue
    *说明:ADCRead
    *输入:转换通道
    *输出:ADC 转换结果
    秘书长的报告 /
    uint16 read_advalue (uint8通道)

    uint16 value=0;
    uint16 value_bak=0;

    APCFG |= 1 <<通道;//设置 ADC 输入通道,设置为模拟 I/O 端口
    ADCIF = 0;
    ADCCON3 =(HAL_ADC_REF_VDD5 | ADC_12_BIT | ADC_EMP_SENS);//选择 AVDD5作为基准电压;12位分辨率;采样 AIN7

    while (!ADCIF);//等待 AD 转换完成

    值= ADCL;
    value_bak=ADCH;
    value_bak <<=5;
    value_bak &=0xc0;
    Value=value_bak|value;

    返回值;

    /********
    *函数:sort_up
    *说明:排序
    *输入:否
    *输出:否
    (三 /
    void sort_up (void)

    uint8 n、m;
    uint16 tt;
    for (m = 0;m < BAT_num;m++)

    for (n = 0;n < BAT_num-m;n++)

    if (ADC_DATA[n]> ADC_DATA[n+1])

    TT = ADC_DATA[n];
    ADC_DATA[n]= ADC_DATA[n+1];
    ADC_DATA[n+1]= tt;




    /*********
    功能:Battery ADC_Check
    说明:连续采样
    输入:否
    输出:AD 值
    秘书长的报告 /
    UINT16 BATTERY_ADC_Check (空)

    uint16 i、n;
    uint16 k=0;
    for (i=0;<BAT_num; i++)

    adc_data[i]= read_advalue (7);
    DelayMS (100);

    sort_up();

    对于(n=1;n <BAT_num-1; n++)

    k +=ADC_DATA[n];

    k=k/(BAT_num-2);

    返回 k;


    void ADC_Handle (void)

    ADC_Value = Battery ADC_Check ();
    printf ("ADC 值:%d'\n",adc_value);

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

    请确保您可以先使用我的示例代码进行正确的 ADC 读取。 现在检查代码毫无意义。

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

    好的

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

    使用您的代码、我将获得 ADC 值:4、我将联系消息制造商进行检查  

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

    YiKai 我联系了制造 PCBA 的客户、等待他们的回复。  

    对于 CC2541的按钮功能、我有几个问题要问。  

    我有4个按钮。 在 P0_3、P0_5、P0_1和 P0_7上与 CC2541连接。  

    现在、我需要的是、按住 P0_3 2-3秒将打开器件、如果我再次按下将选择一个 LED (红色)的同一按钮、这将不会打开 LED、只需选择 LED 即可。 类似地、如果我按下 P0_5按钮、则会选择橙色 LED、但如果我按下 P0_7按钮、则先前选择的红色 LED (P0_3)和橙色 LED (P0_5)将打开这些选定的 LED 或按钮。  

    基本上选择按钮、但打开这些按钮、按下最后一个第四个按钮。  

    我将如何进行此操作。

    此致、

    Yatin Baluja  

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

    您可以参考 hal_key.c 来了解如何处理它。

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

    好的。  与 simpleBLEPeripheral 示例中一样、我们将预定义的蓝牙 UUID 设为00FF 可以将其更改为00EE、因为我测试了00GG、但该测试不起作用。 尽管00EE 起作用。 由于我能够使用00EE 但不能使用00GG、因此定义 UUID 是否有任何限制。

    此致、

    Yatin Baluja

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

    UUIDIS 为十六进制格式、GG 为 Out Boundary。

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

    您好 ,我可以使用3.3V 作为 ADC 的电压基准吗?   

    就像这样           #define HAL_ADC_REF_VDD5         0x80

    此致、

    Yatin Baluja

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

    是的。

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

    我正在使用它、但我将获得 ADC 值5632、该值没有变化  

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

    我还记得您提到过、您会联系您的模块制造商。 在使用内部基准读取 ADC 时、您是否已解决了先前的问题?

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

    我与他们进行了核对、他们说硬件正常、因为他们计算了连接电阻器的电压、结果正常。 因为它是一个12位 ADC、并且使用10k 和20k 分压器。 他们不会在硬件中寻找任何问题。  

    void ADC_Handle (void)

    uint16 adc_value;
    HalAdcSetReference (HAL_ADC_REF_VDD5);
    while (1)

    ADC_Value = HalAdcRead (HAL_ADC_CHN_AIN7、HAL_ADC_Resolution_12);
    printf ("ADC 值:%d'\n",adc_value);

    我现在使用此值来读取值、但我得到的值仅为"1"。  

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

    我在您的代码中看不到任何问题。 如果您仍然无法使其正常工作,我很确定您的硬件中存在问题。

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

    您好,

    由于我不想定期发送通知、因此可以发送上次读数的电池通知。当蓝牙与我希望最后一次测量值将通知而不是通知当前电池值的器件连接时  

    此致、

    Yatin Baluja  

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

    我想您可以在应用中执行任何您喜欢的操作。