进阶HAL库开发——第一集 :ADC采集

这篇博客介绍了STM32的HAL库在ADC采集方面的进阶知识,包括DMA配置与实现,外接高精度ADC MCP3421的原理及驱动库,模拟IIC的使用,并提供了温度传感器ADC采集的实训案例,涉及DMA和外部18位ADC两种方式。
摘要由CSDN通过智能技术生成

出门右转上一个album入门HAL库开发 :
链接: 基础HAL库ADC采集(上).
链接: 基础HAL库ADC采集(中).
链接: 基础HAL库ADC采集(下)【转载】.

1.进阶知识补充

STM32的内置ADC:
在这里插入图片描述
重要概念:
在这里插入图片描述
了解:
在这里插入图片描述

2.DMA方式

2.1配置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.2实现

1.定义一个全局数组给到DMA来存储ADC多路数据:

uint32_t ADC1_Value_DMA[4];

2.start DMA传输:

  • 在mian里while(1)外【使能连续模式】
  • 在mian里while(1)里【未使能连续模式】
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC1_Value_DMA, 4);//这里的最后一次参数4是代表有4路

还需要把DMA的中断注释掉,否则会一直进中断
这里DMA中断其实没有用,但CubeMx默认给Enable
在这里插入图片描述

3.main里加入校准函数 :

HAL_ADCEx_Calibration_Start(&hadc,0xffffffff);//后面的参数似乎没有用

在这里插入图片描述

3.外接高精度ADC(MCP3421)& iic驱动库

【软件,模拟iic】

3.1 MCP3421 原理图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 MCP3421驱动库:

MCP3421.h
/*******************Define to prevent recursive inclusion **********/
#ifndef __MCP3421_H__
#define __MCP3421_H__ 

#ifdef __cplusplus
extern "C" {
   
#endif
/****************************Includes********************************/
#include "main.h"
#include "port_typ.h"

/****************************定义***********************************/
typedef enum						/* 增益 */
{
   
	gain1 = 0x00 ,                  
	gain2 = 0x01 ,
	gain4 = 0x02 ,
	gain8 = 0x03 
}mcp3421_gain_e ;

typedef enum						/* 转换速率 */
{
   
	rate12bit = 0x00 ,              /* 240SPS */
	rate14bit = 0x04 ,              /* 60SPS */
	rate16bit = 0x08 ,              /* 15SPS */
	rate18bit = 0x0C                /* 3.75SPS */
}mcp3421_rate_e ;

typedef enum						/* 转换模式 */
{
   
	oneshot_mode = 0x00 ,           /* 单次转换模式 */
	continuous_mode = 0x10 ,        /* 连续转换模式 */
}mcp3421_mode_e;

typedef enum						/* 转换标志位 */
{
   
	ready = 0x00 ,                  /*0表示转换结束数据待读取、*/
	nready_or_start = 0x80 ,        /*1表示转换正在进行或启动单次转换*/
}mcp3421_ready_e ;

/**************************定义结构体*************************************/
/** mcp3421结构体
  * 
  * -address 地址————————————————————默认为 MCP3421_ADDR
  * -gain    增益————————————————————默认为1倍增益 
  【可取1、2、4、8】 @ref mcp3421_gain_e
  * -sampling_rate 采样率————————————默认3.75 SPS (18 bits) 
  【可取240 SPS (12 bits)、60 SPS (14 bits)、15 SPS (16 bits)】@ref mcp3421_rate_e
  *	-conversion_mode 转换模式————————默认One-Shot Conversion 
  【可取Continuous Conversion、One-Shot Conversion】@ref mcp3421_mode_e
  * -ready_flag 状态标志位
  * 【 0表示转换结束数据待读取、1表示转换正在进行或启动单次转换 】@ref mcp3421_ready_e
  */
  
#define MCP3421_ADDR 0x68
typedef struct
{
   
	uint8_t address ;
	uint8_t gain ;
	uint8_t sampling_rate ;
	uint8_t conversion_mode ;
	uint8_t ready_flag ;
}mcp3421_s ;

/*******************************************************
* FunctionName   : mcp3421_init()
* Description    : 初始化mcp3421,完成iic硬件初始化和mcp3421参数的基本配置
* EntryParameter :  mcp mcp3421句柄
* ReturnValue    : None
********************************************************/
void mcp3421_init ( mcp3421_s* mcp) ; 
/*******************************************************
* FunctionName   : mcp3421_write_xxx()
* Description    : 修改mcp3421的xxx,在调用mcp3421_one_conversion函数时完成参数的正式写入
* EntryParameter :  mcp mcp3421句柄、xxx
* ReturnValue    : None
********************************************************/
void mcp3421_write_rate ( mcp3421_s* mcp, uint8_t rate) ;	
void mcp3421_write_gain ( mcp3421_s* mcp, uint8_t gain) ;		
void mcp3421_write_mode ( mcp3421_s* mcp, uint8_t mode) ;	
void mcp3421_write_flag ( mcp3421_s* mcp, uint8_t flag) ;			
/*******************************************************
* FunctionName   : mcp3421_read_xxx()
* Description    : 读取mcp3421的xxx
* EntryParameter :  mcp mcp3421句柄
* ReturnValue    : 返回mcp3421的xxx
********************************************************/
uint8_t mcp3421_read_gain ( mcp3421_s* mcp) ;		
uint8_t mcp3421_read_rate ( mcp3421_s* mcp) ;	
uint8_t mcp3421_read_mode ( mcp3421_s* mcp) ;	
uint8_t mcp3421_read_flag ( mcp3421_s* mcp) ;		
/*******************************************************
* FunctionName   : mcp3421_one_conversion()
* Description    : 设置mcp3421为单次转换并读取转换后的数据, 使用mcp中的参数配置mcap3421并开始单次转换
* EntryParameter :  mcp mcp3421句柄
* ReturnValue    : 转换结果,单位为V,范围-2.048--+(2.048-1LSB)
********************************************************/
float mcp3421_one_conversion( mcp3421_s* mcp) ;			
/*******************************************************
* FunctionName   : mcp3421_continuous_conversion()
* Description    : 设置mcp3421为连续转换并读取转换后的数据,使用mcp中的参数配置mcap3421并开始连续转换
* EntryParameter :  mcp mcp3421句柄
* ReturnValue    : 转换结果,单位为V,范围-2.048--+(2.048-1LSB)
********************************************************/
void mcp3421_continuous_conversion ( mcp3421_s* mcp, uint8_t times, float *adval) ;
【没实现呢还^0^
MCP3421.c
/**************************Includes*************************************/
#include "mcp3421.h" 
#include "port_iic.h"
/*************************函数实现************************************/
/* MCP3421初始化 */
void mcp3421_init ( mcp3421_s* mcp)
{
   	
	mcp->address = MCP3421_ADDR ;
	mcp->gain = gain1 ;
	mcp->sampling_rate = rate18bit ;
	mcp->conversion_mode = oneshot_mode ; 
	mcp->ready_flag = nready_or_start ;
	
	iic_init() ;//初始化iic
}

/* 修改增益 */
void mcp3421_write_gain ( mcp3421_s* mcp, uint8_t gain)						
{
   
	mcp->gain = gain ;
}

/* 修改采样率 */
void mcp3421_write_rate ( mcp3421_s* mcp, uint8_t rate)
{
   	
	mcp->sampling_rate = rate ;
}

/* 修改转换模式 */
void mcp3421_write_mode ( mcp3421_s* mcp, uint8_t mode)
{
   
	mcp->conversion_mode = mode ;
}

/* 修改转换标志位 */
void mcp3421_write_flag ( mcp3421_s* mcp, uint8_t flag)
{
   
	mcp->ready_flag = flag ;
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值