ADC芯片3421驱动程序
#ifndef MCP3421_H
#define MCP3421_H
#include "common.h"typedef enum mcp_div
{mcp_div_12 = 0,mcp_div_14,mcp_div_16,mcp_div_18,
}mcp_div_e;
typedef enum mcp_amp
{mcp_amp_x1 = 0,mcp_amp_2,mcp_amp_4,mcp_amp_8,
}mcp_amp_e;//获取ADC转换结果
float mcp3421_get_val();//int mcp3421_set(u8 div,u8 amp);
int mcp3421_set(mcp_div_e div,mcp_amp_e amp);
int mcp3421_wr_data(unsigned char data);
unsigned int mcp3421_rd_data();
u8 mcp3421_config_data();
int select_res(char sw,char num);#endif
#include "mcp3421.h"
#include "myiic.h"
#include "main.h"#define VOL_REF (2.048*2)
#define MAX_18BIT (0x3FFFF)
#define MAX_16BIT (0xFFFF)
#define MAX_14BIT (0x3FFF)
#define MAX_12BIT (0xFFF)
u8 mcp_busy = 0;
static mcp_div_e mcp_div = mcp_div_12;
static mcp_amp_e mcp_amp = mcp_amp_x1;
u32 mcp_data = 0;
//获取ADC转换为电压的结果
float mcp3421_get_val()
{mcp_data = 0xFFFFFFFF;do{mcp_data = mcp3421_rd_data();}while(mcp_data == 0xFFFFFFFF);
// if(mcp_data != 0xFFFFFFFF)switch(mcp_div){case mcp_div_18:return VOL_REF*mcp_data/MAX_18BIT;break;case mcp_div_16://mcp_data -= 100;return VOL_REF*mcp_data/MAX_16BIT;break;case mcp_div_14:return VOL_REF*mcp_data/MAX_14BIT;break;case mcp_div_12:return VOL_REF*mcp_data/MAX_12BIT;break;default:return -1;break;}
// else
// return -1;}float mcp3421_get_ad_avg(int times)
{float ad_data=0;while(times--){ad_data = mcp3421_get_val();}return ad_data/times;
}
//设置分辨率和输入端放大倍数
/*
div:
0 :12bit 240 SPS
1 :14bit 60 SPS
2 :16bit 15 SPS
3 :18bit 3.75 SPS
amp:
0 :x1
1 :x2
2 :x4
3 :x8
*/
u8 reg = 0;
int mcp3421_set(mcp_div_e div,mcp_amp_e amp)
{if(div < 4 && amp < 4){reg=(div<<2)+0x90;reg += amp&0x03;mcp3421_wr_data(reg);mcp_div = div;mcp_amp = amp;}return 0;
}//向MCP3421写入一字节数据
static int mcp3421_wr_data(unsigned char data)
{int ack = 1;IIC_Start(); //启动总线IIC_Send_Byte(0xD0); //发送器件地址ack = IIC_Wait_Ack();IIC_Send_Byte(data); //发送器件分地址ack = IIC_Wait_Ack();IIC_Stop(); //释放总线return ack;}
//返回采样数据//读取成功:返回ADC原始数值
//失败返回:0xFFFFFFFF
unsigned int mcp3421_rd_data()
{u8 elec1, elec2, elec3;IIC_Start(); //启动总线IIC_Send_Byte(0xD1); //发送器件地址IIC_Wait_Ack();elec1 = IIC_Read_Byte(1); elec2 = IIC_Read_Byte(1); elec3 = IIC_Read_Byte(1); mcp_busy = IIC_Read_Byte(0);IIC_Stop(); //释放总线
// debug_info("MCP3241 data:\r\n");
// debug_info("B1:%x\r\n",elec1);
// debug_info("B2:%x\r\n",elec2);
// debug_info("B3:%x\r\n",elec3);
// debug_info("BUSY:%x\r\n",mcp_busy);if(mcp_div == mcp_div_18){ if((mcp_busy & 0x80) == 0x80)//(mcp_busy & 0x80) == 0x80{return 0xFFFFFFFF;}}else{if((elec3 & 0x80) == 0x80)//(mcp_busy & 0x80) == 0x80{return 0xFFFFFFFF;}} switch(mcp_div){case mcp_div_18:return ((u32)((u32)elec1 << 16 | (u32)elec2 << 8 | elec3)) & 0x03FFFF;break;case mcp_div_16:return ((u32)((u32)elec1 << 8 | (u32)elec2 )) & 0xFFFF;break;case mcp_div_14:return ((u32)((u32)elec1 << 8 | (u32)elec2 )) & 0x3FFF;break;case mcp_div_12:return ((u32)((u32)elec1 << 8 | (u32)elec2 )) & 0xFFF;break;default:return 0xFFFFFFFF;break;}}u8 mcp3421_config_data()
{mcp3421_rd_data();return mcp_busy;
}
ADC芯片3421驱动程序相关推荐
- 【STM32】TCL2543CN 12位11通道ADC芯片stm驱动程序,使用32自带SPI实现
不是模拟SPI,使用stm32硬件SPI实现.TLC2543数据手册 有需要的可以Fork一下,谢谢. Here: TLC2543_STM32 极性 CPOL = 0 CPHA = 0 引脚 PP15 ...
- 驱动编程简单教程——PTC512(ADC芯片驱动)为例
1.简介 上几周硬件找了一个ADC芯片的替代料,需要我这边写一个驱动做测试.以前都是配置与修改设备树,最多查看或小改一下驱动,没有写过驱动,所有记录一下思路.大致思路就是先看原理图,再看芯片手册,知道 ...
- ADC芯片参数测试技术解析
随着数字技术的不断发展和计算机在信号处理.控制等领域中的广泛应用,过去由模拟电路实现的工作,今天越来越多地由数字电路或计算机来处理.作为模拟与数字之间的桥梁,模拟数字转换器(ADC)的重要性越来越突出 ...
- 瑞盟MS2358 96KHz、24bit音频ADC芯片--DFN12 封装
瑞盟MS2358 96KHz.24bit音频ADC芯片 MS2358是带有采样速率8kHz-96kHz的立体声音频模数转换器,适合于面向消费者的专业音频系统. 通过使用增强型双位Δ-∑技术来实现其高精 ...
- 关于ADC芯片的选型
关于ADC芯片的选型,还是其他芯片的选型,那都不是随随便便就说了算得. 关于选型,各大厂家也给出了系列芯片的选型手册,但是手册中那么多芯片型号和参数,哪些参数是要关注的,怎么快速地选择符合我们项目用到 ...
- SMT32同步采样ADC芯片ADS8329 | 立创开源
ADS8329 是一款具有单极性输入的低功耗.16 位.1MSPS 模数转换器 (ADC),同时具有采样保持功能. 电路板文件和STM32程序文件在立创开源平台,开源地址:https://oshwhu ...
- 模拟前端ADC芯片LH001-91,用于开发心电、脑电医疗设备
LH001-91是针对于心电.脑电等医疗设备开发的模拟前端ADC芯片,该芯片具有低功耗.高精度.低成本等特点,已被医疗行业众多公司接受,成为国内唯一可通过医疗认证ADC产品.以下是对模拟前端ADC L ...
- 以CS1231为例,解释电子方案开发中的ADC芯片
在大多数的电子PCBA方案开发中,我们都需要利用转换器将模拟信号转换为数字信号,以方便记录和处理数据和文件.而作为桥梁的转换器我们通常称之为模拟转换器,也叫ADC芯片. ADC芯片是指将连续变化的模拟 ...
- adc芯片分享,人体脂肪秤芯片CS1256
人体脂肪秤算是近两年来较热门的电子秤产品.其原因在于科技的快速发展使得我们对自身的身体数据越来越看重,脂肪秤可帮助我们测量人体的脂肪量并通过精准数据展现出来. 任何的电子产品功能都需要使用做PCBA方 ...
最新文章
- Codeforces681D Gifts by the List
- java反射实例_关于java反射的一个案例
- boost::safe_numerics模块实现隐式转换更改数据值的测试程序
- 一个获取a标签传值的函数
- 本地构建和自动化构建_构建自动化面板
- 【飞秋教程】查找/备份/还原
- 《剑指Offer》 合并两个排序的链表
- WPF触发器(Trigger)
- 微型计算机由5大部分,微机原理答案 (5)
- 成功修复2G金士顿U盘
- Linux中如何判断一个另外进程是否活着
- 语音端点检测整理 VAD
- 变压器励磁模型 Matlab/simulink 可用于模拟电压暂降等电能质量问题
- 判断windows系统类型和IE浏览器版本
- mysql提权方式linux_Linux提权的几种常用方式
- 广东省电子商务认证有限公司
- 怎样才能彻底地删除多余输入法软件
- 虚拟机VMware安装Ubuntu
- C语言/771.宝石与石头
- 天基实业理财要学会变通
热门文章
- 最新、最全、最详细的 MySQL 数据库学习笔记总结(2021最新版)
- 【毕业设计】SSM校园求职招聘系统的设计与实现
- [计算模型]%90的银弹
- vue echerts 中国地图热力图
- 苹果Macbook Air怎么安装Win7系统图解教程
- 2022-2028全球与中国交通领域的生物识别市场现状及未来发展趋势
- 【海康威视】前端开发:【4】Chrome谷歌浏览器 Web Components Kit 插件支持
- html中秋节网页,中秋节.html
- LED显示屏组装常见故障及解决方案
- Field redisTemplate in com.xxxx.utils.RedisCacheRepository required a bean of type .xxxxxx