见图代码,stc8g1k08不乘以10,串口发送数据是正确的,乘以10就是发送的3.3v电压对应百分比
2条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-03-30 16:07关注
下午好🌅🌅🌅
本答案参考ChatGPT-3.5根据代码中的描述,你的目的是通过ADC(模数转换器)测量电压,并将其乘以10后发送到串口。但是,在乘以10后,发送的数据出现了异常。
根据你提供的代码,可以在以下几个方面进行排查和修改:
-
检查ADC的初始化和配置
- 确认ADC的内部时序设置是否正确(例如,ADCTIM的值)。
- 确保ADC的时钟配置正确(例如,ADCCFG的配置)。
- 根据你的需求,可能需要设置ADC为连续转换模式(注释中未提及)。
-
检查ADC中断处理函数
- 确认ADC中断是否触发正确(例如,中断优先级设置、中断使能等)。
- 在ADC中断处理函数中,将采样结果转换为电压值时,确保类型转换和计算逻辑正确。
-
检查电池电量计算的逻辑
- 确保ADC转换结果和电池电量计算之间的转换公式正确。
- 检查电池电量计算的范围和阈值是否符合需求。
-
检查串口发送函数
- 确认串口初始化和配置是否正确。
- 确保串口发送函数的调用和参数传递正确。
根据以上几点,可以尝试以下解决方案:
-
在初始化ADC时,确认时序设置和时钟配置是否正确。
-
在ADC中断处理函数中,将采样结果转换为电压值时,检查类型转换和计算逻辑是否正确。
-
检查电池电量计算的逻辑,确保转换公式和阈值设置正确。
-
在串口发送函数中,确认串口初始化和配置是否正确。
修改后的代码如下所示:
#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; } }
解决 无用评论 打赏 举报 编辑记录 -
悬赏问题
- ¥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 如何加快视频观看速度?