单片机如何采样电流?
单片机工程师在面试的过程中,经常会碰到一些相同的问题,笔者总结了十个提问率较高的问题,供大家参考。现在我们来分析单片机工程师常遇面试问题之三:单片机如何采样电流?
单片机的AD模块转换原理我这里就不做讲解了,有兴趣的小伙伴可以找度娘了解,百度都有很详细的介绍。需要注意的是,想要通过AD口来检测信号,必须先要把这个信号转换成电压信号,这样单片机才能识别。
我们来看一下单片机采样电压电路图(1),AIN_Vbat接单片机AD检测口,需要检测的电压Vbat经过电阻R31和R37分压,分压得到的电压送给单片机AD口来检测,分压是是因为需要把Vbat映射到单片机AD口采样范围内,比如Vbat最高电压为90V,单片机AD模块参考电压为3.3V,那么我们就需要把0-90V映射到0-3.3V。因为这是直接检测电压信号,所以不需要转换直接送到单片机AD口即可,图种R31和R37用来分压,C30和R32用来滤波防干扰。
图(1)电压采样
言归正传,单片机如何采样电流呢?如之前所说,单片机AD模块识别的是电压信号,那么要采样电流就需要先把电流信号转换成电压。一般的做法是在负载端增加一颗电流采样电阻,比如选择一个0.05Ω的电阻,当电流为2A的时候,那么该电阻两端的压差就是V=I*R=0.05*2=0.1V;这样就可以把这个电压信号传送给单片机AD口进行检测。但是这个电压只有0.1V,单片机AD口资源得不到充分利用,检测误差会很大,所以我们要把这个电压进行放大。
能不能增大采样电阻呢?显然是不行的,因为增大采样电阻会增加电路损耗。比如增加采样电阻为1Ω,那么当电流为2A的时候,电阻上消耗的功率为P=I2*R=2*2*1=4W。这样的损耗是不允许的。所以我们只能加放大器来对这个小电压信号进行放大。图(2)是一个电流采样电路,R100为电流采样电阻,阻值0.05欧姆。该电路放大倍数为N=120K/5.1K=23.5倍。电路中使R29=R30,R24=R35,放大倍数即为N=R24/R29=R30/R35。具体原理作者将在后续文章为您分解。
图(2)电流采样
如果文章对你有帮助,欢迎关注作者,后面作者将为你推送更有价值的文章,谢谢!图(3)是作者做的电流电压自动excel自动计算表格,如小伙伴需要,请关注作者并在评论区留言即可,作者会把地址发给你。
图(3)excel计算表格
单片机IIC通讯实例讲解
IIC通讯在单片机开发中是比较常见的一种通讯协议,也有很多网友对其进行了详细分析,但是作者发现网友大多是对IIC进行理论上的讲解,很少有具体分析通讯内容,现在作者将以数字电位器(CAT5140)为实例为你讲解单片机如何通过IIC进行通讯。(数字电位器可以理解位一个滑动变阻器,RH为滑动变阻器上端,RL为滑动变阻器下端,RW为滑动端)。
第一步我们当然要读CAT5140的数据手册,对于IIC通讯的器件,我们重点关注如下信息:首先,自然是要看器件支持的通讯速度以及VCC电压范围,如图(1)我们就可以知道CAT5140最大支持400KHz的通讯速率,供电范围在2.5-5.5V。
图(1)器件资料1
然后我们就要获取器件地址了,如图(2)我们就可以知道器件地址为0x50+读写位。
图(2)器件地址
获取器件地址后,我们便要根据器件的脚位描述来画线路图了,图(3)为器件脚位描述。
图(3)器件脚位描述
根据描述,可以得出如下线路图,SCL和SDA接单片机IIC通讯口即可。
图(4)器件连接图
画出线路图后,我们就要进行最后一步了,那就是驱动该器件。下面我们来看往CAT5140的寄存器地址(0x00)写数据的操作过程。可以看出整个过程复位9个步骤(有些器件是直接给时序图)。
可以大致描述为:开始信号-写器件地址(0x50)-从机应答-写寄存器地址(0x00)-从机应答-写数据(0x1a)-从机应答-如需要重复写数据则重复6和7两个步骤即可-主机发送停止信号。
按照这个步骤我们就可以实现器件的驱动,如果出现问题,我们可以通过示波器或者逻辑分析仪抓取信号波形,如下图,只要逐步对比,就可以看出是哪个步骤出错了。
图(5)时序图
通过分析SDA和SCL的波形,与数据手册给出的步骤吻合,所以这个器件我们驱动成功。如有些器件给出的是时序图,那我们就直接对比时序图就好。
如文章对你有帮助,欢迎关注作者,后面作者将为你推送更有价值的文章!如大家如有疑问,请把问题发到评论区,我们一起讨论。如各位路过的大佬有更好的方法,欢迎发到评论区分享给大家,谢谢~~
//附上参考程序
//addr 器件地址
//RegAddr 寄存器地址
//dat 写入寄存器的数据
void IIC_SendOneByte(u8 addr,u8 RegAddr,u8 dat)
{
u8 i = 0;
IIC_Init();
IIC_Start();
for(i=0;i<8;i++)
{
if(addr & 0x80)
SDA = 1;
else
SDA = 0;
NOP(2);
SCL = 1;
NOP(4);
SCL = 0;
addr <<= 1;
}
IIC_WateACK(); //等待从机应答
NOP(8);
for(i=0;i<8;i++)
{
if(RegAddr & 0x80)
SDA = 1;
else
SDA = 0;
NOP(2);
SCL = 1;
NOP(8);
SCL = 0;
RegAddr <<= 1;
}
IIC_WateACK(); //等待从机应答
NOP(16);
SCL = 0;
NOP(16);
//SDAM = 0;
for(i=0;i<8;i++)
{
if(dat & 0x80)
SDA = 1;
else
SDA = 0;
NOP(4);
SCL = 1;
NOP(8);
SCL = 0;
NOP(4);
dat <<= 1;
}
IIC_WateACK();//等待从机应答
IIC_Stop(); //主机发送停止信号
}
相关问答
单片机 怎么进行工频 交流 电流的采样啊?我是用电流?单片机进行流电流的采样,是通过电流互感器实现的,输出要接一个额定电阻作为负载,检测负载电压就可以了,不是直接检测电流。单片机怎么进行工频交流电流的采...
单片机 ,的电源是直流还是 交流 ?不只单片机的工作电源一定要是直流而绝大多数电子产品的工作电源都要求是直流才可工作的了,单片机现可有用多种不直流电压值的,最常用的是5V直流,还有较多的较...
c51 单片机 接的是直流还是 交流 ?51单片机有5V和3.3V工作电压的,如果是5V工作电压,那么选5V直流电压供电。如果是3.3V,最好选3.3V直流电压供电,也可以选5V直流电压供电,内部加一个3.3V稳压...
8031 单片机 如何控制 交流 电机?8031单片机本身是不能直接控制交流电机的,因为它只能输出高低电平的数字信号。而交流电机需要通过改变交流电源的频率和相位来实现调速、正反转等功能。因此,...
单片机 精确测量1V左右电压,要求精确到mV-ZOL问答用stc的单片机3v的,10位ad精度,估计你会满意。12bit的范围5V的AD芯片,精度为1.2mv。这种AD应该很好找。LM331压频转换,通过捕捉中断来计算频率,占用单片机的...
单片机 接收到的数据如何通过上位机软件连接数据库?看不懂这个问题是什么意思?简单聊聊单片机和电脑的通信形式吧。一、单片机和电脑通过串口连接基本上所有的单片机都有串行通信接口,电脑上也配备有标准串行...
人体红外传感器模块与 单片机 结合怎么用?人体红外传感器模块一般集成人体感应和光线感应,输出控制的负载一般是照明灯电力设备。一般在光线黑暗的情况下,如果检测到范围内有人则吸合继电器,打开照明负...
单片机 原理及应用怎么学?学习单片机原理及应用可以从以下几个方面入手:首先,了解单片机的基本原理,包括内部结构、指令集、寄存器等。其次,学习单片机的编程语言,如C语言或汇编语...
2、,使用电流互感器、CS5460、CD4051、MCS51 单片机 、74HC164、LED共阴极数码管等器件,完成16路 交流 电流采?.2、取样电阻输出连接到两片8选1模拟开关CD4051的输入。3、两片CD4051的输出分别连接AD转换器CS5460的电压输入及电流输入通道,CS5460增益均选择10倍。4、...
用stc 单片机 控制三相电机编程方法?要使用STC单片机控制三相电机,可以按照以下步骤完成编程:1.创建一个新的工程,并选择合适的单片机型号(例如STC89C52)。2.配置单片机的引脚设置,将需要...