3152|8

6060

帖子

6

TA的资源

版主

楼主
 

09 ADC采集及电源管理系统(系列结贴) [复制链接]

本帖最后由 秦天qintian0303 于 2022-3-22 21:44 编辑

号外相关文章

GD32L233C-START评测】02 上电及程序下载调试

GD32L233C-START评测】03 LED操作和普通定时功能

GD32L233C-START评测】04 外部中断与定时器PWM

GD32L233C-START评测】05 串口体验和不定长数据接收

GD32L233C-START评测】06 制作GD32L233C扩展板

GD32L233C-START评测】07 测试成品+SPI驱动TFT

GD32L233C-START评测】08 IIC通信体验获取传感器数据

 

前言

        目前对于涉及常用的功能基本上已经体验一遍了,只差ADC采集,结合扩展板的资源,这一次利用ADC采集电源电压结合各处供电状态,完成开关机及电量显示,完成系统最基础的一步。

 

目标

        体验ADC采集功能,实现开关机及电量显示。

 

分析

电量显示功能实现得益于ADC采集电量电压及USB供电状状态采集及充电状态采集,以此将供电状态分为以下几种,USB供电及充电,USB供电单补充点,电池供电等。

接下来就是相应初始化:

第一步:USB输入状态引脚初始化及充电状态初始化;

第二步:ADC采集初始化;

第三步:采集数据并进行逻辑判断;

第四步:界面显示;

 

ADC配置代码

//******************************************************************************
//* 函数名称  : gd_ADC_init                                              
//* 函数描述  : ADC配置                                               
//* 输入参数  :                                                               
//* 参数描述  : ADC初始化配置                                  
//* 输出参数  : 无                                                          
//* 返回值    : 无                                                           
//******************************************************************************
void gd_ADC_init(void)
{
  /* enable GPIOC clock */
  rcu_periph_clock_enable(RCU_GPIOA);
  /* enable ADC clock */
  rcu_periph_clock_enable(RCU_ADC);;
  /* config ADC clock CK_APB2/6*/
  rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
  
  gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);
  
  /* ADC data alignment config */
  adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
  /* ADC channel length config */
  adc_channel_length_config(ADC_REGULAR_CHANNEL, 1U);

  /* ADC trigger config */
  adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);
  /* ADC external trigger config */
  adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);

  /* enable ADC interface */
  adc_enable();
  DelaySysTick_ms(1U);
  /* ADC calibration and reset calibration */
  adc_calibration_enable();

}

电池电量采集及判断代码

//*******************************************************************************
//* 函数名称  : void Collection_SPM(void)                        
//* 函数描述  : 采集数据                                                
//* 输入参数  :                                                                 
//* 参数描述  :                                                                 
//* 输出参数  : 无                                                               
//* 返回值    :                                                            
//*******************************************************************************  
void Collection_SPM(void)
{  
  if(Power_collect_flag == 1)
  {
    
    ADC_Value=Power_get(1);
    VOL_Value=(uint16_t)(ADC_Value*110*5/4096+30);
    
//    if(Sign_USB==1)
//    {
//      Flag_USB = 1;
//    }
//    else
//    {
//      Flag_USB = 0;
//    }
    
    if(Sign_CHG==1)
    {
      Flag_CHG = 0;
    }
    else
    {
      Flag_CHG = 1;
    }
    Power_collect_flag = 0;
  }
  
  
  App_Battery_Judge();

}
    
//*******************************************************************************
//* 函数名称  : void Power_get(void)                        
//* 函数描述  : 采集数据                                                
//* 输入参数  :                                                                 
//* 参数描述  :                                                                 
//* 输出参数  : 无                                                               
//* 返回值    :                                                            
//*******************************************************************************  
uint16_t Power_get(uint8_t channel)
{  
  /* ADC regular channel config */
  adc_regular_channel_config(0U, channel, ADC_SAMPLETIME_7POINT5);
  /* ADC software trigger enable */
  adc_software_trigger_enable(ADC_REGULAR_CHANNEL);

  /* wait the end of conversion flag */
  while(!adc_flag_get(ADC_FLAG_EOC));
  /* clear the end of conversion flag */
  adc_flag_clear(ADC_FLAG_EOC);
  /* return regular channel sample value */
  return (adc_regular_data_read());

}

//********************************************************************************/
//* 函数名称  : void App_Battery_Judge(void)                                 */
//* 函数描述  : 电池状态判断                                                     */
//* 输入参数  :                                                                  */
//* 参数描述  :                                                                  */
//* 输出参数  : 无                                                               */
//* 返回值    : 无                                                               */
//********************************************************************************/   
void App_Battery_Judge(void)
{
//  if((Flag_USB == 1)&&(Flag_CHG == 1))
//  {
//    State_Power_cnt = 8;
//  }
  if((Flag_CHG == 1))
  {
    State_Power_cnt = 7;
  }
  else if((Flag_CHG == 0)&&(VOL_Value >= 410))
  {
    State_Power_cnt = 6;
  }
  else if((Flag_CHG == 0)&&(VOL_Value >= 400)&&(VOL_Value < 410))
  {
    State_Power_cnt = 5;
  }
  else if((Flag_CHG == 0)&&(VOL_Value >= 390)&&(VOL_Value < 400))
  {
    State_Power_cnt = 4;
  }
  else if((Flag_CHG == 0)&&(VOL_Value >= 380)&&(VOL_Value < 390))
  {
    State_Power_cnt = 3;
  }
  else if((Flag_CHG == 0)&&(VOL_Value >= 370)&&(VOL_Value < 380))
  {
    State_Power_cnt = 2;
  }
  else if((Flag_CHG == 0)&&(VOL_Value < 370))
  {
    State_Power_cnt = 1;
  }
  
  if(State_Power_cnt >= 1  && State_Power_cnt <= 6 && SHOW_Powering_cnt == State_Power_cnt-1)
  {
    State_Power_cnt = SHOW_Powering_cnt;
  }

}

        其中采集定时在定时其中每2秒采集一次,电池电量的判断不用太频繁,不过USB状态的判断需要及时一点,ADC的转换通过软件启动,根据精度不同等待转换完成的时间不同,这一点要注意。

        到这里本开发板的测评也就基本结束了,对于L系列的低功耗方面的测评我还是不舍得破坏它,对于现在大部分的产品要求来说,功能实现还是第一位的,功耗做的是越来越低,同质化非常明显,也希望国内的厂商在产品的品控方面做得越来越好,预祝坛友们一起多多使用,工作顺利!

此帖出自GD32 MCU论坛

最新回复

楼主是用电压来判断电量的,电量跟电池电压是线性关系还是有其他的算法,可否做一下科普?  详情 回复 发表于 2022-3-28 09:49
点赞 关注
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

关于[GD32L233C-START 评测楼主已经测到第九篇了,厉害

此帖出自GD32 MCU论坛

点评

其实就是一个一个功能的实现  详情 回复 发表于 2022-3-24 16:47
 
 
 

回复

706

帖子

0

TA的资源

纯净的硅(高级)

板凳
 

楼主不错,厉害

此帖出自GD32 MCU论坛

点评

谢谢,共勉  详情 回复 发表于 2022-3-24 16:47
 
 
 

回复

6773

帖子

2

TA的资源

版主

4
 

期待最后整个Demo的效果视频~

此帖出自GD32 MCU论坛

点评

稍后录制一下,其实就是一个简单的功能实现  详情 回复 发表于 2022-3-24 16:48
 
 
 

回复

6060

帖子

6

TA的资源

版主

5
 
Jacktang 发表于 2022-3-23 07:27 关于[GD32L233C-START 评测楼主已经测到第九篇了,厉害

其实就是一个一个功能的实现

此帖出自GD32 MCU论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

6060

帖子

6

TA的资源

版主

6
 

谢谢,共勉

此帖出自GD32 MCU论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

6060

帖子

6

TA的资源

版主

7
 
wangerxian 发表于 2022-3-24 14:11 期待最后整个Demo的效果视频~

稍后录制一下,其实就是一个简单的功能实现

此帖出自GD32 MCU论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

6841

帖子

11

TA的资源

版主

8
 
楼主是用电压来判断电量的,电量跟电池电压是线性关系还是有其他的算法,可否做一下科普?
此帖出自GD32 MCU论坛

点评

简单的电压和电量是线性关系的,想精确一点的话可以查看电池的曲线找点  详情 回复 发表于 2022-3-29 08:38
 
 
 

回复

6060

帖子

6

TA的资源

版主

9
 
lugl4313820 发表于 2022-3-28 09:49 楼主是用电压来判断电量的,电量跟电池电压是线性关系还是有其他的算法,可否做一下科普?

简单的电压和电量是线性关系的,想精确一点的话可以查看电池的曲线找点

此帖出自GD32 MCU论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表