adc.c 6.4 KB

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