基于STM32 HAL库硬件IIC 驱动18位AD MCP3421
最近用到小信号采集,发现关于该芯片的STM32 HAL 库驱动比较少。就写了一个基于STM32F103RCT6测试Demo 。在此分享给大家。本人水平有限,欢迎各位老师批评指正。
STM32CubeMX配置如下:
调试接口如下:
定时器配置如下:
本例程用的是裸机时间查询方式。用定时器6中断方式。
配置参数之后,使能中断
配置中断优先级
配置硬件IIC1接口:
配置串口:
配置系统状态指示灯:
用户根据自己实际情况配置,本例PD2用于指示系统运行。
系统时钟配置
配置项目
生成项目:
代码部分
建立MCP3421的c文件和h文件
1、h文件说明如下
#ifndef _MCP3421_H
#define _MCP3421_H
#include “main.h”
#define MCP3421ADDR (0xD0) //MCP3421 地址
void MCP3421_Init(void); //MCP3421初始化
uint32_t MCP3421_Get_Value(void); //采集ADC数字值
void Voltage_Convert(void); //将数字量转换为电压值支持正负显示
#endif
2、C文件如下:
#include “mcp3421.h”
#include “usart.h”
#include “i2c.h”
/***************************************************************************/
void MCP3421_Init(void)
{
if(HAL_I2C_IsDeviceReady(&hi2c1,MCP3421ADDR,5,100)==HAL_OK)
// if(!HAL_I2C_IsDeviceReady(&hi2c1,MCP3421ADDR,5,100))
{
printf(“MCP3421 is ok.\n\r”);
}
else
{
printf(“MCP3421 is error.\n\r”);
}
uint8_t parameter = 0x9c; //系统参数配置为18位精度,自动转换模式,无PGA增益。配置字见数据手册。
HAL_I2C_Master_Transmit(&hi2c1,MCP3421ADDR,¶meter,1,100);
HAL_Delay(5);
while(HAL_I2C_IsDeviceReady(&hi2c1,MCP3421ADDR,5,100))
{
HAL_Delay(5);
}
printf (“MCP3421 RESET is OK.\n\r”);
}
/************************************************************************/
uint32_t MCP3421_Get_Value(void)
{
uint32_t ADC_Value;
uint8_t Adc_Temp[3]={0};
if(HAL_I2C_IsDeviceReady(&hi2c1,MCP3421ADDR,5,100)==HAL_OK)
{
HAL_I2C_Master_Receive(&hi2c1,MCP3421ADDR,Adc_Temp,3,100);
ADC_Value = Adc_Temp[0];
ADC_Value&=0x03;
ADC_Value<<=8;
ADC_Value+= Adc_Temp[1];
ADC_Value<<=8;
ADC_Value+= Adc_Temp[2];
}
else
{
}
return ADC_Value;
}
/*****************************************************************/
void Voltage_Convert(void)
{
uint32_t Voltage;
float Measure;
Voltage = MCP3421_Get_Value();
printf(“Voltage = %d\n\r”,Voltage);
if((Voltage&0x00020000)==0x00020000) //判断最高位符号位是否为为1;为“1”则为负电压
{
Voltage&=0x0001ffff;
Voltage=(~Voltage)+1;
Voltage &=0x0001ffff;
Measure = 15.625*Voltage; //15.625为18位分辨率的精度。其他分辨率的精度见数据手册。
Measure = Measure 0.001;
printf(“Measure Result Voltage = -%fmv\n\r”,Measure);
}
else //为“0”则正电压直接转换
{
Voltage&=0x0001ffff;
Measure = 15.625Voltage;
Measure = Measure *0.001;
printf(“Measure Result Voltage = %fmv\n\r”,Measure);
}
}
/******************************************************/
MCP3421分辨率关系如下:
采样分辨率与速度配置寄存器如下:
主函数结构:
串口打印输出效果:
完整代码链接如下:
链接:https://pan.baidu.com/s/19cA740a0mt_viNekALRdfg
提取码:11i7
复制这段内容后打开百度网盘手机App,操作更方便哦