主题中讨论的其他器件:ADS1115
工具/软件:
您好。 请检查我的代码。
#include
#include
#include “osal_error.h"</s>“
#include “ti_board_open_close.h"</s>“
#include “board/led.h"</s>“
#include “app8AI.h"</s>“
#include “appMutex.h"</s>“
#include “ti_drivers_config.h"</s>“
#include “drivers/i2c.h"</s>“
#include “kernel/DPL/ClockP.h"</s>“
#include “EI_API.h"</s>“
// ADS1115 I2C 地址
#define ADS1115_ADDR_1 (0x48U)//单个 ADS1115 (48h)
// ADS1115 寄存器指针
#define ADS1115_POINTER_CONVERT (0x00U)
#define ADS1115_POINTER_CONFIG (0x01U)
// ADS1115 配置位
#define ADS1115_CONFIG_OS_single (0x8000U)
#define ADS1115_CONFIG_MODE_SINGLE (0x0100U)
#define ADS1115_CONFIG_DR_860SPS (0x00E0U)// 860SPS 速度
// FSR 不同输入范围的 PGA/PGA 设置(位[11:9])
#define ADS1115_CONFIG_PGA_MASK (0x0E00U)//屏蔽 PGA 位
#define ADS1115_CONFIG_PGA_6_144V (0x0000U)//±6.144V
#define ADS1115_CONFIG_PGA_4_096V (0x0200U)//±4.096V
#define ADS1115_CONFIG_PGA_2_048V (0x0400U)//±2.048V(默认上电)
#define ADS1115_CONFIG_PGA_1_024V (0x0600U)//±1.024V(0-5V 范围)
#define ADS1115_CONFIG_PGA_0_512V (0x0800U)//±0.512V
#define ADS1115_CONFIG_PGA_0_256V (0x0A00U)//±0.256 V (4 –20mA / 0 –20mA)
// 0V 至 5V 范围的默认配置
#define ADS1115_CONFIG_DEFAULT (ADS1115_CONFIG_OS_single | ADS1115_CONFIG_PGA_1_024V |\
ADS1115_CONFIG_MODE_SINGLE | ADS1115_CONFIG_DR_860SPS)
// ADS1115 - 4 个单端通道的通道到多路复用器映射
#define ADS1115_MUX_AIN0_GND (0x4000U)//通道 0:AIN0 与 GND
#define ADS1115_MUX_AIN1_GND (0x5000U)//通道 1:AIN1 与 GND
#define ADS1115_MUX_AIN2 _GND (0x6000U)//通道 2:AIN2 与 GND 间的关系
#define ADS1115_MUX_AIN3_GND (0x7000U)//通道 3:AIN3 与 GND
typedef 结构 EI_APP8AI_Industrial
{
uint32_t 实例;
uint32_t value[4];// 4 个通道
I2C_Handle i2cHandle;
bool i2c 已初始化;
bool ads1_present;
uint8_t ads1_addr;
} EI_APP8AI_Industrial_t;
静态 EI_APP8AI_Industrial_t EI_APP_8AI_Industrial_s;
//转换函数、用于精确的电压/电流计算
静态内联 uint32_t adcode_to_mV (uint16_t 代码、uint16_t fsr_mV)
{
//单端代码为 0..32767
返回 ((uint32_t) code * fsr_mV)/ 32767U;//在 ADS1115 引脚处
}
静态内联 uint32_t board_input_mV (uint16_t 代码、uint16_t fsr_mV)
{
//前端~0.2 增益 â†外部电压是 ADC 引脚电压的 5 倍
返回 (adc_code_to_mV (code、fsr_mV)* 5u);
}
静态内联 uint32_t board_input_uA (uint16_t 代码、uint16_t fsr_mV)
{
62Î电流= Vext /μ A。 MV →uA:(mV*1000)/62
uint32_t mv_ext = board_input_mV(代码,fsr_mV);
return (MV_ext * 1000u)/ 62u;
}
静态 bool probe_ADS1115_device(uint8_t 地址)
{
uint8_t wrData[1]={ADS1115_pointer_config}、rdData[2];
I2C_Transaction i2cTransaction;
I2C_Transaction_init (&i2cTransaction);
i2cTransaction.writeBuf = wrData;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rdData;
i2cTransaction.ReadCount = 2;
i2cTransaction.targetAddress =地址;
if (I2C_TRANSFER (EI_APP_8AI_INDUSTRIAL_s.i2cHandle、&i2cTransaction)){
uint16_t CONFIG =(rdData[0]<< 8)| rdData[1];
返回 (config != 0x0000 && config != 0xFFFF);
}
返回 false;
}
静态 void App_adcConfig (void)
{
I2C_Params 参数;
I2C_Params_init (¶ms);
//使用默认的 I2C 参数 — 无需显式设置比特率
EI_APP_8AI_INDUSTRIAL_s.i2cHandle = I2C_OPEN (CONFIG_I2C1、¶ms);
if(!EI_APP_8AI_INDUSTRIAL_s.i2cHandle){
OSAL_printf(“I2C 开路失败\n“);
返回;
}
OSAL_printf(“I2C successfully opened\n“);
EI_APP_8AI_INDUSTRIAL_s.ads1_addr = ADS1115_ADDR_1;
EI_APP_8AI_INDUSTRIAL_s.ads1_present = PROBE_ADS1115_device (ADS1115_ADDR_1);
EI_APP_8AI_INDUSTRIAL_s.i2cInitialized = EI_APP_8AI_INDUSTRIAL_s.ads1_present;
if(!EI_APP_8AI_INDUSTRIAL_s.i2cInitialized){
OSAL_printf(“在 0x%02x\n“处未找到 ADS1115 器件、ADS1115_ADDR_1);
}其他{
OSAL_printf(“ADS1115 在 0x%02x\n“、ADS1115_ADDR_1);
}
}
静态 void App_adcInit (void)
{
App_adcConfig();
}
静态 void App_adcStart (void)
{
OSAL_printf(“ADS1115 I2C ADC 已启动\n“);
}
静态 void App_adcStop (void)
{
OSAL_printf(“ADS1115 I2C ADC 已停止\n“);
}
静态 void App_adcDeInit (void)
{
如果 (EI_APP_8AI_INDUSTRIAL_s.i2c 初始化&& EI_APP_8AI_INDUSTRIAL_s.i2cHandle!= NULL){
I2C_CLOSE (EI_APP_8AI_INDUSTRIAL_s.i2cHandle);
EI_APP_8AI_INDUSTRIAL_s.i2cInitialized = false;
OSAL_printf(“I2C CLOSED\n“);
}
}
uint32_t EI_APP_8AI_init_i2c (EI_APP_8AI_SInit_t* pParams)
{
uint32_t result = OSAL_GENERAL_ERROR;
EI_APP_8AI_industrial_s.instance = pParams->industrial8AIsInst;
EI_APP_8AI_INDUSTRIAL_s.i2cInitialized = false;
对于 (uint32_t i = 0;i < 4;i++){
EI_APP_8AI_INDUSTRIAL_s.value[i]= 0;
}
app_adcInit();
if (EI_APP_8AI_INDUSTRIAL_s.i2cInitialized){
OSAL_printf(“I2C ADS1115 初始化成功\n“);
结果= OSAL_NO_ERROR;
}其他{
OSAL_printf(“I2C ADS1115 初始化失败\n“);
结果= OSAL_GENERAL_ERROR;
}
返回结果;
}
uint32_t EI_APP_8AI_deInit_i2c (void)
{
应用程序_adcStop();
app_adcDeInit();
返回 OSAL_NO_ERROR;
}
void EI_APP_8AI_industrialGet _i2c(uint32_t 通道、uint32_t *值)
{
uint8_t addr;
uint16_t mux、config、ads1115Value;
uint8_t wrData[3]、rdData[2];
I2C_Transaction i2cTransaction;
uint32_t TIMEOUT_COUNT;
if(!EI_APP_8AI_INDUSTRIAL_s.i2cInitialized ||通道>= 4 ||值== NULL){
OSAL_printf(“无效状态或通道%d\n“,通道);
*值= 0;
返回;
}
if(!EI_APP_8AI_INDUSTRIAL_s.ads1_present){
OSAL_printf(通道%d 中不存在 ADS1115);
*值= 0;
返回;
}
addr = EI_APP_8AI_INDUSTRIAL_s.ads1_addr;
切换(信道){
案例 0:MUX = ADS1115_MUX_AIN0_GND;break;
案例 1:MUX = ADS1115_MUX_AIN1_GND;BREAK;
案例 2:多路复用器= ADS1115_MUX_AIN2_GND;中断;
案例 3:多路复用器= ADS1115_MUX_AIN3_GND;break;
默认值:*value = 0; return;
}
CONFIG = ADS1115_CONFIG_DEFAULT |多路复用器;
wrData[0]= ADS1115_POINTER_CONFIG;
wrData[1]=(CONFIG >> 8) 和 0xFF;
wrData[2]= CONFIG 和 0xFF;
I2C_Transaction_init (&i2cTransaction);
i2cTransaction.writeBuf = wrData;
i2cTransaction.writeCount = 3;
i2cTransaction.targetAddress = addr;
if(!I2C_TRANSFER (EI_APP_8AI_INDUSTRIAL_s.i2cHandle、&i2cTransaction)){
OSAL_printf(通道%d、地址 0x%02x\n“、通道、addr 的 I2C 配置写入失败);
*值= 0;
返回;
}
TIMEOUT_COUNT = 10;// 10ms 超时、持续 860SPS
while (TIMEOUT_COUNT_-){
wrData[0]= ADS1115_POINTER_CONFIG;
I2C_Transaction_init (&i2cTransaction);
i2cTransaction.writeBuf = wrData;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rdData;
i2cTransaction.ReadCount = 2;
i2cTransaction.targetAddress = addr;
if (I2C_TRANSFER (EI_APP_8AI_INDUSTRIAL_s.i2cHandle、&i2cTransaction)){
CONFIG =(rdData[0]<< 8)| rdData[1];
if (config & 0x8000U){
休息;
}
}其他{
OSAL_printf(通道%d、地址 0x%02x\n“、通道、addr 的 I2C 配置读取失败);
}
ClockP_USleep (1000);
}
if (TIMEOUT_COUNT == 0){
OSAL_printf(“通道%d 的转换超时、地址 0x%02x\n“、通道、addr);
*值= 0;
返回;
}
wrData[0]= ADS1115_Pointer_convert;
I2C_Transaction_init (&i2cTransaction);
i2cTransaction.writeBuf = wrData;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rdData;
i2cTransaction.ReadCount = 2;
i2cTransaction.targetAddress = addr;
if (I2C_TRANSFER (EI_APP_8AI_INDUSTRIAL_s.i2cHandle、&i2cTransaction)){
ads1115Value =(rdData[0]<< 8)| rdData[1];
OSAL_printf(“通道%d 原始值:0x%04X\n“、通道、ads1115Value);
int16_t raw =(int16_t) ads1115Value;
如果 (RAW < 0) RAW = 0;
//使用掩码从当前配置确定 FSR
Uint16_t PGA =(CONFIG 和 ADS1115_CONFIG_PGA_MASK);
uint16_t fsr_mV =
(PGA == ADS1115_CONFIG_PGA_0_256V)? 第 256 章:
(PGA == ADS1115_CONFIG_PGA_0_512V)? 第 512 章:
(PGA == ADS1115_CONFIG_PGA_1_024V)? 第 1024 章:我
(PGA == ADS1115_CONFIG_PGA_2_048V)? 2048:
(PGA == ADS1115_CONFIG_PGA_4_096V)? 4096 : 6144;//默认情况 6.144 V
//转换为外部电压(考虑电路板的 5 倍比例因子)
uint32_t mv_ext = board_input_mV (raw、fsr_mV);
OSAL_printf(“通道%d 电压:%DMV(外部)\n“、通道、MV_ext);
*值= MV_ext;
EI_APP_8AI_INDUSTRIAL_s.value[channel]= MV_ext;//存储在结构中
}其他{
OSAL_printf(“通道%d、地址 0x%02x\n“、通道、addr 的 I2C 转换读取失败);
*值= 0;
}
}