kpffq 发表于 2025-10-3 12:00:24

请教大家一个问题:一条乘法指令导致MCU复位的原因是什么

      调试一个ai8051u+电流传感器_ACS712ELCTR-05B-T程序,使用P1.7脚对ACS712ELCTR-05B-T的输出电压进行AD转换后计算电流。程序采用8bit。
根据ACS712ELCTR-05B-T手册,电流在0-5A时,其输出电压:2.5V+-0.925V,输出灵敏度:185mV/A。
      程序主要检测方法是20MS的时间内连续对ACS712ELCTR-05B-T的输出电压进行20次采样,通过冒泡法查找到电压的最大值后,再换算成检测电流值。AD转换程序参考了擎天柱例程中的09.ADC采样NTC数据-软件防抖-过采样使用-串口1返回结果程序。
      在换算时,包含以下语句:
      const float K=Vref/4096/0.185/1.414;         //计算常数
      float Current_temp=0.0;

      Current_temp = (adc - 2048)*K;                  //换算出电流值,ADC为ADC采样值

   调试程序时,用电位器对5V电源分压后接入P1.7脚进行模拟。由于是模拟,当AD输入电压低于2.5V时,冒泡法查找到电压的最大值就会小于2048 ,(adc - 2048)就会变成负数,此时导致程序复位。
   请教一下大家在这条语句中,为什么(adc - 2048)变成负数后会导致MCU复位呢?
   下面是电流换算的程序:
/******************** 计算电流 *********************/

#define   Vref      5.0
#define   Sensitvity0.185
#define   Zero_point2.5
float CalculationCurrent(u16 adc)
{
    //电流传感器_ACS712ELCTR-05B-T
    //量程:5A
    //输出灵敏度:185mV/A(对应5A电流时输出约925mV)
    //精度:±1.5%
    //工作电压:4.5V~5.5V
    //输出电压:2.5V+-0.925
       
    const float K=Vref/4096/0.185/1.414;         //计算常数
    float Current_temp=0.0;          //电流计算结果
    Current_temp = (adc - 2048)*K; //Zero_point理论值为2048,对应采样电压2.5V
    return Current_temp;
}
下面附上用到的8位擎天柱例程:09.ADC采样NTC数据-软件防抖-过采样使用-串口1返回结果


ercircle 发表于 2025-10-3 13:41:20


上传的代码里未见问题函数调用,并且复制这个函数到例程中调用未见复位异常:



上传可复现问题工程看看
页: [1]
查看完整版本: 请教大家一个问题:一条乘法指令导致MCU复位的原因是什么