adc.c 5.8 KB

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