[CW32L083系列] CW32L010F8P6电源测量和温度测量问题?

[复制链接]
1535|16
 楼主| ypp240124016 发表于 2024-12-16 08:47 | 显示全部楼层 |阅读模式
以下是ADC相关初始化代码,得到的电源电压不准确,有时候是3.6V,有时候是3.3V,有时候是1.6V,我是标准3.3V供电的。这个电压不准确,内部温度也就不准确了。是不是初始化有什么问题?

  1. /*               
  2. ================================================================================
  3. 描述 : ADC初始化
  4. 输入 :
  5. 输出 :
  6. ================================================================================
  7. */
  8. void app_smoke_adc_init(void)
  9. {
  10.   ADC_InitTypeDef ADC_InitStructure = {0};
  11.   
  12.   __SYSCTRL_GPIOB_CLK_ENABLE();
  13.   PB02_ANALOG_ENABLE();
  14.   
  15.   ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div8;
  16.   ADC_InitStructure.ADC_ConvertMode = ADC_ConvertMode_Continuous;

  17.   ADC_InitStructure.ADC_IN0.ADC_InputChannel = ADC_InputCH9;
  18.   ADC_InitStructure.ADC_IN0.ADC_SampTime = ADC_SampTime390Clk;//烟雾浓度

  19.   ADC_InitStructure.ADC_IN1.ADC_InputChannel = ADC_InputTs;
  20.   ADC_InitStructure.ADC_IN1.ADC_SampTime = ADC_SampTime390Clk;//内部温度

  21.   ADC_InitStructure.ADC_IN2.ADC_InputChannel = ADC_InputVref1P2;
  22.   ADC_InitStructure.ADC_IN2.ADC_SampTime = ADC_SampTime390Clk; //1.2V基准电压
  23.   
  24.   ADC_InitStructure.ADC_SQREns = ADC_SqrEns0to2;
  25.   
  26.   ADC_Init(&ADC_InitStructure);

  27.   REGBITS_SET(CW_ADC->CR, ADC_CR_BGREN_Msk);//使能BGR
  28.   
  29.   ADC_SetTs(ADC_TsEnable);//使能内部温度
  30.   
  31.   //ADC使能
  32.   ADC_Enable();
  33.   ADC_SoftwareStartConvCmd(ENABLE);  
  34. //  g_sAppSmokeWork.adc_flag=true;
  35. }


  1. /*               
  2. ================================================================================
  3. 描述 : ADC检测转换
  4. 输入 :
  5. 输出 :
  6. ================================================================================
  7. */
  8. void app_smoke_adc_check(void)
  9. {
  10. //  static u16 run_cnts=0;

  11. //  if(g_sAppSmokeWork.adc_flag && run_cnts++>500)
  12. //  {
  13.     u16 adc_array[3]={0};
  14. //    ADC_SoftwareStartConvCmd(DISABLE);
  15.    
  16.     ADC_GetSqr0Result(&adc_array[0]);
  17.     ADC_GetSqr1Result(&adc_array[1]);
  18.     ADC_GetSqr2Result(&adc_array[2]);  
  19. //    run_cnts=0;   
  20.     g_sAppSmokeWork.adc_flag=false;
  21.     for(u8 i=0; i<3; i++)
  22.     {
  23.       printf("adc_%d=%d\n", i, adc_array[i]);
  24.     }
  25.    
  26.     //电源电压计算
  27.     u16 volt_bgr=*((uint16_t*)0x001007D2);//基准电压值
  28.    
  29.     float volt_vcc=volt_bgr*4095.f/adc_array[2]/1000;
  30.     printf("volt_bgr=%.3fV, volt_vcc=%.3fV\n", volt_bgr/1000.f, volt_vcc);
  31.    
  32.     //温度计算
  33.     float temp_val=ADC_GetTs(volt_vcc, adc_array[1]);
  34.     printf("temp_val=%.1f C\n", temp_val);
  35. //  }

  36. }


串口调试内容
  1. [08:48:01.767] adc_0=0
  2. [08:48:01.767] adc_1=912
  3. [08:48:01.767] adc_2=3062
  4. [08:48:01.767] volt_bgr=1.199V, volt_vcc=1.603V
  5. [08:48:01.780] temp_val=-129.9 C
  6. [08:48:01.780]
  7. [08:48:04.153] now_rtc_time=1624237630s
  8. [08:48:04.160]
  9. [08:48:09.153] now_rtc_time=1624237635s
  10. [08:48:09.159]
  11. [08:48:12.193] adc_0=0
  12. [08:48:12.193] adc_1=913
  13. [08:48:12.193] adc_2=3064
  14. [08:48:12.193] volt_bgr=1.199V, volt_vcc=1.602V
  15. [08:48:12.193] temp_val=-129.9 C





pssyx 发表于 2024-12-16 10:54 | 显示全部楼层
ADC初始化代码没有问题,但adc_2的值明显偏大,其真实值大约为15xx。
建议更新固件库,再debug一下,确定问题所在。
xionghaoyun 发表于 2024-12-16 14:24 | 显示全部楼层
pssyx 发表于 2024-12-16 10:54
ADC初始化代码没有问题,但adc_2的值明显偏大,其真实值大约为15xx。
建议更新固件库,再debug一下,确定问 ...

官方库有BUG
 楼主| ypp240124016 发表于 2024-12-16 16:17 | 显示全部楼层
pssyx 发表于 2024-12-16 10:54
ADC初始化代码没有问题,但adc_2的值明显偏大,其真实值大约为15xx。
建议更新固件库,再debug一下,确定问 ...

昨天adc_2的值大概1300左右,算出来3.6V左右;后面重新插拔一下 1400左右,算出来3.3V左右;今天早上再测试下,变成1.6V了
 楼主| ypp240124016 发表于 2024-12-16 16:18 | 显示全部楼层
本帖最后由 ypp240124016 于 2024-12-16 16:22 编辑
pssyx 发表于 2024-12-16 10:54
ADC初始化代码没有问题,但adc_2的值明显偏大,其真实值大约为15xx。
建议更新固件库,再debug一下,确定问 ...

固件库最新版本是 哪个,我现在用的如下/**
* @file cw32l010_adc.c
* @author WHXY
* @brief
* @version 0.1
* @file cw32l010_adc.c
* @author WHXY
* @brief
* @version 0.1
* @date 2024-08-07
*
* @copyright Copyright (c) 2021
*
*/

整个固件库好像是最新的了

CW32L010_StandardPeripheralLib_V1.0.3

 楼主| ypp240124016 发表于 2024-12-16 17:08 | 显示全部楼层
pssyx 发表于 2024-12-16 10:54
ADC初始化代码没有问题,但adc_2的值明显偏大,其真实值大约为15xx。
建议更新固件库,再debug一下,确定问 ...

用购买的核心板测试没有问题,代码一样,可以测出电压3.3V左右。  自己布的板就时好时坏,按道理这也跟外围没多大关系吧,都是内部测量?
pssyx 发表于 2024-12-16 17:27 | 显示全部楼层
ypp240124016 发表于 2024-12-16 17:08
用购买的核心板测试没有问题,代码一样,可以测出电压3.3V左右。  自己布的板就时好时坏,按道理这也跟外 ...

请检查电源是否稳定?注意Vcore的电容值需1uF。
 楼主| ypp240124016 发表于 2024-12-16 19:10 | 显示全部楼层
pssyx 发表于 2024-12-16 17:27
请检查电源是否稳定?注意Vcore的电容值需1uF。

我用官方DAP 电源直接供电,应该问题不大。Vcore按照官方的470nF
pssyx 发表于 2024-12-17 10:08 | 显示全部楼层
ypp240124016 发表于 2024-12-16 19:10
我用官方DAP 电源直接供电,应该问题不大。Vcore按照官方的470nF

CW-DAPLINK内部使用了一个117(LDO),输出3.3V,再经过一个肖特基二极管,最终输出VDD电压约3.1V。
如果负载板电流过大,建议采用外部电源供电方式。
 楼主| ypp240124016 发表于 2024-12-17 10:14 | 显示全部楼层
pssyx 发表于 2024-12-17 10:08
CW-DAPLINK内部使用了一个117(LDO),输出3.3V,再经过一个肖特基二极管,最终输出VDD电压约3.1V。
如果 ...

找到原因了,DAP的串口TX引脚是5V电平的,我直接跟MCU的RX连接了,干扰电源了,拔掉就正常了。 如果要用那个引脚的话需要串联电阻。
xch 发表于 2024-12-17 17:26 | 显示全部楼层
ADC_CR_BGREN_Msk 置一后后不需要等待稳定一会儿吗?
不建议这种直接排队ADC转换。你看看MCU有没有一个多余的ADC输入引脚。把多余引脚接地。然后在队列中加入对该引脚的转换。加在每个真正要ADC的转换之前,转换结果丢弃。信号源内阻为零采样时间可以减小些。

数据手册?用户手册?
xch 发表于 2024-12-17 17:32 | 显示全部楼层
xch 发表于 2024-12-17 17:34 | 显示全部楼层
xch 发表于 2024-12-17 17:36 | 显示全部楼层
 楼主| ypp240124016 发表于 2024-12-18 08:13 | 显示全部楼层
ClarkLLOTP 发表于 2024-12-18 14:44 | 显示全部楼层
校准过了吗?
小小蚂蚁举千斤 发表于 2024-12-19 16:22 | 显示全部楼层
是不是内部基准的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部