打印
[CW32L083系列]

CW32L010F8P6电源测量和温度测量问题?

[复制链接]
721|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
以下是ADC相关初始化代码,得到的电源电压不准确,有时候是3.6V,有时候是3.3V,有时候是1.6V,我是标准3.3V供电的。这个电压不准确,内部温度也就不准确了。是不是初始化有什么问题?

/*                
================================================================================
描述 : ADC初始化
输入 :
输出 :
================================================================================
*/
void app_smoke_adc_init(void)
{
  ADC_InitTypeDef ADC_InitStructure = {0};
  
  __SYSCTRL_GPIOB_CLK_ENABLE();
  PB02_ANALOG_ENABLE();
  
  ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div8;
  ADC_InitStructure.ADC_ConvertMode = ADC_ConvertMode_Continuous;

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

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

  ADC_InitStructure.ADC_IN2.ADC_InputChannel = ADC_InputVref1P2;
  ADC_InitStructure.ADC_IN2.ADC_SampTime = ADC_SampTime390Clk; //1.2V基准电压
  
  ADC_InitStructure.ADC_SQREns = ADC_SqrEns0to2;
  
  ADC_Init(&ADC_InitStructure);

  REGBITS_SET(CW_ADC->CR, ADC_CR_BGREN_Msk);//使能BGR
  
  ADC_SetTs(ADC_TsEnable);//使能内部温度
  
  //ADC使能
  ADC_Enable();
  ADC_SoftwareStartConvCmd(ENABLE);  
//  g_sAppSmokeWork.adc_flag=true;
}


/*               
================================================================================
描述 : ADC检测转换
输入 :
输出 :
================================================================================
*/
void app_smoke_adc_check(void)
{
//  static u16 run_cnts=0;

//  if(g_sAppSmokeWork.adc_flag && run_cnts++>500)
//  {
    u16 adc_array[3]={0};
//    ADC_SoftwareStartConvCmd(DISABLE);
   
    ADC_GetSqr0Result(&adc_array[0]);
    ADC_GetSqr1Result(&adc_array[1]);
    ADC_GetSqr2Result(&adc_array[2]);  
//    run_cnts=0;   
    g_sAppSmokeWork.adc_flag=false;
    for(u8 i=0; i<3; i++)
    {
      printf("adc_%d=%d\n", i, adc_array[i]);
    }
   
    //电源电压计算
    u16 volt_bgr=*((uint16_t*)0x001007D2);//基准电压值
   
    float volt_vcc=volt_bgr*4095.f/adc_array[2]/1000;
    printf("volt_bgr=%.3fV, volt_vcc=%.3fV\n", volt_bgr/1000.f, volt_vcc);
   
    //温度计算
    float temp_val=ADC_GetTs(volt_vcc, adc_array[1]);
    printf("temp_val=%.1f C\n", temp_val);
//  }

}


串口调试内容
[08:48:01.767] adc_0=0
[08:48:01.767] adc_1=912
[08:48:01.767] adc_2=3062
[08:48:01.767] volt_bgr=1.199V, volt_vcc=1.603V
[08:48:01.780] temp_val=-129.9 C
[08:48:01.780]
[08:48:04.153] now_rtc_time=1624237630s
[08:48:04.160]
[08:48:09.153] now_rtc_time=1624237635s
[08:48:09.159]
[08:48:12.193] adc_0=0
[08:48:12.193] adc_1=913
[08:48:12.193] adc_2=3064
[08:48:12.193] volt_bgr=1.199V, volt_vcc=1.602V
[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了

使用特权

评论回复
5
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

使用特权

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

用购买的核心板测试没有问题,代码一样,可以测出电压3.3V左右。  自己布的板就时好时坏,按道理这也跟外围没多大关系吧,都是内部测量?

使用特权

评论回复
7
pssyx| | 2024-12-16 17:27 | 只看该作者
ypp240124016 发表于 2024-12-16 17:08
用购买的核心板测试没有问题,代码一样,可以测出电压3.3V左右。  自己布的板就时好时坏,按道理这也跟外 ...

请检查电源是否稳定?注意Vcore的电容值需1uF。

使用特权

评论回复
8
ypp240124016|  楼主 | 2024-12-16 19:10 | 只看该作者
pssyx 发表于 2024-12-16 17:27
请检查电源是否稳定?注意Vcore的电容值需1uF。

我用官方DAP 电源直接供电,应该问题不大。Vcore按照官方的470nF

使用特权

评论回复
9
pssyx| | 2024-12-17 10:08 | 只看该作者
ypp240124016 发表于 2024-12-16 19:10
我用官方DAP 电源直接供电,应该问题不大。Vcore按照官方的470nF

CW-DAPLINK内部使用了一个117(LDO),输出3.3V,再经过一个肖特基二极管,最终输出VDD电压约3.1V。
如果负载板电流过大,建议采用外部电源供电方式。

使用特权

评论回复
10
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连接了,干扰电源了,拔掉就正常了。 如果要用那个引脚的话需要串联电阻。

使用特权

评论回复
11
xch| | 2024-12-17 17:26 | 只看该作者
ADC_CR_BGREN_Msk 置一后后不需要等待稳定一会儿吗?
不建议这种直接排队ADC转换。你看看MCU有没有一个多余的ADC输入引脚。把多余引脚接地。然后在队列中加入对该引脚的转换。加在每个真正要ADC的转换之前,转换结果丢弃。信号源内阻为零采样时间可以减小些。

数据手册?用户手册?

使用特权

评论回复
12
xch| | 2024-12-17 17:32 | 只看该作者

使用特权

评论回复
13
xch| | 2024-12-17 17:34 | 只看该作者

使用特权

评论回复
14
xch| | 2024-12-17 17:36 | 只看该作者

使用特权

评论回复
15
ypp240124016|  楼主 | 2024-12-18 08:13 | 只看该作者

使用特权

评论回复
16
ClarkLLOTP| | 2024-12-18 14:44 | 只看该作者
校准过了吗?

使用特权

评论回复
17
小小蚂蚁举千斤| | 2024-12-19 16:22 | 只看该作者
是不是内部基准的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝