CH32驱动国产24位ADC-合泰BH45B1225

2023-10-13 23:10

本文主要是介绍CH32驱动国产24位ADC-合泰BH45B1225,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、BH45B1225?
  • 二、使用步骤
    • 1.BH45B1225.C
    • 2.BH45B1225.h
    • 总结


前言

BH45B1225 是一款内建可编程增益放大器的多通道24-bit的Delta Sigma A/D转换器,专门为与模拟信号差分接口应用而设计。该芯片具有低噪声和高精度的性能,并可通过内部 I2C 总线与外部硬件进行通信。这种功能高度集成的 Delta Sigma A/D 转换器具有高精度和低功耗的规格,为与外部传感器的接口提供了卓越的解决方案,特别适用于电池供电应用。
在这里插入图片描述


一、BH45B1225?

CH32软件I2C驱动24位ADC,BH45B1225.
BH45B1225是24位ADC,有效位数最高为21.5bit,可差分可单端,内部含有1.25v参考基准,RC振荡器,10SPS时对50HZ60HZ工频干扰有陷波器作用,以降低成本。
本程序使用单端采集内部基准,AN0连接ch32-dac,AN1内部通道选择VCM,数据传输率为10SPS。

二、使用步骤

1.BH45B1225.C

代码如下(示例):

#include "BH45B1225.h"
#include "MyI2C.h"
#include "debug.h"
/**SOP-8,ADDRESS -->0XD0*NSOP-16*XTSB=0,ADDRESS-->0XA0*XTSB=1 0SC2  OSC1   ADDRESS*        0     0       0XA0*        0     1       0XB0*        1     0       0XC0*        1     1       0XD0
*/
//#define BH45B1225_ADDRESS		0xA0
//#define BH45B1225_ADDRESS		0xB0
//#define BH45B1225_ADDRESS		0xC0
#define BH45B1225_ADDRESS		0xD0/**********寄存器设置*************/\
#define VR  1.25
#define LSB  VR/8388608
#define PGAGN  1
#define ADGN  1
#define VREFGN 1
#define DCSET 0void BH45B1225_WriteReg(uint8_t RegAddress, uint8_t Data)
{MyI2C_Start();MyI2C_SendByte(BH45B1225_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(RegAddress);MyI2C_ReceiveAck();MyI2C_SendByte(Data);MyI2C_ReceiveAck();MyI2C_Stop();
}
uint8_t BH45B1225_ReadReg(uint8_t RegAddress)
{uint8_t Data;MyI2C_Start();MyI2C_SendByte(BH45B1225_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(RegAddress);MyI2C_ReceiveAck();MyI2C_Start();MyI2C_SendByte(BH45B1225_ADDRESS | 0x01);MyI2C_ReceiveAck();Data = MyI2C_ReceiveByte();MyI2C_SendAck(1);MyI2C_Stop();return Data;
}
void BH45B1225_Temptuer_Init()
{//内部基准温度传感器MyI2C_Init();                      //I2C初始化BH45B1225_WriteReg(BH45B1225_HIRCC,0X01);while(!(BH45B1225_ReadReg(BH45B1225_HIRCC) & (1 << 1)));   //内部osc稳定BH45B1225_WriteReg(BH45B1225_PWRC,0x80);//使能VCMBH45B1225_WriteReg(BH45B1225_ADCR0,0X02);BH45B1225_WriteReg(BH45B1225_PGAC0,0X00);BH45B1225_WriteReg(BH45B1225_PGAC1,0X40);BH45B1225_WriteReg(BH45B1225_ADCS,0X1F);BH45B1225_WriteReg(BH45B1225_ADCR0,0X02);BH45B1225_WriteReg(BH45B1225_ADCR1,0X40);BH45B1225_WriteReg(BH45B1225_PGACS,0X3F);//00101110BH45B1225_WriteReg(BH45B1225_ADCR0,0X02);BH45B1225_WriteReg(BH45B1225_ADCR0,0X82);BH45B1225_WriteReg(BH45B1225_ADCR0,0X02);
}void BH45B1225_Init()
{MyI2C_Init();                      //I2C初始化BH45B1225_WriteReg(BH45B1225_HIRCC,0X01);while(!(BH45B1225_ReadReg(BH45B1225_HIRCC) & (1 << 1)));   //内部osc稳定BH45B1225_WriteReg(BH45B1225_PWRC,0x80);//使能VCMBH45B1225_WriteReg(BH45B1225_ADCR0,0X02);//正常模式,设置采样率,参考选择BH45B1225_WriteReg(BH45B1225_PGAC0,0X00);//参考增益1,差分信号增益1,差分通道增益1.BH45B1225_WriteReg(BH45B1225_PGAC1,0X00);//使能选择差分通道BH45B1225_WriteReg(BH45B1225_ADCS,0X1F);//Fmclk=FsysBH45B1225_WriteReg(BH45B1225_ADCR0,0X02);//关闭暂停和休眠模式BH45B1225_WriteReg(BH45B1225_ADCR1,0X00);//时钟分频,使能AD数据锁存BH45B1225_WriteReg(BH45B1225_PGACS,0X30);//00101110 差分通道选择,单通道模式正相通道AN0,反相通道VCMBH45B1225_WriteReg(BH45B1225_ADCR0,0X02);//拉低BH45B1225_WriteReg(BH45B1225_ADCR0,0X82);//复位ADC准备转换数据BH45B1225_WriteReg(BH45B1225_ADCR0,0X02);//拉低}
uint8_t BH45B1225_EOC_FLAG()
{if(BH45B1225_ReadReg(BH45B1225_ADCR1) & ( 1 << 1 )){return 1;}else return 0;
}
float BH45B1225_Get_temp()
{u8 DataH,DataM,DataL;float Voltage;u32 DATA_Value;while(!BH45B1225_EOC_FLAG());     //等待EOC置1转换完成{BH45B1225_WriteReg(BH45B1225_ADCR1,0X44);    //采样ADC锁存数据DataH = BH45B1225_ReadReg(BH45B1225_ADRH);   //读取ADC数据高为寄存器DataM = BH45B1225_ReadReg(BH45B1225_ADRM);   //读取ADC数据中为寄存器DataL = BH45B1225_ReadReg(BH45B1225_ADRL);   //读取ADC数据低为寄存器BH45B1225_WriteReg(BH45B1225_ADCR1,0X40);     //清除eoc标志位DATA_Value =  (DataH<<16) | (DataM<<8) | (DataL);if(!((DATA_Value & (1 << 23)) == 0x00800000))                    //MSB=0,adc数据正{Voltage=(DATA_Value * (LSB)-DCSET)/(PGAGN*ADGN);}return Voltage;}
}
float BH45B1225_Get_Data()
{u8 DataH,DataM,DataL;float Voltage;u32 DATA_Value;while(!BH45B1225_EOC_FLAG());     //等待EOC置1转换完成{BH45B1225_WriteReg(BH45B1225_ADCR1,0X44);    //采样ADC锁存数据DataH = BH45B1225_ReadReg(BH45B1225_ADRH);   //读取ADC数据高为寄存器DataM = BH45B1225_ReadReg(BH45B1225_ADRM);   //读取ADC数据中为寄存器DataL = BH45B1225_ReadReg(BH45B1225_ADRL);   //读取ADC数据低为寄存器BH45B1225_WriteReg(BH45B1225_ADCR1,0X40);     //清除eoc标志位DATA_Value =  (DataH<<16) | (DataM<<8) | (DataL);if(!((DATA_Value & (1 << 23)) == 0x00800000))                    //MSB=0,adc数据正{Voltage=(DATA_Value * (LSB)-DCSET)/(PGAGN*ADGN);return Voltage;}else {                                                           //MSB=1,ADC数据负DATA_Value = ~DATA_Value + 1;DATA_Value = DATA_Value & 0x00ffffff;Voltage = (DATA_Value * (LSB)-DCSET)/(PGAGN*ADGN);return (-Voltage);}}
}

2.BH45B1225.h

代码如下(示例):

#ifndef __BH45B1225_H
#define __BH45B1225_H
#include "ch32f10x.h"
#define	BH45B1225_PWRC		0x00  //电源控制寄存器
#define	BH45B1225_PGAC0		0x01  //PGA1控制寄存器
#define	BH45B1225_PGAC1		0x02  //PGA2控制寄存器
#define	BH45B1225_PGACS		0x03  //PGA通道控制寄存器
#define	BH45B1225_ADRL	    0x04  
#define	BH45B1225_ADRM		0x05
#define	BH45B1225_ADRH		0x06
#define	BH45B1225_ADCR0		0x07  //PGA2控制寄存器
#define	BH45B1225_ADCR1		0x08
#define	BH45B1225_ADCS		0x09
#define	BH45B1225_ADCTE		0x0A
#define	BH45B1225_DAH		0x0B  //DAC高位寄存器
#define	BH45B1225_DAL		0x0C  //DAC低位寄存器
#define	BH45B1225_DACC		0x0D  //DAC控制寄存器
#define	BH45B1225_SIMC0		0x0E
#define	BH45B1225_SIMTOC    0x10
#define	BH45B1225_HIRCC		0x11  //振荡器控制寄存器
#define	BH45B1225_HXTC		0x12  //振荡器控制寄存器
void BH45B1225_WriteReg(uint8_t RegAddress, uint8_t Data);
uint8_t BH45B1225_ReadReg(uint8_t RegAddress);
void BH45B1225_Init();
void BH45B1225_Temptuer_Init();
uint8_t BH45B1225_EOC_FLAG();
float BH45B1225_Get_Data();
float BH45B1225_Get_temp();#endif

总结

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
使用CH32DAC输出电压供ADC采集,考虑到DAC输出的误差,ADC数据未滤波处理,2块一个ADC很好了。

完整工程:https://download.csdn.net/download/hhhhwdnmd/88234964

这篇关于CH32驱动国产24位ADC-合泰BH45B1225的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/206493

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6