找回密码
 立即注册
查看: 378|回复: 2

STC8H1K08 ADC问题请教

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-05-06 07:58:57

4

主题

80

回帖

1905

积分

金牌会员

积分
1905
发表于 2024-8-5 19:46:59 | 显示全部楼层 |阅读模式
用ADC0测电池电压,ADC1测电机电流,单独在主函数内工作正常;如果用10mS扫描则只有一路ADC工作,另一路不工作,请教是哪出了问题。谢谢!                                if(Time_10ms == 1)
                                {
                                        Time_10ms = 0;
                                        BAT_AD_Action();
                                        MOT_AD_Action();
                                }

void BAT_AD_Action(void)                                                                                                                                                                                                                                //电量显示
{
        ADC0_Data = ADC_OUT(0);
        if((ADC0_Data > (ADC0_Sbuf + 15)) || (ADC0_Data < (ADC0_Sbuf - 15)))                               
        {
                ADC0_Sbuf = ADC0_Data;
        }                                                                                                               
        if(ADC0_Sbuf > 603)                                                                                                                                                                                                                                                //大于18V
        {
                LED1 = LED2 = LED3 = 1;
        }                                                       
        else if(ADC0_Sbuf > 537)                                                                                                                                                                                                                                //大于16V小于18V
        {
                LED1 = LED2 = 1;LED3 = 0;
        }                                                       
        else if(ADC0_Sbuf > 455)                                                                                                                                                                                                                                //大于13.5V小于16V
        {
                LED1 = 1;LED2 = LED3 = 0;
        }                                                                                                       
        else                                                                                                                                                                                                                                                                                                                 //小于13.5V
        {
                cnt++;
                if(cnt > 29)
                {
                        cnt = 0;
                        LED1 = LED2 = LED3 = 0;
                        ON_OFF = 0;
                        OUT_BLOW                = 0;       
                        BATEN                        = 0;
                        ADEN                         = 1;
                        LED1 =         1;
//                        Flag_On                        = 1;                                                                                                                                                                                                                                        //电压恢复不能使用
                }
        }
}



void MOT_AD_Action(void)                                                                                                                                                                                                                                        //电机电流检测
{
        ADC1_Data = ADC_OUT(1);
        if((ADC1_Data > (ADC1_Sbuf + 5)) || (ADC1_Data < (ADC1_Sbuf - 5)))
        {
                ADC1_Sbuf = ADC1_Data;
        }
        if(ADC1_Sbuf > 75)                                                                                                                                                                                                                                                        //70约是22A  
        {
                cnt++;
                if(cnt > 4)
                {
                        if(ADC1_Sbuf > 75)
                        {
                                cnt                                 = 0;               
                                LED1 = LED2 = LED3 = 0;                                                                                                                                                                                                        //电量显关闭                                                                                                                                       
                                OUT_BLOW                = 0;                                                                                                                                                                                                                                //输出低电平
                                BATEN                                = 0;                                                                                                                                                                                                                                //电池使能关闭
                                ADEN                                 = 1;                                                                                                                                                                                                                                //NTC使能关闭
                                ON_OFF                         = 0;                                                                                                                                                                                                                                //开关标志置0,并进入睡眠状态
                        }
                }
        }
}



uint ADC_OUT(uchar ch)                                               
{                                               
        uint ADC_TEMP = 0;                                               
        ADC_CONTR                |= 0x80;                                                                                                                //打开ADC电源
        Delay1ms();
        ADC_CONTR                |= ch;                                                                                                                        //选择ADC通道
        ADC_CONTR                |= 0x40;                                                                                                                //启动AD转换
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();                                               
        while(!(ADC_CONTR & 0x20));                                                                                                                //查询ADC完成标志
        ADC_CONTR                 &=  ~0x20;                                                                                                                //清完成标志
        ADC_TEMP                = (uint)(ADC_RES << 8) | ADC_RESL;                                                                //读取ADC结果,右对齐左移8位,左对齐左移2位
        return        ADC_TEMP;
}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-05-06 07:58:57

4

主题

80

回帖

1905

积分

金牌会员

积分
1905
发表于 2024-8-6 08:27:30 | 显示全部楼层
wnag*** 发表于 2024-8-5 20:53
还有一个办法
这一行
  ADC_CONTR                |= 0x80;       //打开ADC电源

十分感谢!真的是这里没有配置好!
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:303
  • 最近打卡:2025-05-07 07:49:46
已绑定手机

4

主题

343

回帖

1640

积分

金牌会员

积分
1640
发表于 2024-8-6 11:32:14 | 显示全部楼层
学习学习
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 11:58 , Processed in 0.149184 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表