2024.1.27随堂笔记 ADC与I2C的应用

Copyright (c) 2024 by Jsir2022, All Rights Reserved.

CubeMX配置需要注意,如果引脚是黄色说明没配置好。红色的选项是不可用,因为有冲突。

一、ADC初始化配置和代码调用

如图,设置ADC时有不一样的地方。

Pasted image 20240127143948.png
单端模式:地和输入的电压差,如IN15
差分模式:两条线间的电压,如IN1~IN14

对于同一ADC1的不同输入通道,实际上共用一个寄存器,以DR结尾。(所以GPIOC->ODR实际上是GPIOC下的Output寄存器吧)

对于ADC2_IN15是勾上就行。但ADC1_IN5和ADC1_IN11需要改下面的Number Of conversion为2,然后设置Rank->Channel分别为5和11(这个先后顺序影响HAL_ADC_GetValue捕获的顺序)。还需要注意的是多通道扫描要更改采样时间,原先的2.5 Cycles太短了数值不正常,要改到比如247.5或者670 Cycles。
Pasted image 20240127144748.png

只需要以下四条函数
Pasted image 20240127145131.png

真正计算LSB的是Vin/2n1,好比量程0~9,真正划分出来的只有九份。
Pasted image 20240127150138.png

如果调试看到代码前面没有灰色矩形框,说明没编译。一般情况是没调用。
Pasted image 20240127150934.png

上场写AT24C02只需看芯片手册的图7、8、11这三张图。

根据手册读字节时序使用官方模拟I2C库实现读取AT24C02特定地址的一字节内容。
Pasted image 20240127160136.png

I2CStart();
I2CSendByte(AddrW);
I2CSendAck();
I2CSendByte(WordAddr);
I2CSendAck();

I2CStart();
I2CSendByte(AddrR);
I2CSendAck();
RX=I2CReceiveByte();
I2CSendNotAck();
I2CStop();

MCP4017手册重点关注页码36,41
数字电位器100K,根据下图可知最大可串联127颗电阻,每增加1颗增大787.402欧姆(典型值)
Pasted image 20240127165358.png

Pasted image 20240127165351.png

MCP4017的电阻相当于R2,那么分压计算公式为图右下角,但最终ADC出的值不一定和公式算出的一样,因为不是理想状态下的。
Pasted image 20240127173809.png