#include "includes.h" int g_iVbat=345;//345 void ADCInit(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); //电压ADC检测 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN; GPIO_Init(GPIOA,&GPIO_InitStructure); //默认速度为两兆 //音量旋钮ADC检测 //VOL_ADC_PIN GPIO_InitStructure.GPIO_Pin =VOL_ADC_PIN; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN; GPIO_Init(VOL_ADC_PORT,&GPIO_InitStructure); //默认速度为两兆 //配置ADC的运行: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 ADC_InitStructure.ADC_ScanConvMode =DISABLE; //连续多通道模式 ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//ENABLE; //连续转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定 ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; //右对齐 ADC_InitStructure.ADC_NbrOfChannel =1; //扫描通道数 ADC_Init(ADC1,&ADC_InitStructure); ADC_Cmd (ADC1,ENABLE); //使能或者失能指定的ADC } void KEYADCInit(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //按键ADC 检测 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//先内部上拉模式给IO充能 GPIO_Init(GPIOA,&GPIO_InitStructure); DelayMs(100); GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN; GPIO_Init(GPIOA,&GPIO_InitStructure); //默认速度为两兆 DelayMs(200);//让电平恢复正常 //配置ADC的运行: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 ADC_InitStructure.ADC_ScanConvMode =DISABLE; //连续多通道模式 ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//ENABLE; //连续转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定 ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; //右对齐 ADC_InitStructure.ADC_NbrOfChannel =1; //扫描通道数 ADC_Init(ADC2,&ADC_InitStructure); // ADC_RegularChannelConfig(ADC2,ADC_Channel_1, 1,ADC_SampleTime_1Cycles5); //通道X,采样时间为1.5周期,1代表规则通道第1个这个1是啥意思我不太清楚只有是1的时候我的ADC才正常。 ADC_Cmd (ADC2,ENABLE); //使能或者失能指定的ADC ADC_SoftwareStartConvCmd(ADC2,ENABLE);//使能或者失能指定的ADC的软件转换启动功能 } /*********************************************************************** *获取电池电压 返回值: -1为无效 ; 正数表示电池电压放大100倍,如 382表示3.82V ***********************************************************************/ int GetVbat(void) { char buf[30]; static int Ct=0; static int siVbat[10]={0,0,0,0,0,0,0,0,0,0}; int iVbat[10]; int max[5]; int sum; int i,j,k; int adc; int Vbat; ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5 ); ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); adc=ADC_GetConversionValue(ADC1); if(adc<100 && adc>4095) { printf("VDAC OVER"); return -1; } //循环存储 siVbat[Ct]=adc; if(++Ct>9)Ct=0; //printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",siVbat[0],siVbat[1],siVbat[2],siVbat[3],siVbat[4],siVbat[5],siVbat[6],siVbat[7],siVbat[8],siVbat[9]); //滤波处理,排列取3个最大值,3个最大中去掉第一大,其余求平均 //拷贝 for(i=0;i<10;i++){ iVbat[i]=siVbat[i]; } for(i=0;i<4;i++){ max[i]=0; for(j=0;j<10;j++){ if(iVbat[j]>max[i]){ max[i]=iVbat[j]; k=j; } } iVbat[k]=0; } // printf("%d,%d,%d\r\n",max[0],max[1],max[2]); sum=max[1]+max[2]; if(max[2]<200) { //printf("ERR3"); return -1; } Vbat=sum*308/4096; return Vbat; } /******************************************************* *CheckVbat *检查电池电压,控制低压报警, *低压关机已由硬件监测 ******************************************************/ void CheckVbat(int Vbat) { static unsigned char sucCt=0;//提示“请充电”计数器 //if(modemInitStatus==0)return;//模块初始化完成后才操作 if(Vbat180)sucCt=0; }else sucCt=0; //printf("Vbat=====%d\r\n",g_iVbat);~ } void BatterProcess(void){ //static char tick=0; int vbat; vbat=GetVbat(); printf("volVBAT=====%d\r\n",GetPowerVbat()); if(vbat > 0) g_iVbat=vbat; // if(++tick<=3) return; // tick=0; CheckVbat(g_iVbat); } unsigned short getBat(void){ unsigned short ret; ret=(g_iVbat-MIN_PWR_LEVEL) * 100 / (400-MIN_PWR_LEVEL); return ((ret>100)?100:ret); } int GetKeyVbat(void) { int adc; int Vbat; ADC_RegularChannelConfig(ADC2,ADC_Channel_1, 1,ADC_SampleTime_1Cycles5); //通道X,采样时间为1.5周期,1代表规则通道第1个这个1是啥意思我不太清楚只有是1的时候我的ADC才正常。 ADC_SoftwareStartConvCmd(ADC2,ENABLE); while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET); adc=ADC_GetConversionValue(ADC2); if(adc<100 && adc>4095) { printf("VDAC OVER"); return -1; } Vbat=adc*300/4096; return Vbat; } int GetPowerVbat(void) { int adc; int Vbat; ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5 ); ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); adc=ADC_GetConversionValue(ADC1); if(adc<100 && adc>4095) { printf("VDAC OVER"); return -1; } Vbat=adc; return Vbat; } char SetSpkLvProcess(char update) { short templv=0; static char LastTemplv=0; static unsigned char Lastnum=0;//0 static short SpkCnt=0; unsigned char i=0; char buf[30]; //4- 655 const unsigned short VolArr[VOL_LEV_NUM]={100,200,410,820,1230,1640,2050,2460,3000,3500,4090};//,4090}; templv=GetPowerVbat(); LastTemplv=Lastnum; for(i=0;iVolArr[LastTemplv]+VOL_LEV_DEF)LastTemplv++; }else if(LastTemplv=VolArr[LastTemplv]+VOL_LEV_DEF)LastTemplv++; else if(templv0){ if((--SpkCnt==0)&&(sutUIstatus.Status==UIS_STANDBY)){ GuiClearRect(44,110,100,126); // if(g_uslockflag==1){ // GuiShowBmp(56,110,"lock.bmp"); // } if(sutPocStatus.Speaker==0&&sutPocStatus.TTS==0) SpeakerDisable(); } } return LastTemplv; }