DYyanfa 2024-03-27 18:29 采纳率: 31.3%
浏览 16
已结题

STC8g1k08单片机进行电池电压检测,串口没有输出数据

STC8g1k08单片机进行电池电压采集,之前因为抖动,输入电压值稳定情况下,逻辑分析仪采集的值每次都有变动,现在修改程序,加入了平均值,出现了新的问题,就是uart串口没有数据输出了

#define  _ADC_C
#include "ADC.h"
#include "config.h"
#include "Uart.h"

#define ADC_RES_MAX 1024  // ADC采样最大值
#define V_REF (3.3)        // 参考电压为3.3V
#define V_BAT_MAX (2.8)     // 电池最大电压为2.8V
#define V_BAT_MIN (1.8)     // 电池最小电压为1.8V
#define V_BAT_WARN (2.1)    // 电池电量过低警告阈值为2.1V

unsigned int ADC_Value;  // 定义全局变量,用于存储采样结果
unsigned char cnt = 0;  //
unsigned int AdcBuff[] = {0,0,0,0,0,0,0,0,0,0};

void ADC_Init() 
{
    P_SW2 |= 0x80;
    ADCTIM = 0x2A; //设置 ADC 内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x20; //设置 ADC 时钟为系统时钟/2,右对齐
    ADC_CONTR = 0x80; //使能 ADC 模块
}

void ADC_ISR() interrupt 5 
{
    ADC_Value = (unsigned int)(ADC_RES << 8) + (unsigned int)ADC_RESL;
    if(cnt < 10)
    {
        AdcBuff[cnt] = ADC_Value;
        cnt++;
    }
    ADC_CONTR &= ~0x20; //中断标志位清0
}

void Delay1ms(void)    
{
    unsigned char data i, j;

    _nop_();
    _nop_();
    _nop_();
    i = 11;
    j = 190;
    do
    {
        while (--j);
    } while (--i);
}

void ADC_BATTERY() 
{
    unsigned int i=0,j=0,t=0;
//    unsigned char battery_percent = 0;  // 定义电量百分比变量
    float adc_res,battery_percent,ave;
    float v_bat;
    ADC_CONTR &= 0xf0;    //底四位清零
    ADC_CONTR |= 0x0C;    //置通道12
    ADC_CONTR |= 0x40;  // 启动ADC转换
    Delay1ms();
    //cnt = 0;
    while(cnt < 10);
        cnt = 0;
    for(j=0;j<9;j++)    //将数组由小到大排序
        for(i=0;i<9-j;i++)
            if(AdcBuff[i]>AdcBuff[i+1])
            {
                t=AdcBuff[i];
                AdcBuff[i] = AdcBuff[i+1];
                AdcBuff[i+1] = t;
            }
    ave = (AdcBuff[3]+AdcBuff[4]+AdcBuff[5]+AdcBuff[6]) / 4;
    adc_res = (float)ave * V_REF / ADC_RES_MAX;// 计算ADC被转换通道的输入电压
    v_bat = adc_res * V_BAT_MAX / V_REF;// 计算电池电压值
    battery_percent = (v_bat - V_BAT_MIN)  / (V_BAT_MAX - V_BAT_MIN) * 100.0;// 计算电池电量百分比
    UartSend(adc_res * 10);
}




  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-27 18:30
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:为什么加入平均值后,uart串口没有数据输出了? 回答: 程序中使用了一个数组AdcBuff来存储ADC采集到的10个值,并对其进行排序,然后取其中的中间4个值的平均值作为采集的真实值。在计算结束后,将真实值通过UART串口发送出去。 但是程序中没有对AdcBuff数组进行清零操作,如果在第一次执行ADC采集函数时,AdcBuff数组里面的数是旧的,那么排序后的结果将不准确。这就可能导致ADC采集到的真实电压值不准确,并且发送到UART串口的电压值也不准确。 解决方案: 在ADC采集的函数里添加AdcBuff数组的清零操作,例如: void ADC_ISR() interrupt 5 {
    ADC_Value = (unsigned int)(ADC_RES << 8) + (unsigned int)ADC_RESL;
    if(cnt < 10)
    {
        AdcBuff[cnt] = ADC_Value;
        cnt++;
    }
    ADC_CONTR &= ~0x20; //中断标志位清0
    if(cnt == 10)
    {
        cnt = 0;
        memset(AdcBuff, 0, sizeof(AdcBuff)); //清零数组
    }
    

    } 同时,在计算真实电压值和发送UART数据之前,先检查AdcBuff数组是否清零,例如: if(cnt == 0) { memset(AdcBuff, 0, sizeof(AdcBuff)); //清零数组 return; } 现在重新编译并上传程序到单片机,测试是否能够成功发送电压值到UART串口。 代码示例:(修改的部分已用注释标出) void ADC_ISR() interrupt 5 { ADC_Value = (unsigned int)(ADC_RES << 8) + (unsigned int)ADC_RESL; if(cnt < 10) { AdcBuff[cnt] = ADC_Value; cnt++; } ADC_CONTR &= ~0x20; //中断标志位清0 if(cnt == 10) { cnt = 0; memset(AdcBuff, 0, sizeof(AdcBuff)); //清零数组 } } void ADC_BATTERY() { unsigned int i=0,j=0,t=0; unsigned char battery_percent = 0; // 定义电量百分比变量 float adc_res,battery_percent,ave; float v_bat; ADC_CONTR &= 0xf0; //底四位清零 ADC_CONTR |= 0x0C; //置通道12 ADC_CONTR |= 0x40; // 启动ADC转换 Delay1ms(); if(cnt == 0) //添加判断:如果AdcBuff数组已清零,则不进行以下操作 { return; } //cnt = 0; for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(AdcBuff[i]>AdcBuff[i+1]) { t=AdcBuff[i]; AdcBuff[i] = AdcBuff[i+1]; AdcBuff[i+1] = t; } ave = (AdcBuff[3]+AdcBuff[4]+AdcBuff[5]+AdcBuff[6]) / 4; adc_res = (float)ave * V_REF / ADC_RES_MAX; // 计算ADC被转换通道的输入电压 v_bat = adc_res * V_BAT_MAX / V_REF; // 计算电池电压值 battery_percent = (v_bat - V_BAT_MIN) / (V_BAT_MAX - V_BAT_MIN) * 100.0; // 计算电池电量百分比 UartSend(adc_res * 10); }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 创建了问题 3月27日

悬赏问题

  • ¥20 用qt设计一个完整程序(有偿)
  • ¥15 GRU代码预测出错,结果很差
  • ¥100 中断和线程导致内核崩溃问题
  • ¥15 iE 浏览器不能访问 oracle secure global server, google 浏览器可以
  • ¥50 Namuru2007_Baseband_Verilog代码疑点
  • ¥15 复杂公式求最值问题,含有多个符号常量
  • ¥15 Qt移植后在开发板上无法运行
  • ¥15 关于STID337-32D15YB开发板LINUX调试
  • ¥15 有没有熟悉自动化点胶设备,有个加密狗,想复制一份软件到另个设备
  • ¥15 mysql 部分截取字符串