深入解析:CL调试时,设定0mA,实际输出也为0mA,但OLED显示却不是0mA

OLED显示不为0

在进行CL板性能评估过程中,我们发现了以下现象:当系统刚刚上电时,OLED显示屏显示的电流值为0mA。然而,一旦通过串口设置输出电流后,若再次使用串口助手将输出电流设置为0mA,虽然使用DM3068实测得到的输出电流值确实为0mA,但OLED显示屏的电流值却始终无法归零,其显示范围大约在0~0.3mA之间,这是目前测试所得到的范围。这一现象导致的后果是,该非零电流值会传递给后续的积分环节,使得积分值随着时间的推移不断增加,一直处于增长状态,无法趋于稳定。
上电初始显示
设置0mA

代码分析

源代码

else IFARG0("setc") {
// unit: mA
double fMA;
sscanf(SDA(1), "%lf", &fMA);
int nNumber = CurrentAmpere2ADC(fMA/1000.0);
CurrentAdjustSet(nNumber);
g_nCCOutPoint = 0;
printf("%d\r\n", g_nCurrentSet);
//白超添加的代码
}

在程序中添加了 printf(“%d\r\n”, g_nCurrentSet); ,用于打印出当执行“setc 0”操作时, g_nCurrentSet 的值为726。在这一情况下,确实会在显示过程中出现小数部分非零的问题。以下是OLED显示代码:

void LCDDisplay(void) {
char szString[64];
//--------------------------------------------------------------------------
DS3231ReadAll();
sprintf(szString, "%02x-%02x-%02x", g_ucDS3231Register[2]&
0x3f,
g_ucDS3231Register[1],
g_ucDS3231Register[0]);
//sprintf(szString, "%06d", g_nTime2Count);
//LCD_Print(0, 0, szString);
// sprintf(szString, "%03d", g_nPWMBaseNumber);
// LCD_Print(0, 0, szString);
sprintf(szString, "%03d", g_nPWMIncNumber);
LCD_Print(0, 0, szString);
/*
sprintf(szString, "%02x-%02x-%02x", g_ucDS3231Register[6],
g_ucDS3231Register[5] & 0x3f,
g_ucDS3231Register[4] & 0x1f);
LCD_Print(0, 2, szString);
*/
//--------------------------------------------------------------------------
double lfValue = PVGetVoltage() * 1000.0;
// Unit:mV
sprintf(szString, "PV:%5.1fmV", lfValue);
LCD_Print(0, 2, szString);
//--------------------------------------------------------------------------
lfValue = CurrentADC2Ampere(CurrentSampleAverage());
if(g_nCurrentSet <= 0) lfValue = 0;
sprintf(szString, "A:%5.2lf mA", lfValue*1000);
LCD_Print(0, 4, szString);
double lfMG;
lfValue = ColumnValue();
lfMG = Column2MG(lfValue);
sprintf(szString, "C:%3.2lf W:%3.2lf", lfValue, lfMG);
LCD_Print(0, 6, szString);
//--------------------------------------------------------------------------
}

在代码逻辑中,lfValue = 0;的执行条件是g_nCurrentSet的值不大于0,即仅当g_nCurrentSet小于或等于0时,才会执行该语句。目前,这种处理方式仅应用于OLED显示部分。然而,在其他场景中,例如在后续代码中将数据上传至PC时,同样需要进行类似的处理。因此,建议将需要上传的电流值定义为全局变量。这样一来,只需对全局变量进行一次修改,即可在所有调用该变量的地方实现同步更新,从而提高代码的可维护性和一致性。

lfValue = CurrentADC2Ampere(CurrentSampleAverage());
if(g_nCurrentSet <= 0) lfValue = 0;
sprintf(szString, "A:%5.2lf mA", lfValue*1000);
LCD_Print(0, 4, szString);
void SendValue(void) {
unsigned int nValue;
unsigned long lnValue;
double lfValue;
//-------------------------------------------------------------------------- 
UART3SendChar(0x0);
UART3SendChar(0xff);
g_ucUART3SendCharSigma = 0;
// Check Number sum
//--------------------------------------------------------------------------
lfValue = CurrentADC2Ampere(CurrentSampleAverage());
if(g_nCurrentSet <= 0) lfValue = 0;
lfValue *= 10000;
nValue = (unsigned int )(lfValue);
UART3SendChar((unsigned char)(nValue >>
8));
UART3SendChar((unsigned char)nValue);
nValue = (unsigned int)(PVGetVoltage() * 10000.0);
UART3SendChar((unsigned char)(nValue >>
8));
UART3SendChar((unsigned char)nValue);
lnValue = (unsigned long)(ColumnValue() * 0x10000);
UART3SendChar((unsigned char)lnValue);
lnValue >>= 8;
UART3SendChar((unsigned char)lnValue);
lnValue >>= 8;
UART3SendChar((unsigned char)lnValue);
lnValue >>= 8;
UART3SendChar((unsigned char)lnValue);
lnValue = HAL_GetTick() - g_nStartTick;
UART3SendChar((unsigned char)lnValue);
lnValue >>= 8;
UART3SendChar((unsigned char)lnValue);
lnValue >>= 8;
UART3SendChar((unsigned char)lnValue);
lnValue >>= 8;
UART3SendChar((unsigned char)lnValue);
//--------------------------------------------------------------------------
UART3SendChar(g_ucUART3SendCharSigma^0xff);
}
posted @ 2025-09-12 18:16  wzzkaifa  阅读(18)  评论(0)    收藏  举报