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;
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA(现场可编程逻辑门阵列)和ADC(模数转换器)是常用于电子系统设计的两个关键组件。下面我将简要介绍一下FPGA和ADC驱动程序。 1. FPGA的驱动程序: FPGA的驱动程序主要用于配置和控制FPGA芯片,以实现特定的功能。这些驱动程序可以通过编程语言(如VHDL、Verilog等)开发,通常采用硬件描述语言(HDL)来描述FPGA的逻辑电路。驱动程序开发过程涉及到FPGA的时钟设置、输入输出端口的定义和配置等。在设计FPGA的驱动程序时,需要根据具体的应用需求编写适当的逻辑电路,确保FPGA能够正确地响应输入信号并产生预期的输出。 2. ADC驱动程序ADC驱动程序主要用于控制ADC芯片,并实现模拟信号到数字信号的转换。驱动程序通常包括初始化ADC芯片、控制采样速率和分辨率、获取转换结果等功能。开发ADC驱动程序可以使用低级编程语言(如C、C++等),也可以使用硬件描述语言(HDL)进行开发驱动程序通常需要与硬件电路相结合,通过读取和写入芯片内部寄存器的方式实现对ADC的控制和配置。 总而言之,FPGA的驱动程序主要用于配置和控制FPGA芯片,以实现特定的逻辑功能;ADC驱动程序则负责控制ADC芯片,并实现模拟信号到数字信号的转换。这两个驱动程序在设计和开发过程中需要根据具体的应用需求进行定义和配置,以确保系统能够正常工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值