adc.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include "includes.h"
  2. int g_iVbat=345;//0
  3. void ADCInit(void)
  4. {
  5. ADC_InitTypeDef ADC_InitStructure;
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  9. GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
  10. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//先内部上拉模式给IO充能
  11. GPIO_Init(GPIOA,&GPIO_InitStructure);
  12. DelayMs(100);
  13. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;
  14. GPIO_Init(GPIOA,&GPIO_InitStructure); //默认速度为两兆
  15. DelayMs(200);//让电平恢复正常
  16. //配置ADC的运行:
  17. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
  18. ADC_InitStructure.ADC_ScanConvMode =DISABLE; //连续多通道模式
  19. ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//ENABLE; //连续转换
  20. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定
  21. ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; //右对齐
  22. ADC_InitStructure.ADC_NbrOfChannel =1; //扫描通道数
  23. ADC_Init(ADC1,&ADC_InitStructure);
  24. ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1,ADC_SampleTime_1Cycles5); //通道X,采样时间为1.5周期,1代表规则通道第1个这个1是啥意思我不太清楚只有是1的时候我的ADC才正常。
  25. ADC_Cmd (ADC1,ENABLE); //使能或者失能指定的ADC
  26. ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能或者失能指定的ADC的软件转换启动功能
  27. }
  28. void KEYADCInit(void)
  29. {
  30. ADC_InitTypeDef ADC_InitStructure;
  31. GPIO_InitTypeDef GPIO_InitStructure;
  32. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);
  33. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  34. GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
  35. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//先内部上拉模式给IO充能
  36. GPIO_Init(GPIOA,&GPIO_InitStructure);
  37. DelayMs(100);
  38. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;
  39. GPIO_Init(GPIOA,&GPIO_InitStructure); //默认速度为两兆
  40. DelayMs(200);//让电平恢复正常
  41. //配置ADC的运行:
  42. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
  43. ADC_InitStructure.ADC_ScanConvMode =DISABLE; //连续多通道模式
  44. ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//ENABLE; //连续转换
  45. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定
  46. ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; //右对齐
  47. ADC_InitStructure.ADC_NbrOfChannel =1; //扫描通道数
  48. ADC_Init(ADC2,&ADC_InitStructure);
  49. ADC_RegularChannelConfig(ADC2,ADC_Channel_1, 1,ADC_SampleTime_1Cycles5); //通道X,采样时间为1.5周期,1代表规则通道第1个这个1是啥意思我不太清楚只有是1的时候我的ADC才正常。
  50. ADC_Cmd (ADC2,ENABLE); //使能或者失能指定的ADC
  51. ADC_SoftwareStartConvCmd(ADC2,ENABLE);//使能或者失能指定的ADC的软件转换启动功能
  52. }
  53. /***********************************************************************
  54. *获取电池电压
  55. 返回值: -1为无效 ; 正数表示电池电压放大100倍,如 382表示3.82V
  56. ***********************************************************************/
  57. int GetVbat(void)
  58. {
  59. char buf[30];
  60. static int Ct=0;
  61. static int siVbat[10]={0,0,0,0,0,0,0,0,0,0};
  62. int iVbat[10];
  63. int max[5];
  64. int sum;
  65. int i,j,k;
  66. int adc;
  67. int Vbat;
  68. ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  69. while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  70. adc=ADC_GetConversionValue(ADC1);
  71. if(adc<100 && adc>4095)
  72. {
  73. printf("VDAC OVER");
  74. return -1;
  75. }
  76. //循环存储
  77. siVbat[Ct]=adc;
  78. if(++Ct>9)Ct=0;
  79. //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]);
  80. //滤波处理,排列取3个最大值,3个最大中去掉第一大,其余求平均
  81. //拷贝
  82. for(i=0;i<10;i++){
  83. iVbat[i]=siVbat[i];
  84. }
  85. for(i=0;i<4;i++){
  86. max[i]=0;
  87. for(j=0;j<10;j++){
  88. if(iVbat[j]>max[i]){
  89. max[i]=iVbat[j];
  90. k=j;
  91. }
  92. }
  93. iVbat[k]=0;
  94. }
  95. // printf("%d,%d,%d\r\n",max[0],max[1],max[2]);
  96. sum=max[1]+max[2];
  97. if(max[2]<200)
  98. {
  99. //printf("ERR3");
  100. return -1;
  101. }
  102. Vbat=sum*308/4096;
  103. return Vbat;
  104. }
  105. /*******************************************************
  106. *CheckVbat
  107. *检查电池电压,控制低压报警,
  108. *低压关机已由硬件监测
  109. ******************************************************/
  110. void CheckVbat(int Vbat)
  111. {
  112. static unsigned char sucCt=0;//提示“请充电”计数器
  113. //if(modemInitStatus==0)return;//模块初始化完成后才操作
  114. if(Vbat<MIN_PWR_LEVEL){//340
  115. SlwTrace(INF,"Vbat low!shutdown now!",1);
  116. //关闭模块
  117. if(sutPocStatus.ModemPowerOn==1){
  118. // //发送机指令并等待7秒
  119. // cmdShutDown(1);
  120. }
  121. //发送机指令并等待7秒
  122. cmdShutDown(1);
  123. SpeakerDisable();
  124. PWR_EN_LOW;
  125. while(1);
  126. //PWR_EN_LOW;
  127. //Sleeping();
  128. }
  129. else if(Vbat<WARN_PWR_LEVEL){//提示请充电 330
  130. if(sucCt==60){
  131. MeSpeak(ENCODE_ASCII,"请充电");
  132. LCDBackLight(1);
  133. LcdOnTimeCt=0;
  134. SlwTrace(INF, "Charge bat!!",1);
  135. }
  136. if(++sucCt>180)sucCt=0;
  137. }else sucCt=0;
  138. //printf("Vbat=====%d\r\n",g_iVbat);
  139. }
  140. void BatterProcess(void){
  141. //static char tick=0;
  142. int vbat;
  143. vbat=GetVbat();
  144. if(vbat > 0) g_iVbat=vbat;
  145. printf("vbat======%d\r\n",g_iVbat);
  146. // if(++tick<=3) return;
  147. // tick=0;
  148. CheckVbat(g_iVbat);
  149. }
  150. unsigned short getBat(void){
  151. unsigned short ret;
  152. ret=(g_iVbat-MIN_PWR_LEVEL) * 100 / (400-MIN_PWR_LEVEL);
  153. return ((ret>100)?100:ret);
  154. }
  155. int GetKeyVbat(void)
  156. {
  157. char buf[30];
  158. static int Ct=0;
  159. static int siVbat[10]={0,0,0,0,0,0,0,0,0,0};
  160. int iVbat[10];
  161. int max[5];
  162. int sum;
  163. int i,j,k;
  164. int adc;
  165. int Vbat;
  166. ADC_SoftwareStartConvCmd(ADC2,ENABLE);
  167. while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET);
  168. adc=ADC_GetConversionValue(ADC2);
  169. if(adc<100 && adc>4095)
  170. {
  171. printf("VDAC OVER");
  172. return -1;
  173. }
  174. Vbat=adc*300/4096;
  175. return Vbat;
  176. }