#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驱动程序相关推荐

  1. 【STM32】TCL2543CN 12位11通道ADC芯片stm驱动程序,使用32自带SPI实现

    不是模拟SPI,使用stm32硬件SPI实现.TLC2543数据手册 有需要的可以Fork一下,谢谢. Here: TLC2543_STM32 极性 CPOL = 0 CPHA = 0 引脚 PP15 ...

  2. 驱动编程简单教程——PTC512(ADC芯片驱动)为例

    1.简介 上几周硬件找了一个ADC芯片的替代料,需要我这边写一个驱动做测试.以前都是配置与修改设备树,最多查看或小改一下驱动,没有写过驱动,所有记录一下思路.大致思路就是先看原理图,再看芯片手册,知道 ...

  3. ADC芯片参数测试技术解析

    随着数字技术的不断发展和计算机在信号处理.控制等领域中的广泛应用,过去由模拟电路实现的工作,今天越来越多地由数字电路或计算机来处理.作为模拟与数字之间的桥梁,模拟数字转换器(ADC)的重要性越来越突出 ...

  4. 瑞盟MS2358 96KHz、24bit音频ADC芯片--DFN12 封装

    瑞盟MS2358 96KHz.24bit音频ADC芯片 MS2358是带有采样速率8kHz-96kHz的立体声音频模数转换器,适合于面向消费者的专业音频系统. 通过使用增强型双位Δ-∑技术来实现其高精 ...

  5. 关于ADC芯片的选型

    关于ADC芯片的选型,还是其他芯片的选型,那都不是随随便便就说了算得. 关于选型,各大厂家也给出了系列芯片的选型手册,但是手册中那么多芯片型号和参数,哪些参数是要关注的,怎么快速地选择符合我们项目用到 ...

  6. SMT32同步采样ADC芯片ADS8329 | 立创开源

    ADS8329 是一款具有单极性输入的低功耗.16 位.1MSPS 模数转换器 (ADC),同时具有采样保持功能. 电路板文件和STM32程序文件在立创开源平台,开源地址:https://oshwhu ...

  7. 模拟前端ADC芯片LH001-91,用于开发心电、脑电医疗设备

    LH001-91是针对于心电.脑电等医疗设备开发的模拟前端ADC芯片,该芯片具有低功耗.高精度.低成本等特点,已被医疗行业众多公司接受,成为国内唯一可通过医疗认证ADC产品.以下是对模拟前端ADC L ...

  8. 以CS1231为例,解释电子方案开发中的ADC芯片

    在大多数的电子PCBA方案开发中,我们都需要利用转换器将模拟信号转换为数字信号,以方便记录和处理数据和文件.而作为桥梁的转换器我们通常称之为模拟转换器,也叫ADC芯片. ADC芯片是指将连续变化的模拟 ...

  9. adc芯片分享,人体脂肪秤芯片CS1256

    人体脂肪秤算是近两年来较热门的电子秤产品.其原因在于科技的快速发展使得我们对自身的身体数据越来越看重,脂肪秤可帮助我们测量人体的脂肪量并通过精准数据展现出来. 任何的电子产品功能都需要使用做PCBA方 ...

最新文章

  1. Codeforces681D Gifts by the List
  2. java反射实例_关于java反射的一个案例
  3. boost::safe_numerics模块实现隐式转换更改数据值的测试程序
  4. 一个获取a标签传值的函数
  5. 本地构建和自动化构建_构建自动化面板
  6. 【飞秋教程】查找/备份/还原
  7. 《剑指Offer》 合并两个排序的链表
  8. WPF触发器(Trigger)
  9. 微型计算机由5大部分,微机原理答案 (5)
  10. 成功修复2G金士顿U盘
  11. Linux中如何判断一个另外进程是否活着
  12. 语音端点检测整理 VAD
  13. 变压器励磁模型 Matlab/simulink 可用于模拟电压暂降等电能质量问题
  14. 判断windows系统类型和IE浏览器版本
  15. mysql提权方式linux_Linux提权的几种常用方式
  16. 广东省电子商务认证有限公司
  17. 怎样才能彻底地删除多余输入法软件
  18. 虚拟机VMware安装Ubuntu
  19. C语言/771.宝石与石头
  20. 天基实业理财要学会变通

热门文章

  1. 最新、最全、最详细的 MySQL 数据库学习笔记总结(2021最新版)
  2. 【毕业设计】SSM校园求职招聘系统的设计与实现
  3. [计算模型]%90的银弹
  4. vue echerts 中国地图热力图
  5. 苹果Macbook Air怎么安装Win7系统图解教程
  6. 2022-2028全球与中国交通领域的生物识别市场现状及未来发展趋势
  7. 【海康威视】前端开发:【4】Chrome谷歌浏览器 Web Components Kit 插件支持
  8. html中秋节网页,中秋节.html
  9. LED显示屏组装常见故障及解决方案
  10. Field redisTemplate in com.xxxx.utils.RedisCacheRepository required a bean of type .xxxxxx