你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求STM8L151单片机的AD转换

[复制链接]
意法半导体社区 提问时间:2015-11-12 14:13 /
我使用STM8L151单片机,使用三个AD通道0、1、2三个,单次转换,0通道检测电池电压,目前单步运行是发现第一次结果正确,接下来的结果接错误了,使用16M晶振,程序如下:
GPIO_Init(BATTER_PORT, BATTER_PIN, GPIO_Mode_In_FL_No_IT);//电池检测管脚初始化
GPIO_Init(TEL_AD_PORT, TEL_AD_PINS, GPIO_Mode_In_FL_No_IT);


void AD1_Init(void)//AD初始化
{
        CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);
        ADC_SchmittTriggerConfig(ADC1,BAT_AD_CHANNEL, DISABLE);
        ADC_SchmittTriggerConfig(ADC1,TEL_AD_CHANNEL1, DISABLE);
        ADC_SchmittTriggerConfig(ADC1,TEL_AD_CHANNEL2, DISABLE);
          ADC_Init(ADC1,ADC_ConversionMode_Single,ADC_Resolution_10Bit,ADC_Prescaler_1);
          ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);
          ADC_Cmd(ADC1,ENABLE);
          ADC_DMACmd(ADC1,DISABLE);
          ADC_ChannelCmd(ADC1,BAT_AD_CHANNEL,ENABLE);
          ADC_SoftwareStartConv( ADC1);
}



void AD_Function(void)//AD程序
{
    u16 Temp1,Temp2;

        if(ADC1->SR & ADC_FLAG_EOC){        
                Temp1 = ADC1->DRL;
                Temp2 = ADC1->DRH;
                Temp2 = (Temp2 << 8) | Temp1;        
                ADBuf[ADChannel] = Temp2;
                switch(ADChannel){
                        case uaBAT://电池电压检测
                                if(ADBuf[uaBAT] < 341){                //1024*(1.1/3.3)
                                        if(ADBuf[uaBAT]<311)        //1024*(1/3.3)
                                        {Flag_off=TRUE;}
                                        Change_WriteData(0x12,0x40,5);
                                }
                                else
                                {Change_WriteData(0x12,0x40,6);}
                        break;
                        case uaTEL1:
                                if(ADBuf[uaTEL1] > 931)                                                                                                                        //1024*(3/3.3)
                                {ErrIn();}
                        break;
                        case uaTEL2:
                                if(ADBuf[uaTEL2] > 931)                                                                                                                        //1024*(3/3.3)
                                {ErrIn();}
                        break;
                        default:break;
                }
                ADChannel++;
                if(ADChannel == uaMax){
                        ADChannel = uaBAT;
                }
                ADC1->SR &= (~ADC_FLAG_EOC);
                ADC1->SQR[3] &= (~ADC_SQR4_CHSELS);
                ADC1->SQR[3] |= ADChannel;        /*使能通道*/
                ADC1->CR1 |= ADC_CR1_START;
        }
}


typedef enum {
        uaBAT = 0,//电池电压
        uaTEL1,
        uaTEL2,
        uaMax
}T_AD_CHANNEL;

求大神给个解释。。。。。。

收藏 评论2 发布时间:2015-11-12 14:13

举报

2个回答
逍遥李 回答时间:2015-11-12 14:59:55
错误什么现象?你怎么知道出错了?你怎么排查的?你的猜测是哪里出错了?
我手里没有这款,只有8S105,我想大家都不一定刚好有你的芯片,你最好把问题描述清楚一些,
意法半导体社区 回答时间:2015-11-12 15:55:48
逍遥李 发表于 2015-11-12 14:59
错误什么现象?你怎么知道出错了?你怎么排查的?你的猜测是哪里出错了?
我手里没有这款,只有8S105,我想 ...

谢谢你 我刚刚解决了,是我的通道选错了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版