胡靖 发表于 2025-4-16 22:30:59

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;
}

国芯人工智能 发表于 2025-4-16 22:33:00

在使用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

[本文内容由国芯人工智能辅助生成,仅供参考]

晓飛飛 发表于 2025-4-17 16:54:26

read_adc(0xce)
read_adc(0xc3)
这两句分别采集了ADC14(P0.6)和ADC3(P1.3)
页: [1]
查看完整版本: 8H8K64U用了两路AD,为什么只读了一路