制作网站源码软件,鞍山百姓网免费发布信息,wordpress typecho 大数据,安徽富通建设集团有限公司网站一、简介#xff1a;ADS1110 是德州仪器#xff08;TI#xff09;生产的16位精密集成的Δ-Σ模数转换器#xff0c;采用超小型的SOT-23-6封装#xff0c;特别适合空间受限且需要高分辨率测量的STM32LXXX低功耗物联网节点或便携设备。二、主要技术特性#xff1a;分辨率typedef enum {ADS1110_PGA_1 0x00, // 增益 1 (FSR ±2.048V)ADS1110_PGA_2 0x04, // 增益 2 (FSR ±1.024V)ADS1110_PGA_4 0x08, // 增益 4 (FSR ±0.512V)ADS1110_PGA_8 0x0C, // 增益 8 (FSR ±0.256V)} ADS1110_PGA_t;typedef enum {ADS1110_MODE_CONTINUOUS 0x00, // 连续转换模式ADS1110_MODE_SINGLE 0x10, // 单次转换模式自动断电} ADS1110_Mode_t;/* 读出的原始数据包2字节ADC数据 1字节配置寄存器 */typedef struct {uint16_t adc_raw; // 16位转换结果二进制补码格式uint8_t config_reg; // 当前的配置寄存器值uint8_t dr : 2; // 解析出的数据速率uint8_t pga : 2; // 解析出的增益uint8_t mode : 1; // 解析出的模式uint8_t reserved : 3;} ADS1110_Data_t;/* 公有函数声明 */HAL_StatusTypeDef ADS1110_WriteConfig(I2C_HandleTypeDef *hi2c, uint8_t config);HAL_StatusTypeDef ADS1110_ReadData(I2C_HandleTypeDef *hi2c, ADS1110_Data_t *adc_data);HAL_StatusTypeDef ADS1110_SetMode(I2C_HandleTypeDef *hi2c, ADS1110_Mode_t mode);HAL_StatusTypeDef ADS1110_SetDataRate(I2C_HandleTypeDef *hi2c, ADS1110_DataRate_t dr);HAL_StatusTypeDef ADS1110_SetPGA(I2C_HandleTypeDef *hi2c, ADS1110_PGA_t pga);float ADS1110_ConvertToVoltage(uint16_t adc_raw, ADS1110_PGA_t pga);#endif八、源文件#include ads1110.h/*** brief 写配置寄存器ADS1110唯一可写寄存器* param hi2c: I2C句柄* param config: 8位配置值ST/DR[1:0]/ PGA[1:0]/ MODE / 保留位* retval HAL状态*/HAL_StatusTypeDef ADS1110_WriteConfig(I2C_HandleTypeDef *hi2c, uint8_t config){// ADS1110无需子地址直接发送设备地址待写入的配置字节return HAL_I2C_Master_Transmit(hi2c, ADS1110_ADDRESS 1, config, 1, HAL_MAX_DELAY);}/*** brief 读取ADC转换结果及当前配置寄存器状态* param hi2c: I2C句柄* param adc_data: 存储读取数据的结构体指针* retval HAL状态* note ADS1110连续读取3字节MSB, LSB, Config*/HAL_StatusTypeDef ADS1110_ReadData(I2C_HandleTypeDef *hi2c, ADS1110_Data_t *adc_data){uint8_t rx_buffer[3];HAL_StatusTypeDef ret;ret HAL_I2C_Master_Receive(hi2c, ADS1110_ADDRESS 1, rx_buffer, 3, HAL_MAX_DELAY);if (ret HAL_OK) {// 组合16位ADC数据二进制补码adc_data-adc_raw (rx_buffer[0] 8) | rx_buffer[1];adc_data-config_reg rx_buffer[2];// 解析配置寄存器adc_data-dr (rx_buffer[2] 0) 0x03; // bit0-1adc_data-pga (rx_buffer[2] 2) 0x03; // bit2-3adc_data-mode (rx_buffer[2] 4) 0x01; // bit4}return ret;}/*** brief 设置转换模式连续/单次*/HAL_StatusTypeDef ADS1110_SetMode(I2C_HandleTypeDef *hi2c, ADS1110_Mode_t mode){uint8_t config;ADS1110_Data_t current_status;// 为保持PGA/DR设置不变先读出当前配置if (ADS1110_ReadData(hi2c, current_status) ! HAL_OK) {return HAL_ERROR;}config current_status.config_reg;// 清除模式位并设置新值config ~0x10;config | mode;return ADS1110_WriteConfig(hi2c, config);}/*** brief 设置数据速率*/HAL_StatusTypeDef ADS1110_SetDataRate(I2C_HandleTypeDef *hi2c, ADS1110_DataRate_t dr){uint8_t config;ADS1110_Data_t current_status;if (ADS1110_ReadData(hi2c, current_status) ! HAL_OK) {return HAL_ERROR;}config current_status.config_reg;config ~0x03; // 清零DR位config | dr;return ADS1110_WriteConfig(hi2c, config);}/*** brief 设置PGA增益*/HAL_StatusTypeDef ADS1110_SetPGA(I2C_HandleTypeDef *hi2c, ADS1110_PGA_t pga){uint8_t config;ADS1110_Data_t current_status;if (ADS1110_ReadData(hi2c, current_status) ! HAL_OK) {return HAL_ERROR;}config current_status.config_reg;config ~0x0C; // 清零PGA位config | pga;return ADS1110_WriteConfig(hi2c, config);}/*** brief 将原始ADC值转换为电压单位伏特* param adc_raw: 16位原始数据二进制补码* param pga: 当前使用的增益* retval 输入电压值V* note 内部基准为2.048V满量程差分输入范围 ±2.048 / PGA* 代码范围 -32768 对应 -FS32767 对应 FS*/float ADS1110_ConvertToVoltage(uint16_t adc_raw, ADS1110_PGA_t pga){int16_t signed_code (int16_t)adc_raw; // 转换为有符号数float vref 2.048f;float gain;switch (pga) {case ADS1110_PGA_1: gain 1.0f; break;case ADS1110_PGA_2: gain 2.0f; break;case ADS1110_PGA_4: gain 4.0f; break;case ADS1110_PGA_8: gain 8.0f; break;default: gain 1.0f; break;}// V_in (signed_code / 32768.0) * (Vref / gain)return (signed_code / 32768.0f) * (vref / gain);}九、应用示例#include main.h#include ads1110.hextern I2C_HandleTypeDef hi2c1;void ADS1110_Example(void){ADS1110_Data_t adc_data;float voltage;// 初始化ADS1110配置为单次转换模式15SPS增益1ADS1110_SetMode(hi2c1, ADS1110_MODE_SINGLE);ADS1110_SetDataRate(hi2c1, ADS1110_DR_15SPS);ADS1110_SetPGA(hi2c1, ADS1110_PGA_1);while (1){//触发单次转换写入任意配置值保持原有配置不变仅ST位置1uint8_t trigger_cmd;ADS1110_ReadData(hi2c1, adc_data); // 读取当前配置trigger_cmd adc_data.config_reg | 0x80; // 设置最高位ST 1ADS1110_WriteConfig(hi2c1, trigger_cmd);// 等待转换完成根据数据速率等待适当时间15SPS约需70msHAL_Delay(70);//读取转换结果if (ADS1110_ReadData(hi2c1, adc_data) HAL_OK) {// 计算实际电压值voltage ADS1110_ConvertToVoltage(adc_data.adc_raw, ADS1110_PGA_1);printf(ADC Raw: 0x%04X, Voltage: %.3f V\r\n, adc_data.adc_raw, voltage);}HAL_Delay(1000); // 每秒采集一次}}