进阶ADC采集
出门右转上一个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 ;