基于I²C的AHT20温湿度传感器的数据采集
基于I2C的AHT20温湿度传感器数据采集
一、I²C总线通信
I²C(Inter-Integrated Circuit):集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司于1980年代提出,为了让主板、嵌入式系统或手机用以连接低速周边外部设备而发展。
在CPU与被控I²C之间、I²C与I²C之间进行双向传送,高速IC总线一般可400kbps以上。 I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。其中,起始信号是必需的,结束信号和应答信号都可以不要。
I²C 总线的一些特征:
• 只要求两条总线线路 一条串行数据线 SDA 一条串行时钟线 SCL
• 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 从机关系软件设定地
址 主机可以作为主机发送器或主机接收器
• 它是一个真正的多主机总线 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁
防止数据被破坏
• 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速
模式下可达 3.4Mbit/s
• 片上的滤波器可以滤去总线数据线上的毛刺波 保证数据完整
• 连接到相同总线的 IC 数量只受到总线的最大电容 400pF 限制
1、起始位和结束位:I²C总线通讯由起始位开始通讯,由结束位停止通讯,并释放I2C总线。
起始位(S):在SCL为高电平时,SDA由高电平变为低电平
结束位(P):在SCL为高电平时,SDA由低电平变为高电平
————————————————————————————————
2、数据格式与应答:I²C数据以字节(即8bits)为单位传输,每个字节传输完后都会有一个ACK应答信号。应答信号的时钟是由主设备产生的。
应答(ACK):拉低SDA线,并在SCL为高电平期间保持SDA线为低电平
非应答(NOACK):不要拉低SDA线(此时SDA线为高电平),并在SCL为高电平期间保持SDA线为高电平。
在传输期间,如果从设备来不及处理主设备发送的数据,从设备会保持SCL线为低电平,强迫主设备等待从设备释放SCL线,直到从设备处理完后,释放SCL线,接着进行数据传输。
————————————————————————————————
3、数据传输通讯:开始数据传输后,先发送一个起始位(S),主设备发送一个地址数据(由7bit的从设备地址,和最低位的读/写标志位组成的8bit字节数据,该读写标志位决定数据的传输方向),然后,主设备释放SDA线,并等待从设备的应答信号(ACK)。每一个字节数据的传输都要跟一个应答信号位。数据传输以停止位(P)结束,并且释放I2C总线。
主设备可以不发送停止位(P),重复发送一个起始位(Sr)。
二、“软件I²C”和“硬件I²C”
I²C 总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。
I²C 总线传输数据时只需两根信号线。
一根是双向数据线 SDA,另一根是双向时钟线 SCL。
I²C 总线可以通过芯片上板载的I²C 外设实现,
也可以通过 GPIO 引脚模拟I²C 总线协议来实现。
1、硬件 I²C
对应芯片上的I²C 外设,由相应的 I2C 控制器和驱动电路组成,其所使用的引脚也是专用的。它直接调用内部寄存器进行配置。
2、软件 I²C
使用普通的 GPIO 引脚,用软件控制 GPIO 管脚状态来模拟 I2C 通信波形。所以软件 I2C 不受管脚限制,接口也比较灵活。
硬件 I²C 的效率>>于软件,
软件 I²C 由于不受管脚限制,接口比较灵活。
因为固件I²C的端口是固定的,所以会有所区别。至于如何区分:
- 可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是软件;如果调用现成的函数或者给某个寄存器赋值,则是固件IIC功能,没有则一般情况是用到了循环,为软件。
- 根据代码量判断,软件的代码量肯定比固件的要大。
. 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
. 硬件IIC速度比模拟快,并且可以用DMA
. 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。
三、AHT20的编程实现
要求:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)
1、AHT20简介
AHT20是国内奥松生成的I2C接口的MEMS温湿度传感器,ADC位数为20Bit,具有体积小、精度高、成本低等优点。单芯片价格在¥2~3,体积小巧很轻松嵌入到产品上代码。
2、编程实现
驱动代码下载 AHT20.c和AHT20.h


#include "led.h"
#include "delay.h"
#include "temhum.h"
#include "sys.h"
#include "usart.h"
int main(void)
{
u32 CT_data[2]={0};
volatile float hum=0,tem=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
temphum_init(); //ATH20初始化
while(1)
{
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据
hum = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍)
tem = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
printf("湿度:%.1f%%\r\n",(hum/10));
printf("温度:%.1f度\r\n",(tem/10));
printf("\r\n");
//延时2s,LED闪烁提示串口发送状态
LED=0;
delay_ms(1000);
LED=1;
delay_ms(1000);
}
}

基于I²C的温湿度采集模块:
在STM32平台使用I²C通信方式对AHT20进行温湿度的测量,并通过串口将测量得到的数据发送出来。将产生的hex文件烧录到stm32中,打开串口调试助手:
管脚连接:
1) AHT20
AHT20 STM32F10X
SCL–>PB6
SDA–>PB7
共地 GND–>GND
VCC–>3V3电源
2)串口
STM32F10X USB转TTL
PA9–>TXD
PA10–>RXD
3V3–>3V3
GND–>GND
3、结果


总结
本次实验,了解了基于I²C硬件协议的AHT20温湿度传感器的数据采集。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)