基于I2C协议读取AD值(ADX125芯片)

文章讲述了在移植程序过程中遇到的问题,包括采样速率变化导致的读取延迟、温度功能与AD功能切换的同步问题以及20位数据解析的精度调整。通过硬件方式优化IIC设置、合理安排功能切换时间和正确解读数据解决了这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:由于更换采样芯片,需要移植程序。

问题1:采样速率从960SPS(1.04ms)改为3571SPS(280us),其他设置未变,20ms从采样点20个改为72个,但是采集数据符合3.75个周期,理论应为一个周期。

分析:单片机读取RDY标志位的时间超过了280us。

解决方法:IIC设置从模拟方式改为硬件方式,scl引脚的频率改为400kHz。再次获取这20ms的AD值,绘制出来的图形符合一个周期。满足要求!

问题2:由于该采样芯片还有温度功能,切换温度和AD功能(修改config register的IS_MODE),读取输出的数值不是温度值。

分析:分别配置AD功能、温度功能,SDA引脚可以读取到正确的数值。两个功能交叉进行,获取的温度值错误。调试时,断点打在读取温度结果的代码处,再运行读取温度值的代码,可以获得正确温度值。

解决方法:配置采样芯片需要一段时间(1ms以上)才可以读取数值,采样速率选择了3571sps(280us),比较极限,不适合切换功能。只能降低采样速率或者选择其中一种功能来使用。

问题3:采样芯片有20位数值,温度值读取不准确。

分析:

20位数据的读取结果顺序:

高16位来自conversion register

低4位来自conversion_EXTRA register

Temperature data are represented as a 14-bit result that is left-justified within the 20-bit conversion result. ----摘自数据手册

解决方法:14位选择高16位的数值右移2位

### STM32F103C8T6 I2C 0.96寸 OLED 显示屏配置方法 #### 初始化硬件接口 为了使STM32F103C8T6能够通过I2C协议与OLED显示屏通信,需先初始化相应的GPIO引脚以及I2C外设。具体来说,SCL连接到PB6,SDA连接至PB7[^1]。 ```c // 在main函数前定义全局变量用于保存I2C句柄 I2C_HandleTypeDef hi2c1; void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // 设置标准模式下的波特率 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } ``` #### 配置OLED显示模块 完成上述操作之后,接下来就是针对OLED的具体设置了。这包括但不限于设置亮度、对比度等基本属性,并确保其处于正常工作状态。对于SSD1306驱动器而言,可以通过发送特定命令序列来达成目的。 ```c static void SSD1306_Command(uint8_t cmd) { HAL_I2C_Mem_Write(&hi2c1, SSD1306_ADDR << 1, 0x00, 1, &cmd, sizeof(cmd), 10); } void Init_Screen() { const unsigned char init[] = { 0xAE, 0xD5, 0xF0, 0xA8, 0x3F, 0xD3, 0x00, 0ADX, 0X00, 0XA0, 0XC8, 0xDA, 0X12, 0X81, 0XCF, 0XD9, 0XF1, 0XA4, 0XA6, 0xAF }; for(int i=0;i<sizeof(init);i++) SSD1306_Command(init[i]); } ``` #### 实现文字或图形绘制功能 最后一步则是开发应用程序逻辑部分,比如想要在屏幕上打印汉字,则可以调用之前提到过的`OLED_ShowCHINESE()`函数[^2];如果希望创建动态效果,如滚动条目,则可参照提供的代码片段执行相应指令集[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值