8H8K64U用了两路AD,为什么只读了一路
void avarge()//DC功率求平均值{
char i=0;
char j=0,k=0;
for(j=0;j<9;j++)
adc_pre=read_adc(0xce);//读取直流功率
for(j=0;j<10;j++)//平均值滤波
{
for(k=0;k<9-j;k++)
{
if(adc_pre>=adc_pre)
{
Vol_Value2=adc_pre;
adc_pre=adc_pre;
adc_pre=Vol_Value2;
}
}
}
Vol_Value2=0;
for(i=2;i<8;i++)
{
Vol_Value2=Vol_Value2+adc_pre;
}
Vol_Adc_num=Vol_Value2/6;
if((USB_NUM|DC_NUM)==0)
{
if(!Time_ai_bt)
{
Time_ai_Pun++;
if(Time_ai_Pun<=3)
{
Time_ai_bt=1;
Vol_Adc_tsi=Vol_Adc_num+3;
}
}
}
for(j=0;j<9;j++)
adc_pre=read_adc(0xc3);//读取输入电压
for(j=0;j<10;j++)//平均值滤波
{
for(k=0;k<9-j;k++)
{
if(adc_pre>=adc_pre)
{
Vol_Value2=adc_pre;
adc_pre=adc_pre;
adc_pre=Vol_Value2;
}
}
}
Vol_Value2=0;
for(i=2;i<8;i++)
{
Vol_Value2=Vol_Value2+adc_pre;
}
AD_EXT_VOTAGE=(float)Vol_Value2/6.0;
BMS_TIME=AD_EXT_VOTAGE*0.8057*7.32/1000.0;
AD_EXT_VOTAGE=3300.0/4096.0*AD_EXT_VOTAGE;
AD_EXT_VOTAGE=AD_EXT_VOTAGE*EXT_VOTAGE_XS;
}
在使用STC8H8K64U微控制器进行两路AD转换时,如果只读取了一路数据,可能是由于以下几个原因导致的。以下是对可能问题的分析及解决方案:
1. AD转换通道配置问题
问题描述:在STC8H8K64U中,AD转换通道需要通过寄存器进行配置。如果只配置了一个通道,那么即使硬件连接了两路AD输入,也只能读取一路数据。
解决方案:检查AD转换通道的配置代码,确保两路AD通道都已正确配置。例如,使用ADCCONTR寄存器来选择和启动AD转换通道。
c
ADCCONTR = 0x80; // 打开ADC电源
ADCCONTR |= 0x00; // 选择通道0
nop(); nop(); nop(); nop(); // 等待稳定
ADCCONTR |= 0x08; // 启动AD转换
while (!(ADCCONTR & 0x10)); // 等待转换完成
int adcvalue0 = ADCRES; // 读取通道0的AD值
ADCCONTR |= 0x01; // 选择通道1
nop(); nop(); nop(); nop(); // 等待稳定
ADCCONTR |= 0x08; // 启动AD转换
while (!(ADCCONTR & 0x10)); // 等待转换完成
int adcvalue1 = ADCRES; // 读取通道1的AD值
2. AD转换时序问题
问题描述:AD转换需要一定的时间来完成,如果在转换未完成时读取数据,可能会导致读取错误或只读取到一路数据。
解决方案:在启动AD转换后,确保等待足够的时间让转换完成。可以通过检查ADCCONTR寄存器的标志位来判断转换是否完成。
c
ADCCONTR |= 0x08; // 启动AD转换
while (!(ADCCONTR & 0x10)); // 等待转换完成
3. AD转换结果存储问题
问题描述:AD转换结果存储在ADCRES和ADCRESL寄存器中。如果只读取了一个寄存器的值,可能会导致数据不完整或只读取到一路数据。
解决方案:确保在读取AD转换结果时,同时读取ADCRES和ADCRESL寄存器的值,并将它们组合成一个完整的AD值。
```c
int adcvalue = (ADCRES
[本文内容由国芯人工智能辅助生成,仅供参考] read_adc(0xce)
read_adc(0xc3)
这两句分别采集了ADC14(P0.6)和ADC3(P1.3)
页:
[1]