day11 ADC
1.1ADC的概述
ADC:模数转换----模拟量转换成数字量
模拟量:是指一段连续的值
数字量:是指一段离散的值
ADC会将检测到的一段连续的数值,转换为一些离散的数字量,在STM32中,ADC主要转换的对象就是IO接收到的电压。
1.2ADC外设的概述
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
12位:ADC的分辨率(描述的数的准确性)
逐次逼近型ADC:
若想要计算一个物品的重量,已知当前最大的砝码重量为100g 后面依次为 50g 20g 10g 5g 1g
从重量最多的砝码依次与物品比对,若比物品轻则增加砝码,否则更换砝码
ADC:若选择8bit分辨率
数据的左对齐与右对齐:数据寄存器有16位,而分辨率最高12位,则保存数据时可以选择保存在数据寄存器的右侧或左侧(高位或低位)
1.3ADC框图
由框图可知,转换某个数据源的模拟量数据其步骤大致为
- 选择转换通道
- 为ADC提供转换频率
- 配置ADC的相关参数(转换周期、转换间隔、模式选择等)
- 产生一次开始转换信号
- 等待EOC置位
- 从数据寄存器中读取数据
2 DHT11使用
2.1温湿度模块的特点
查看DHT11数据手册:知DHT11使用单线制串行接口,4针排针引脚,供电电压3-5.5v
2.2温湿度模块的原理
通信协议
◦ 启动信号:主机拉低总线至少 18ms,随后释放并等待传感器响应(拉低 40–80μs)。
◦ 数据传输:每次传输 40 位数据(湿度整数(8位)/小数(8位) + 温度整数(8位)/小数(8位) + 校验和(8位)),高位先发MSB。
数据格式示例
◦ 湿度:45.0%RH → 字节4(整数) + 字节3(小数)
◦ 温度:28.0℃ → 字节2(整数) + 字节1(小数)
◦ 校验和:湿度 + 温度(校验最后 8 位)。
2.3初始化配置步骤
初始化配置输入 / 输出模式
因为使用单总线模式,所以既要输入也要输出;在开始信号和结束信号处需要信号输出。
①通信开始
void DHT_Start(void)
{
//设置输出模式
DHT11OUT_Init();
GPIO_SetBits(GPIOG,GPIO_Pin_9);//若电平是低电平,无法产生下降沿,所以先拉高
//把总线拉低,延时20ms等待
GPIO_ResetBits(GPIOG,GPIO_Pin_9);
Delay_ms(20);
//总线拉高
GPIO_SetBits(GPIOG,GPIO_Pin_9);
Delay_us(30);
}
②通信过程
检测是否响应:
③读取1bit数据
④读取一个字节数据
如果先与后左移的话,即先将数据接收过来再将整体位左移一位。如果这样的话最后一次循环中接收到的数据会被移动到前一位。先左移后接收的话,初始值为0,左移也是0并不影响。
⑤获取DHT11的温湿度数据
通信结束,这个不管
⑥主函数循环
int main()
{
uint8_t DHT_DataBuf[5] = {0};
//1.硬件初始化
USART1_Init(9600); //如果USART1的波特率和USART3不一致,就可能会出现丢包
USART3_Init(9600);
SysTick_Init();
//2.进入死循环
while(1)
{
DHT_GetData(DHT_DataBuf);//获取到温湿度数据
printf("Temp = %d ,Humi = %d \n",DHT_DataBuf[2],DHT_DataBuf[0]);
Delay_ms(500);
Delay_ms(500);
Delay_ms(500);
}
}
2.4通信信号