基于STM32F103RC硬件IIC驱动18位AD MCP3421驱动开发

基于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,&parameter,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.625
Voltage;
Measure = Measure *0.001;
printf(“Measure Result Voltage = %fmv\n\r”,Measure);
}

}
/******************************************************/

MCP3421分辨率关系如下:
在这里插入图片描述
采样分辨率与速度配置寄存器如下:
在这里插入图片描述
主函数结构:
在这里插入图片描述
串口打印输出效果:
在这里插入图片描述

完整代码链接如下:
链接:https://pan.baidu.com/s/19cA740a0mt_viNekALRdfg
提取码:11i7
复制这段内容后打开百度网盘手机App,操作更方便哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值