云计算百科
云计算领域专业知识百科平台

【MT32F006】MT32F006之ADC

本文最后修改时间: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

八、注意事项

暂无

九、实验结果

暂无

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【MT32F006】MT32F006之ADC
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!