历史上的今天
返回首页

历史上的今天

今天是:2025年01月28日(星期二)

2020年01月28日 | STM32之电量采集

2020-01-28 来源:eefocus

一、简介


本文介绍如何在STM32上使用ADC1的第9通道,对电池电量进行采集。


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0


编译软件:MDK4.53


硬件平台:STM32开发板(主芯片stm32f103c8t6)


仿真器:JLINK


三、版权声明


四、硬件原理


1)硬件原理图


由上图可知通过PB1口采集电压,其中采集的电压为锂电池经过分压后的电压。


锂电池电压范围为3V~4.2V。


2)采集电压引脚的通道

其中ADC12_IN9,是指可以是ADC1的第9通道,也可以是ADC2的第9通道。


五、基础知识


1、stm32f103c8t6的ADC是如何的?


答:


stm32f103c8t6这款芯片一共有2个ADC,每个ADC有18个通道,每个通道有12bit。


最大的转换速率为1MHz(转换时间1us),时钟不要超过14M,否则准确度会下降。


2、什么是规则通道组和注入通道组?

答:规则通道组是普通的ADC组,而注入通道组具有优先级更高的抢占式权利,能随时打断规则通道组的ADC通道,获得ADC转换的优先权。

类似于我们在买票时,规则通道组是普通老百姓,而注入通道组是老人、军人,他们可以任意插队……


六、实验步骤

1、编写ADC的驱动


1)编写驱动GUA_ADC1.c(存放在“……HARDWARE”)


//******************************************************************************         

//name:             GUA_ADC1.c           

//introduce:        ADC1驱动    

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.29  

//******************************************************************************  

#include "stm32f10x.h"

#include "GUA_ADC1.h"

 

/*********************内部函数声明************************/

static GUA_U16 GUA_ADC1_Read(GUA_U8 nGUA_Channel);

 

//******************************************************************************            

//name:             GUA_ADC1_Read           

//introduce:        ADC1的通道数值读取       

//parameter:        nGUA_Channel:ADC1的采集通道  

//return:           该通道采集的数值         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.29                     

//******************************************************************************

static GUA_U16 GUA_ADC1_Read(GUA_U8 nGUA_Channel)

{

//规则采样顺序值为1,采样时间为 239.5 周期 

ADC_RegularChannelConfig(ADC1, nGUA_Channel, 1, ADC_SampleTime_239Cycles5);

//开始转换

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

//等待转换结束

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

//返回转换结果

return ADC_GetConversionValue(ADC1);

}

 

//******************************************************************************            

//name:             GUA_ADC1_ReadAverage           

//introduce:        ADC1的通道数值读取       

//parameter:        nGUA_Channel:ADC1的采集通道  

// nGUA_times:求平均值的次数

//return:           该通道采集的数值         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.29                      

//******************************************************************************

GUA_U16 GUA_ADC1_ReadAverage(GUA_U8 nGUA_Channel, GUA_U8 nGUA_times)

{

GUA_U32 nGUA_Value_Sum = 0;

GUA_U8 i;

//累加读取到的数值

for(i = 0; i < nGUA_times; i++)

{

 

nGUA_Value_Sum += GUA_ADC1_Read(nGUA_Channel);

}

 

//求出平均值并返回

return nGUA_Value_Sum/nGUA_times;

}

 

//******************************************************************************            

//name:             GUA_ADC1_Init           

//introduce:        ADC1初始化        

//parameter:        none  

//return:           none         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.29                      

//******************************************************************************

void GUA_ADC1_Init(void)

{

ADC_InitTypeDef ADC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

//开GPIOB、ADC1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);

//ADC最大频率不能超过14M,否则不准,因此使用72M/6=12M

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

 

//IO初始化

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOB, &GPIO_InitStructure); 

//ADC1配置复位

ADC_DeInit(ADC1); 

//ADC1配置

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式

ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道模式

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件触发

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐

ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目

ADC_Init(ADC1, &ADC_InitStructure);  //初始化配置

//使能

ADC_Cmd(ADC1, ENABLE); 

//校准

ADC_ResetCalibration(ADC1); //开启复位校准

while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束

ADC_StartCalibration(ADC1); //开启AD校准

while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束

对外接口函数为初始化函数、求多次平均值后的采集数据。


2)编写驱动头文件GUA_ADC1.h(存放在“……HARDWARE”)

//******************************************************************************         

//name:             GUA_ADC1.h           

//introduce:        ADC1驱动的头文件    

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.29     

//******************************************************************************  

#ifndef _GUA_ADC1_H_

#define _GUA_ADC1_H_

 

/*********************宏定义************************/

#ifndef GUA_U8        

typedef unsigned char GUA_U8;        

#endif    

 

#ifndef GUA_8        

typedef signed char GUA_8;        

#endif      

      

#ifndef GUA_U16        

typedef unsigned short GUA_U16;        

#endif 

 

#ifndef GUA_16        

typedef signed short GUA_16;        

#endif         

      

#ifndef GUA_U32        

typedef unsigned long GUA_U32;        

#endif 

 

#ifndef GUA_32        

typedef signed long GUA_32;       

#endif

 

#ifndef GUA_U64    

typedef unsigned long long GUA_U64;  

#endif

 

#ifndef GUA_64    

typedef signed long long GUA_64;  

#endif

 

/*********************外部函数************************/ 

extern GUA_U16 GUA_ADC1_ReadAverage(GUA_U8 nGUA_Channel, GUA_U8 nGUA_times);

extern void GUA_ADC1_Init(void);

 

#endif


2、编写电量采集的驱动


1)编写驱动GUA_Battery_Check.c(存放在“……HARDWARE”)


//******************************************************************************              

//name:             GUA_Battery_Check.c             

//introduce:        电量检测驱动      

//author:           甜甜的大香瓜                     

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.28      

//****************************************************************************** 

#include "stm32f10x.h"

#include "GUA_ADC1.h"

#include "GUA_Battery_Check.h"

 

/*********************宏定义************************/

#define GUA_BATTERY_CHECK_COUNT_PER_COLLECT         5   //每次采集的次数

 

//******************************************************************************        

推荐阅读

史海拾趣

ELM Technology Corporation公司的发展小趣事

在电子行业竞争日益激烈的背景下,ELM Technology Corporation展现出了卓越的市场拓展能力。公司管理层准确把握市场趋势,及时调整产品策略,积极拓展国内外市场。通过与国际知名企业的合作,ELM成功打入国际市场,其产品在多个国家和地区得到了广泛应用。同时,公司还积极寻求与国内企业的合作机会,共同推动电子行业的发展。

Elcoma公司的发展小趣事

随着公司业务的不断发展,Elcoma意识到要进一步拓展市场,必须与国际同行建立合作关系。他们积极寻求与全球知名电子企业的合作机会,通过技术交流和合作研发,不断提升自身的技术水平和市场竞争力。同时,Elcoma还积极参与国际电子展会和论坛,展示公司的最新技术和产品,吸引了众多国际客户的关注。这些国际合作不仅为Elcoma带来了更多的商业机会,也进一步提升了公司的国际影响力。

General Electronic Devices公司的发展小趣事
负责产生控制信号,驱动开关元件按一定频率和占空比工作。
Crystal Semiconductor Corp公司的发展小趣事

随着产品质量的提升和技术创新的积累,Crystal Semiconductor Corp开始积极拓展国内外市场。公司加强了与全球知名企业的合作,通过参加国际展会、举办技术研讨会等方式提升品牌知名度。同时,公司还注重客户服务,积极解决客户在使用过程中遇到的问题,赢得了良好的口碑。

GCi Technologies公司的发展小趣事
如手机、平板电脑、移动电源等。
芯茂微电子公司的发展小趣事

芯茂微电子始终坚持以创新驱动发展,不断投入研发资源,推动技术创新和产品升级。同时,公司积极寻求与国内外知名企业和研究机构的合作,共同开展技术研发和市场拓展。通过与合作伙伴的紧密合作,芯茂微电子在集成电路设计、制造工艺、封装测试等方面取得了重要进展,进一步提升了公司的核心竞争力和市场地位。

问答坊 | AI 解惑

一个按钮通过SetWindowPos( )函数移动了位置,通过ShowWindow(SW_HIDE)却隐藏不了,怪事!

一个按钮通过SetWindowPos( )函数移动了位置,通过ShowWindow(SW_HIDE)却隐藏不了,怪事!…

查看全部问答>

关于对数据总线操作的问题

最近写了个应用程序对数据总线上的数据进行操作,关于物理地址和虚拟地址的映射我知道 假设*vi_adress为映射好的虚拟地址 先是写操作 *vi_adress=tmp  (tmp是数据) 这个操作是成功的 现在我想读取外面从过来的数据 tmp=*vi_adress& ...…

查看全部问答>

问一个比较傻子的问题!硬件中断如何跳转到软件代码

偶菜鸟, 问一个傻子问题,硬件中断如何跳转到软件代码 例如,我有一个键盘,按一下, CPU是如何通过中断服务程序跳转到程序中的代码中? …

查看全部问答>

准备PCB打样还有5CM*6CM的空白位置,有需要的联系我,仅限今日20:00之前

已经有人联系 [ 本帖最后由 rogerangel 于 2011-6-29 22:49 编辑 ]…

查看全部问答>

DDR测试内容与规范

DDR测试内容与规范,不错的资料:  …

查看全部问答>

TI m3 IO的状态

看datasheet上说All GPIO pins are tri-stated by default。请问这个tri-stated是一个什么状态?…

查看全部问答>

小功率LED驱动电源

   保险丝,压敏电阻,热敏电阻,EMI,EMC,整流,PFC,漏极尖峰吸收,IC,电流检测,频率设定,反馈(TL431,光耦,运放),输出.  我现在是在弄电焊机相关方面的工作,可以感觉工作不怎么给力,后听个同学介绍说LED方面还行,这样就自己去学习了下LED ...…

查看全部问答>

[视频分享] Stellaris LaunchPad入门讲座第一课——实验一:LaunchPad内置程序演示

欢迎参加 Stellaris EK-LM4F120XL LaunchPad 入门讲座的在线培训。本次的在线培训将分为多个部分,包括视频讲解和实际的调试操作。第一课介绍了 TI 的 Stellaris LM4F 系列微控制器及其外设和工具。在本章中,您将了解 Stellaris 线路图以及更多 ...…

查看全部问答>

STc单片机外扩RAM具体怎么确定端口地址的,

我想要STC15F2K32S2单片机连接CH372,具体的这个端口地址到底是如何确定的啊?哪位大侠能跟我讲一下,有资料更好,谢谢咯!感激不尽哪!…

查看全部问答>

跪求PLL问题

大神有没有关于74HC4046组成的锁相环电路啊,求原理图啊,,,有的话分享一下哈,不胜感激,我也分享一点资料哈。。。 …

查看全部问答>