1.关于INA226模块的介绍,参考
https://blog.csdn.net/qq_40893012/article/details/106069907
2.关于STC89C52RC单片机的介绍,参考
http://news.eeworld.com.cn/mcu/2015/1030/article_23405.html
3.用到的工具:
- VSCode(或其他代码编辑器)
- Keil5:编译代码,生成.hex文件,该格式文件可以下载到单片机中
- STC-ISP:类似串口工具,可将.hex文件下载到单片机中
4.开发过程:
- 单片机中读电流的程序已写好,如下(初始化过程在此忽略):
设置读电流的AT指令:
uchar Check_Serial_Current_AT_CMD(void)
{
if(0==strncmp(serial_data_bubfer, "AT+Curr?", 8)) //读取电流
{
return 1;
}
else
{
return 0;
}
}
判断上层是否将AT指令正确传入:
if(1==Check_Serial_Current_AT_CMD()) //读电流的AT指令是否解析OK
{
Get_Shunt_Current(&Current); //读取电流
num2char(str, Current, 3, 1); //读取电流的浮点数转换成字符串
memset(send_buffer,0,10);
strcat(send_buffer,"I=");
strcat(send_buffer,str); //发送字符串组合 I=123.4
send_str_com(send_buffer); //串口发送字符串
}
读电流的方法:
void Get_Shunt_Current(float *Current)//mA
{
//Current[0] = (INA226_GetShunt_Current(INA226_ADDR1)* 2.5f);
//Current[0] = INA226_GetShunt_Current(INA226_ADDR1)/ 10.0f;
Current[0] = INA226_GetShunt_Current(INA226_ADDR1);
//Current[0] = INA226_GetShunt_Current(INA226_ADDR1)/ 100.0f;
}
- 以上是读取电流的整个过程,下面介绍怎么读取电压:
同样,首先定义AT指令
uchar Check_Serial_voltage_AT_CMD(void)
{
if(0==strncmp(serial_data_bubfer, "AT+volt?", 8)) //��ȡ����
{
return 1;
}
else
{
return 0;
}
}
判断上层是否将AT指令正确传入:
else if(1==Check_Serial_voltage_AT_CMD())
{
GetVoltage(&Voltage);
num2char(str, Voltage, 3, 1);
memset(send_buffer,0,10);
strcat(send_buffer,"V=");
strcat(send_buffer,str);
send_str_com(send_buffer);
}
读电压的方法
void GetVoltage(float *Voltage)//mV
{
// Voltage[0] = INA226_GetVoltage(INA226_ADDR1)*1.25f;
Voltage[0] = INA226_GetVoltage(INA226_ADDR1)*0.00125;
}
5.遇到的问题:
读电压时,有两个方法:
一是读取分流电压
void Get_Shunt_voltage(float *Voltage)//uV
{
// Voltage[0] = (INA226_GetShuntVoltage(INA226_ADDR1)*2.2);//这里原来乘的系数是2.5
Voltage[0] = (INA226_GetShuntVoltage(INA226_ADDR1))*1.4;//这里原来乘的系数是2.5
}
二是读取总线电压
void GetVoltage(float *Voltage)//mV
{
// Voltage[0] = INA226_GetVoltage(INA226_ADDR1)*1.25f;
Voltage[0] = INA226_GetVoltage(INA226_ADDR1)*0.00125;
}
分流电压此处不可取,因为读出来是常值“3”
此处取总线电压,乘以系数0.00125(实际这个系数可以更精确),即可读取出总线电压