DYyanfa 2024-03-30 16:07 采纳率: 31.3%
浏览 1

单片机ADC乘以10出现数据异常

见图代码,stc8g1k08不乘以10,串口发送数据是正确的,乘以10就是发送的3.3v电压对应百分比

img

  • 写回答

2条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    根据代码中的描述,你的目的是通过ADC(模数转换器)测量电压,并将其乘以10后发送到串口。但是,在乘以10后,发送的数据出现了异常。

    根据你提供的代码,可以在以下几个方面进行排查和修改:

    1. 检查ADC的初始化和配置

      • 确认ADC的内部时序设置是否正确(例如,ADCTIM的值)。
      • 确保ADC的时钟配置正确(例如,ADCCFG的配置)。
      • 根据你的需求,可能需要设置ADC为连续转换模式(注释中未提及)。
    2. 检查ADC中断处理函数

      • 确认ADC中断是否触发正确(例如,中断优先级设置、中断使能等)。
      • 在ADC中断处理函数中,将采样结果转换为电压值时,确保类型转换和计算逻辑正确。
    3. 检查电池电量计算的逻辑

      • 确保ADC转换结果和电池电量计算之间的转换公式正确。
      • 检查电池电量计算的范围和阈值是否符合需求。
    4. 检查串口发送函数

      • 确认串口初始化和配置是否正确。
      • 确保串口发送函数的调用和参数传递正确。

    根据以上几点,可以尝试以下解决方案:

    1. 在初始化ADC时,确认时序设置和时钟配置是否正确。

    2. 在ADC中断处理函数中,将采样结果转换为电压值时,检查类型转换和计算逻辑是否正确。

    3. 检查电池电量计算的逻辑,确保转换公式和阈值设置正确。

    4. 在串口发送函数中,确认串口初始化和配置是否正确。

    修改后的代码如下所示:

    #define ADC C
    #include "ADC.h"
    #include "config.h"
    #include "Uart.h"
    #include "string.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[10] = {0};                      //实时采集的adc值
    unsigned int CpBuff[10] = {0};
    extern unsigned int cnt5s;
    extern unsigned int inserttime;
    
    void ADC_Init()
    {
        ADCCFG = 0x20; //设置ADC时钟为系统时钟/2,右对齐
        ADCTIM = 0x2A; //设置ADC内部时序
        ADC_CONTR = 0x80; //使能ADC模块
    }
    
    void ADC_ISR() interrupt 5
    {
        ADC_Value = ((unsigned int)(ADC_RES>>8)) + (unsigned int)ADC_RESL;
    
        if (cnt > 10)
            EA = 0;
        AdcBuff[cnt] = ADC_Value;
        cnt++;
    
        ADC_CONTR &= ~0x20; //中断标志位清0
    
        if (cnt == 10)
            cnt = 0;
    }
    
    void Delay1ms(void)
    {
        unsigned char i, j;
        _nop_();
        i = 11;
        j = 190;
        do
        {
            while (--j)
                ;
        } while (--i);
    }
    
    void ADC_BATTERY()
    {
        static float up_percent = 100.0; //用于保存上一次的百分比值
        unsigned int t = 0;
        unsigned char battery_percent = 0;
    
        float adc_res, battery_percent, ave;
    
        ADC_CONTR = 0x0F; //底四位清零
        ADC_CONTR |= 0x0C; //置通道1
        ADC_CONTR |= 0x40; //启动ADC转换
    
        Delay1ms();
    
        for (int i = 0; i < 10; i++)
        {
            CpBuff[i] = AdcBuff[i]; //将AdcBuff值存到CpBuff,防止中断导致缓冲区值变化
        }
    
        for (int i = 0; i < 9; i++) //将数组由小到大排序
        {
            for (int j = 0; j < 9 - i; j++)
            {
                if (CpBuff[j] > CpBuff[j + 1])
                {
                    t = CpBuff[j];
                    CpBuff[j] = CpBuff[j + 1];
                    CpBuff[j + 1] = t;
                }
            }
        }
    
        ave = ((CpBuff[3] + CpBuff[4] + CpBuff[5] + CpBuff[6]) / 4); //adc658-1024
    
        if (ave > 600 && ave <= 1024)
        {
            adc_res = (float)ave * V_REF / ADC_RES_MAX; //计算ADC被转换通道的输入电压
        }
    
        float V_bat = adc_res * V_BAT_MAX / V_REF; //计算电池电压值,电池电压范围1.8-2.8V
    
        if (V_bat > 2.8)
            V_bat = 2.8;
        if (V_bat < 1.8)
            V_bat = 1.8;
    
        battery_percent = (V_bat - 1.8) * 10; //计算电池电量百分比
    
        Uartsend(battery_percent);
    
        if (up_percent < battery_percent)
        {
            Uartsend(up_percent);
        }
        else
        {
            Uartsend(battery_percent);
            up_percent = battery_percent;
        }
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月30日

悬赏问题

  • ¥15 iE 浏览器不能访问 oracle secure global server, google 浏览器可以
  • ¥50 Namuru2007_Baseband_Verilog代码疑点
  • ¥15 复杂公式求最值问题,含有多个符号常量
  • ¥15 Qt移植后在开发板上无法运行
  • ¥15 关于STID337-32D15YB开发板LINUX调试
  • ¥15 有没有熟悉自动化点胶设备,有个加密狗,想复制一份软件到另个设备
  • ¥15 mysql 部分截取字符串
  • ¥20 只有一个C盘,磁盘管理分区
  • ¥15 PVE8.2版本ceph的监控项状态stopped不能销毁
  • ¥15 如何加快视频观看速度?