历史上的今天
今天是: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 //每次采集的次数
//******************************************************************************
下一篇:STM32之霍尔传感器模块
史海拾趣
|
一个按钮通过SetWindowPos( )函数移动了位置,通过ShowWindow(SW_HIDE)却隐藏不了,怪事! 一个按钮通过SetWindowPos( )函数移动了位置,通过ShowWindow(SW_HIDE)却隐藏不了,怪事!… 查看全部问答> |
|
最近写了个应用程序对数据总线上的数据进行操作,关于物理地址和虚拟地址的映射我知道 假设*vi_adress为映射好的虚拟地址 先是写操作 *vi_adress=tmp (tmp是数据) 这个操作是成功的 现在我想读取外面从过来的数据 tmp=*vi_adress& ...… 查看全部问答> |
|
偶菜鸟, 问一个傻子问题,硬件中断如何跳转到软件代码 例如,我有一个键盘,按一下, CPU是如何通过中断服务程序跳转到程序中的代码中? … 查看全部问答> |
|
保险丝,压敏电阻,热敏电阻,EMI,EMC,整流,PFC,漏极尖峰吸收,IC,电流检测,频率设定,反馈(TL431,光耦,运放),输出. 我现在是在弄电焊机相关方面的工作,可以感觉工作不怎么给力,后听个同学介绍说LED方面还行,这样就自己去学习了下LED ...… 查看全部问答> |
|
[视频分享] Stellaris LaunchPad入门讲座第一课——实验一:LaunchPad内置程序演示 欢迎参加 Stellaris EK-LM4F120XL LaunchPad 入门讲座的在线培训。本次的在线培训将分为多个部分,包括视频讲解和实际的调试操作。第一课介绍了 TI 的 Stellaris LM4F 系列微控制器及其外设和工具。在本章中,您将了解 Stellaris 线路图以及更多 ...… 查看全部问答> |
|
我想要STC15F2K32S2单片机连接CH372,具体的这个端口地址到底是如何确定的啊?哪位大侠能跟我讲一下,有资料更好,谢谢咯!感激不尽哪!… 查看全部问答> |




