本文最后修改时间:2024年04月19日
一、本节简介
本文介绍如何使用MT32F006的ADC采集电量。
二、实验平台
库版本:V1.0.0
编译软件:MDK5.37
硬件平台:MT32F006开发板(主芯片MT32F006)
仿真器:JLINK
三、版权声明
1)作者:甜甜的大香瓜
2)声明:喝水不忘挖井人,转载请注明出处。
3)本文出处:原创连载资料《简单粗暴学MT32F006》
四、实验前提
1、在进行本文步骤前,请先阅读以下章节:
1)《简单粗暴学MT32F006》的“第一章和第二章”章节。
2、在进行本文步骤前,请先实现以下章节:
暂无
五、基础知识
暂无
六、硬件原理
![]()
注意:
1、之所以要1/3分压,是因为锂电池充满时是4.2v,而ADC的内部参考电压是2v,所以4.2v分压后才能在2v范围内被测量到。
2、之所以要用1M和510K这种大电阻,是因为能降低内阻从而降低功耗。
七、实验步骤
1、编写并添加驱动
1)编写驱动GUA_ADC.c(存放在“……\\Projects\\MT006_StdPeriph_Templates\\GUA”)
|
//********************************************************************** //name: GUA_ADC.c //introduce: ADC驱动 //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2023.11.30 //********************************************************************** #include "mt006.h" #include "GUA_ADC.h"
/*********************宏定义************************/ #define GUA_ADC_CLKDIV 7 //96/14/7=0.98M #define GUA_BATTERY_CHECK_COUNT_PER_COLLECT 5 //每次采集的次数
//********************************************************************** //name: GUA_ADC_Init //introduce: ADC初始化 //parameter: none //return: adc采集值 //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2023.11.30 //********************************************************************** float GUA_ADC_Read(void) { float nGUA_Battery_Check_Value = 0; GUA_U16 nGUA_Num = 0;
//采集GUA_BATTERY_CHECK_COUNT_PER_COLLECT次,累加采集的电量值 for(nGUA_Num = 0; nGUA_Num < GUA_BATTERY_CHECK_COUNT_PER_COLLECT; nGUA_Num++) { //Conversion per 50ms ADC_StartOfConversion();
while(ADC_GetITStatus(ADC_IT_EOSEQ) != SET); ADC_ClearITPendingBit(ADC_IT_EOSEQ);
//累加读取adc的转换值 nGUA_Battery_Check_Value += ADC_GetConversionValue(ADC_Channel_12); }
//求出电量平均值 nGUA_Battery_Check_Value /= GUA_BATTERY_CHECK_COUNT_PER_COLLECT;
//返回 return nGUA_Battery_Check_Value; }
//********************************************************************** //name: GUA_ADC_Init //introduce: ADC初始化 //parameter: none //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2023.04.18 //********************************************************************** void GUA_ADC_Init(GUA_U8 nGUA_ADC_PowerControl) { GUA_U32 nGUA_ADC_Delay = 0;
ADC_InitTypeDef ADC_InitStructure;
//上电 if(nGUA_ADC_PowerControl == GUA_ADC_POWER_ON) { //PowerDown digital function GPIO_ANAConfig(GPIO1, GPIO_Pin_7, ENABLE);
//PownOn ADC Analog switch RCC_PDRUNConfig(RCC_PDCFG_ADC, RCC_PDCFG_POWER_ON);
//ADC clock — Main clock / (GUA_ADC_CLKDIV * 14) RCC_SETCLKDivider(RCC_CLOCKFREQ_ADCCLK, GUA_ADC_CLKDIV);
//PowerOn ADC clock RCC_APBPeriphClockCmd(RCC_AHBCLKCTRL_ADC, ENABLE);
//DeInit ADC_DeInit();
//Initialize ADC_StructInit(&ADC_InitStructure); ADC_Init(&ADC_InitStructure);
//2V ADC_ReferenceVoltageConfig(ADC_REF_VOLTAGE_2V);
//Disable discontinuous mode ADC_DiscModeCmd(DISABLE);
//Cover previous data ADC_OverrunModeCmd(ENABLE);
//Enable channle(ADC0~6->PIO0_1~PIO0_7; ADC7~13->PIO1_0 PIO1_1 PIO1_4~PIO1_7 PI02_0) ADC_ChannelConfig(ADC_Channel_12);
//ADC EOSEQ interrupt ADC_ITConfig(ADC_IT_EOSEQ, ENABLE);
//Delay ms for(nGUA_ADC_Delay=0; nGUA_ADC_Delay<0x2000; nGUA_ADC_Delay++); } //掉电 else { //PowerDown ADC Analog switch RCC_PDRUNConfig(RCC_PDCFG_ADC, RCC_PDCFG_POWER_DOWN);
//PowerOn ADC clock RCC_APBPeriphClockCmd(RCC_AHBCLKCTRL_ADC, DISABLE);
} } |
2)编写驱动头文件GUA_ADC.h
(存放在“……\\Projects\\MT006_StdPeriph_Templates\\GUA”)
|
//********************************************************************** //name: GUA_ADC.h //introduce: ADC驱动的头文件 //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2023.04.18 //********************************************************************** #ifndef _GUA_ADC_H_ #define _GUA_ADC_H_
/*********************宏定义************************/ //类型宏 #ifndef GUA_C typedef char GUA_C; #endif
#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
//ADC电源控制的宏 #define GUA_ADC_POWER_ON 0 //上电 #define GUA_ADC_POWER_OFF 1 //掉电
/*********************外部函数声明************************/ extern float GUA_ADC_Read(void); extern void GUA_ADC_Init(GUA_U8 nGUA_ADC_PowerControl);
#endif |
3)工程中添加驱动文件

4)在MDK设置中添加驱动源文件路径

2、添加库的驱动
1)添加库的驱动文件(为了方便一次性都添加进来,已有则不用添加)
2)添加库的驱动头文件(mt006_conf.h 中)(为了方便一次性都添加进来,已有则不用添加)

3、在应用层中调用
1)添加驱动头文件(main.c中)
|
#include "GUA_ADC.h" |
2)添加测试代码(main.c的main函数中)
|
//电量采集初始化 GUA_ADC_Init(GUA_ADC_POWER_ON); gGUA_ADC_Battery = (float)GUA_ADC_Read()*302/208896; //y/2v=x/4096,电压值y再根据分压电路乘以1510/510->(GUA_ADC_Read()*2/4096)*151/51 |
八、注意事项
暂无
九、实验结果
暂无
网硕互联帮助中心



评论前必须登录!
注册