微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC12LE5A60S2单片机使用P1.0和P1.1口做AD检测电压,出现AD0的值有一瞬间和AD1相同,求解。

STC12LE5A60S2单片机使用P1.0和P1.1口做AD检测电压,出现AD0的值有一瞬间和AD1相同,求解。

时间:10-02 整理:3721RD 点击:
如题,使用STC12LE5A60S2单片机的P1.0和P1.1口做两组电池的电压实时检测并显示,两组电池电压交替检测,如果A组电池电压低于46V时关闭LED0和LED1,然后继续检测B组电池电压,B组电池电压低于46V时关闭LED2和LED3;如果B组电池电压低于46V时关闭LED2和LED3,然后继续检测A组电池电压,A组电池电压低于46V时关闭LED0和LED1。但程序出现一个问题:A组电池电压为48V不变,B组电压由48V缓慢下降,当降到46V时,关闭LED2和LED3,然后单片机检测到A组的电压瞬间也变成46V导致LED0和LED1也关闭了,接着检测到的A组电池电压又恢复到48V,但使用示波器量测过A组电压全过程中并未发生变化,非常疑惑,请各位大神解答,非常感谢。
附上此部分的程序。
void discharge(void) interrupt 0
{
        unsigned char a,LED0,LED1,LED2,LED3;
        unsigned int  ADDATA;
        LED0=1;      
        LED1=1;      
        LED2=1;      
        LED3=1;
        a=0;
        LCD12864_clear();    //12864清屏
        get_adc_result(a);    //获取a通道电压值 ,返回的是temp
        discharge_buffer=(temp-3013)/0.27970;        //精确计算实际电压值,discharge_buffer为实际的电压值的100000倍,便于12864显示小数部分
        ADDATA=(uint)(discharge_buffer/100000);  //对实际电压值取整,方便和46V进行比较
        disp12864_fangdianya(a);  //在12864上显示a通道的电压值
        do
        {
          a=1-a;    //对a进行取反,轮流检测P1.0和P1.1通道的电压
          get_adc_result(a);          //获取a通道电压值 ,返回的是temp
          discharge_buffer=(temp-3013)/0.05654;//精确计算实际电压值,discharge_buffer为实际的电压值的100000倍,便于12864显示小数部分
          ADDATA=(uint)(discharge_buffer/100000);//对实际电压值取整,方便和46V进行比较
          disp12864_fangdianya(a); //在12864上显示a通道的电压值
        }
        while(46<ADDATA);
       
        if(a==1)             //如果a=1,说明B组电池电压低于46V,关掉LED2和LED3
         {
          LED2=0; LED3=0;
         }        
        else              //否则,说明A组电池电压低于46V,关掉LED0和LED1
          {
             LED0=0; LED1=0;
          }
        a=1-a;          //对a取反,下面要检测另一路电池电压
        Delay100ms();       //延时100ms
        get_adc_result(a);          //获取a通道电压值 ,返回的是temp
        discharge_buffer=(temp-3013)/0.05654;  //精确计算实际电压值,discharge_buffer为实际的电压值的                                                                               //100000倍,便于12864显示小数部分
        ADDATA=(uint)(discharge_buffer/100000); //对实际电压值取整,方便和46V进行比较
        disp12864_fangdianya(a); //在12864上显示a通道的电压值
        do
        {
          get_adc_result(a);          //获取a通道电压值 ,返回的是temp
          discharge_buffer=(temp-3013)/0.05654;//精确计算实际电压值,discharge_buffer为实际的电压值的                                                                               //100000倍,便于12864显示小数部分
          ADDATA=(uint)(discharge_buffer/100000);//对实际电压值取整,方便和46V进行比较
          disp12864_fangdianya(a);//在12864上显示a通道的电压值
          Delay100ms();   //延时100ms
        }
        while(46<ADDATA);
       
        if(a==0) {  
                  LED0=0; LED1=0;
                       }
        else
                       {  
                   LED2=0; LED3=0;
                 }        
}

没有人能够解答这个问题吗?

感觉交替测压通道应该给个延时,毕竟AD采集有个反映时间;或者分别用两组通道采集试试看

观望中,也来学习一下

两次检测之间要重新初始化AD,转换通道,希望能帮到你,可以在联系我

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top