Bubble_ADCSetup.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. /*--------------------------------------------------------------------------------------
  2. * @file Bubble_ADCSetup.c
  3. * @author 鲍胜文
  4. * @version base on stm32f0x
  5. * @date 2015.09.11
  6. * @brief OPB350L187芯片ADC采集处理
  7. ---------------------------------------------------------------------------------------*/
  8. #include "stm32f10x_gpio.h"
  9. #include "stm32f10x_adc.h"
  10. #include "stm32f10x_dma.h"
  11. #include "ControlSystem.h"
  12. #include "TypeDefine.h"
  13. #include "ADCSetup.h"
  14. #include "Bubble_ADCSetup.h"
  15. #include "SystemAlarm.h"
  16. #include "DrawLCDGUI.h"
  17. uint16_t BubbleVolt[20]={ 0xffff , 0xffff , 0xffff , 0xffff , 0xffff, 0xffff , 0xffff ,0xffff , 0xffff , 0xffff , 0xffff , 0xffff, 0xffff , 0xffff , 0xffff , 0xffff , 0xffff , 0xffff, 0xffff , 0xffff};//气泡采集数组
  18. uint16_t ElectricityVolt[50]={0}; //电机运行电流采集数组
  19. uint16_t ElectricityVolt2[20]={0};//电机停止时采集数组
  20. uint16_t BubbleCounts=0;//气泡检测次数
  21. uint16_t BubbleData=0; //气泡检测数据
  22. uint16_t BoxData=0; //药盒检测数据
  23. uint16_t BoxCont=0; //药盒检测次数
  24. uint16_t BubbleCheckTime=0; //气泡检测时间
  25. uint16_t BubbleCheckFlag=0; //气泡检测时间到,置位该标志
  26. uint16_t CheckDoneFlag=0; //采集完成标志,置位该标志
  27. uint8_t BubbleCountFlag=0; //气泡采集次数完成标志,置位该标志
  28. uint8_t BlockageRecovery = 0; //堵塞自检恢复
  29. uint8_t AnotherAlarm=0; //发生堵塞报警得时候发生未装药盒报警标志
  30. uint16_t ElectricityCheckFlag=0; //电流检测时间到,置位该标志
  31. uint16_t ElectricityCheckTime=0; //电流检测时间
  32. uint16_t ElectDoneFlag=0; //电流采集完成标志,置位该标志
  33. uint16_t ElectricityCounts=0 ; //电流检测次数
  34. uint16_t ElectricityData=0; //电流检测数据
  35. uint16_t ElectricityDatabf=0; //电流检测数据备份
  36. uint8_t ElectCountFlag=0; //电流采集次数完成标志,置位该标志
  37. uint8_t ElectStartCount=0; //按运行按键时,电流采集次数,求基准值
  38. uint16_t Elect_adaption_buf[5]={0};//自适应压力值缓冲区
  39. uint16_t Elect_adaption_buf1[5]={0};//小于基准值150时,自适应压力值缓冲区重新备份
  40. uint16_t Elect_adaption_buf2[5]={0};//大于基准值150时,自适应压力值缓冲区重新备份
  41. uint8_t ElectLargeCount=0; //计算大于电流基准值150的次数
  42. uint8_t ElectSmallCount=0; //计算小于电流基准值150的次数
  43. uint8_t ElectRunCount=0; //计算堵塞变为正常运行的采集次数
  44. uint8_t ElectBlockingCount=0; //计算堵塞采集次数
  45. uint8_t ElectricityCountsOff=0 ; //电机关闭时电流检测次数
  46. uint16_t ElectricityOffTime=0; //电机关闭时电流检测时间
  47. uint16_t ElectricityOFFflag=0; //电机关闭时电流检测时间到,置位该标志
  48. uint16_t ElectricityOffData=0; //电流检测数据
  49. /******************************************
  50. * 功能:ADC2初始化,使用PC04引脚采集
  51. ******************************************/
  52. void OPB350L_ADCInit(void)
  53. {
  54. ADC_InitTypeDef ADC_InitStructure;
  55. GPIO_InitTypeDef GPIO_InitStructure;
  56. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 | RCC_APB2Periph_GPIOC, ENABLE);
  57. /* Configure PC.04 (ADC Channel12) as analog input -------------------------*/
  58. GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_2);
  59. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  60. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  61. GPIO_Init(GPIOC, &GPIO_InitStructure);
  62. /* ADC2 configuration ------------------------------------------------------*/
  63. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;/*ADC工作在独立模式*/
  64. ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  65. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//不连续采集,开启一次AD,采集一下
  66. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;/*软件触发*/
  67. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  68. ADC_InitStructure.ADC_NbrOfChannel = 1;/*单通道*/
  69. ADC_Init(ADC2, &ADC_InitStructure);
  70. /* ADC1 regular channel12 configuration */
  71. ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);
  72. /* Enable ADC1 */
  73. ADC_Cmd(ADC2, ENABLE);
  74. /* Enable ADC1 reset calibration register */
  75. ADC_ResetCalibration(ADC2);
  76. /* Check the end of ADC1 reset calibration register */
  77. while(ADC_GetResetCalibrationStatus(ADC2));
  78. /*开始校准*/
  79. ADC_StartCalibration(ADC2);
  80. /* 等待校准结束*/
  81. while(ADC_GetCalibrationStatus(ADC2));
  82. //ADC_SoftwareStartConvCmd(ADC2, ENABLE);/*开启转换*/
  83. }
  84. /********************************************************************************************************
  85. * Function: OPB350L_ADCGet
  86. * Object: 红外气泡数据采集
  87. * 输入: 无
  88. * 输出: 无
  89. * 备注: 1、只要TaskSchedulerFlag.sensorPWBatteryFlag标志位置位或 motorWorkState == MOTOR_WORK_OFF才会采集一次电池电压值
  90. * 2、uint32_t tempADC2 = 0;临时变量读取AD数值
  91. * 3、uint16_t BubbleVolt = 0;临时变量计算采集电压
  92. * 4、通过均值算法得出稳定电压值,每采集n次值,前2次值丢弃,比较一下,取最小值
  93. *
  94. ********************************************************************************************************/
  95. void OPB350L_ADCGet( void )
  96. {
  97. uint32_t tempADC2 = 0;
  98. uint16_t Bublle_Volt = 0;
  99. uint16_t t = 0;
  100. uint8_t i,j;
  101. uint8_t Bubble_Alarm_cont=0;//一个周期内采集值低于报警阈值的次数
  102. if(( motorWorkState == MOTOR_WORK_ON ) && (TaskSchedulerFlag.sensorPWHallFlag == TASK_FLAG_SET) && (BubbleCountFlag == TASK_FLAG_CLEAR))//在电机运行的时候采集数据,在电机停止的时候出来数据
  103. {
  104. if( BubbleCheckFlag == 1 )//定时到进行AD采集
  105. {
  106. BubbleCheckFlag=0;
  107. ADC_RegularChannelConfig(ADC2, ADC_Channel_13, 1, ADC_SampleTime_55Cycles5);
  108. ADC_SoftwareStartConvCmd(ADC2, ENABLE); //启动转换
  109. while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC )); //等待转换完成
  110. Bublle_Volt=ADC_GetConversionValue(ADC2); //获取转换结果*ADC_ConvertedValue*
  111. tempADC2 = Bublle_Volt * 2515 / 4096;
  112. //printf("a=%d\r\n",tempADC2);
  113. BubbleVolt[BubbleCounts] = (uint16_t)tempADC2 ; //6这个数值是从分压电路得到
  114. BubbleCounts++;
  115. if( BubbleCounts > 20)
  116. {
  117. BubbleCounts=20;
  118. BubbleCountFlag=TASK_FLAG_SET;//当采集次数大于20时,不在采集
  119. }
  120. CheckDoneFlag=1;//采集标志
  121. }
  122. }
  123. else if( CheckDoneFlag == 1)
  124. {
  125. CheckDoneFlag=0;
  126. for( i = 1; i < BubbleCounts; i++ )
  127. {
  128. for( j = 0; j < (BubbleCounts - i); j++ )
  129. {
  130. if( BubbleVolt[j] > BubbleVolt[j + 1] )
  131. {
  132. t = BubbleVolt[j];
  133. BubbleVolt[j] = BubbleVolt[j + 1];
  134. BubbleVolt[j + 1] = t;
  135. }
  136. }
  137. // printf("b=%d\r\n",BubbleVolt[j]);
  138. }
  139. BubbleData=0;
  140. BoxData=0;
  141. for( i = 2; i < BubbleCounts-2; i++ ) //去掉前两位和后两位,然后求和取平准值
  142. {
  143. BoxData = (BoxData + BubbleVolt[i]);
  144. }
  145. BoxData = (BoxData/(BubbleCounts-4));
  146. // printf("%d\r\n",BubbleData);
  147. /* if( sysAlarmFlag.NonePillCase != ALARM_ON ) //没有未装药盒报警,进行下面判断
  148. {
  149. if(( BoxData < BOX_ALARM_UPPER_DATA ) && ( BoxData > BOX_ALARM_LOWER_DATA ))//判断未装药盒报警
  150. {
  151. if( BoxCont++ >= 1 )
  152. {
  153. BoxCont=0;
  154. SysAlarmJudge.NonePillCaseJudgeFlag = TASK_FLAG_SET;
  155. realTimeData.pressureF=10;
  156. }
  157. }
  158. else
  159. {
  160. BoxCont=0;
  161. }
  162. }*/
  163. for( i = 1; i < BubbleCounts-2; i++ ) //去掉前两位和后两位,然后求和取平准值
  164. {
  165. if( (BubbleVolt[i] < Bubble_Alarm_Value )&&(BubbleVolt[i] > Bubble_Alarm_Value_Down)) //判断气泡报警检测
  166. {
  167. Bubble_Alarm_cont++;//低于阈值 加一
  168. }
  169. }
  170. BubbleData = BubbleVolt[1];
  171. //printf("c=%d\r\n",BubbleData);
  172. BubbleCounts=0;
  173. SysAlarmJudge.BubbleFaultJudgeFlag = TASK_FLAG_SET;
  174. if( Bubble_Alarm_cont >= 2) //一个周期内采集两次小于阈值的数值,报警
  175. {
  176. Bubble_Alarm_cont=0;
  177. // BubbleData=500;
  178. }
  179. }
  180. }
  181. /********************************************************************************************************
  182. * Function: Electricity_ADCGet
  183. * Object: 电流数据采集
  184. * 输入: 无
  185. * 输出: 无
  186. * 备注: 1、只要TaskSchedulerFlag.sensorPWBatteryFlag标志位置位或 motorWorkState == MOTOR_WORK_OFF才会采集一次电池电压值
  187. * 2、uint32_t tempADC2 = 0;临时变量读取AD数值
  188. * 3、uint16_t BubbleVolt = 0;临时变量计算采集电压
  189. * 4、通过均值算法得出稳定电压值,每采集n次值,前2次值丢弃,比较一下,取最小值
  190. *
  191. ********************************************************************************************************/
  192. void Electricity_ADCGet( void )
  193. {
  194. uint32_t tempADC2_15 = 0;
  195. uint16_t Electricity_Volt = 0;
  196. uint16_t t = 0;
  197. uint8_t k=0;
  198. uint8_t i,j;
  199. if(( motorWorkState == MOTOR_WORK_ON ) && (TaskSchedulerFlag.sensorPWHallFlag == TASK_FLAG_SET) && (ElectCountFlag == TASK_FLAG_CLEAR)
  200. && (realTimeData.stateRun != Airout)&& (realTimeData.stateRun != WaitState))//在电机运行的时候采集数据,在电机停止的时候出来数据
  201. {
  202. if( ElectricityCheckFlag == 1 )//定时到进行AD采集
  203. {
  204. ElectricityCheckFlag=0;
  205. ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);
  206. ADC_SoftwareStartConvCmd(ADC2, ENABLE); //启动转换
  207. while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC )); //等待转换完成
  208. Electricity_Volt=ADC_GetConversionValue(ADC2); //获取转换结果*ADC_ConvertedValue*
  209. tempADC2_15 = Electricity_Volt * 2515 / 4096;
  210. // tempADC2_15 = Electricity_Volt;
  211. // printf("%d\r\n",tempADC2_15);
  212. ElectricityVolt[ElectricityCounts] = (uint16_t)tempADC2_15 ; //6这个数值是从分压电路得到
  213. // printf("a=%d\r\n",ElectricityVolt[ElectricityCounts]);
  214. ElectricityCounts++;
  215. if( ElectricityCounts > 50)
  216. {
  217. ElectricityCounts=50;
  218. ElectCountFlag=TASK_FLAG_SET;//当采集次数大于50时,不在采集
  219. }
  220. ElectDoneFlag=TASK_FLAG_SET;//采集标志
  221. }
  222. }
  223. else if( ElectDoneFlag == TASK_FLAG_SET)
  224. {
  225. ElectDoneFlag=TASK_FLAG_CLEAR;
  226. // if( ElectricityCounts == 50)
  227. {
  228. for( i = 1; i < ElectricityCounts; i++ )
  229. {
  230. for( j = 0; j < (ElectricityCounts - i); j++ )
  231. {
  232. if( ElectricityVolt[j] > ElectricityVolt[j + 1] )
  233. {
  234. t = ElectricityVolt[j];
  235. ElectricityVolt[j] = ElectricityVolt[j + 1];
  236. ElectricityVolt[j + 1] = t;
  237. }
  238. }
  239. // printf("a=%d\r\n",ElectricityVolt[j]);
  240. }
  241. }
  242. ElectricityData=0;
  243. ElectricityData = ElectricityVolt[ElectricityCounts-3];
  244. // printf("Data=%d\r\n",ElectricityData);
  245. if(( sysAlarmFlag.NonePillCase != ALARM_ON )&&(realTimeData.stateRun != Airout))//没有未装药盒报警,进行下面判断
  246. {
  247. if(ElectricityData < BOX_ALARM_DATA)
  248. {
  249. if( ElectSmallCount++ >= 1) //连续2次采集数值都大于基准值BLOCKING_ALARM_DATA,进行报警处理
  250. {
  251. ElectSmallCount=0;
  252. realTimeData.pressureF=10;
  253. SysAlarmJudge.NonePillCaseJudgeFlag = TASK_FLAG_SET;
  254. // if((sysAlarmFlag.JamFault == ALARM_ON) && ( EngineeringModeValue.closedState == ENGINEERINGMODE_ON ))
  255. // {
  256. // TaskSchedulerFlag.JamSelfcheckingFlag = TASK_FLAG_WAIT; //堵塞自检标志等待
  257. // sysAlarmFlag.JamFault = ALARM_OFF;//结束报警
  258. // AnotherAlarm = 1;
  259. // ElectRunCount=0;
  260. // }
  261. }
  262. }
  263. else
  264. {
  265. ElectSmallCount=0;
  266. }
  267. }
  268. if(TaskSchedulerFlag.JamSelfcheckingFlag == TASK_FLAG_WCLEAR)
  269. {
  270. /*堵塞基准值>电机电流值且(堵塞基准值)-(电机电流值且)>=(KVO堵塞阈值)*/
  271. if((ElectricityData<ElectricityDatabf)&&((ElectricityDatabf - ElectricityData)>=BLOCKING_ALARM_DATA))
  272. {
  273. JamSelfcheckThroughCycle ++;
  274. // printf("JamSelfcheckThroughCycle=%d\r\n",JamSelfcheckThroughCycle);
  275. }
  276. if(JamSelfcheckCycle >= 2)//自检3个周期后
  277. {
  278. // printf("JamSelfcheckCycle=%d\r\n",JamSelfcheckCycle);
  279. JamSelfcheckCycle = 0;
  280. /*解除报警*/
  281. if(JamSelfcheckThroughCycle>=3)//堵塞恢复
  282. {
  283. TaskSchedulerFlag.JamSelfcheckingFlag = TASK_FLAG_WAIT; //堵塞自检标志等待
  284. StartToRun_flag =1;
  285. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  286. /*重新采集基准值*/
  287. start_flag = 1;
  288. ElectricityCounts = 0;
  289. SysHornToneType = SoundOff;
  290. }
  291. /*继续堵塞*/
  292. else
  293. {
  294. ElectLargeCount = 0;//防止堵塞恢复时,滞流夹打开
  295. ElectRunCount = 0;
  296. SysAlarmJudge.JamFaultJudgeFlag = TASK_FLAG_SET;
  297. realTimeData.pressureF=50;
  298. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  299. TaskSchedulerFlag.JamSelfcheckingFlag = TASK_FLAG_SET;
  300. }
  301. JamSelfcheckThroughCycle = 0;//堵塞解除自检周期
  302. }
  303. else
  304. {
  305. TaskSchedulerTimer.motorStopTimer = 1500;
  306. }
  307. }
  308. //printf("c=%d\r\n",ElectricityData);
  309. ElectricityCounts=0;
  310. if( start_flag ==1) //连续取值五个周期,求最大值
  311. {
  312. Elect_adaption_buf[ElectStartCount] = ElectricityData;
  313. ElectStartCount++;
  314. if( ElectStartCount > 3)
  315. {
  316. ElectricityDatabf = ((Elect_adaption_buf[1] + Elect_adaption_buf[2] + Elect_adaption_buf[3])/3);
  317. // printf("Databf=%d\r\n",ElectricityDatabf);
  318. ElectStartCount=0;
  319. start_flag=0;
  320. }
  321. }
  322. else
  323. {
  324. if(TaskSchedulerFlag.JamSelfcheckingFlag == TASK_FLAG_WCLEAR)
  325. {
  326. JamSelfcheckCycle ++;
  327. }
  328. if( ElectricityData > ElectricityDatabf ) //判断堵塞报警数据处理
  329. {
  330. ElectRunCount=0;
  331. if((ElectricityData - ElectricityDatabf) > BLOCKING_ALARM_DATA)
  332. {
  333. Elect_adaption_buf2[ElectLargeCount] = ElectricityData;
  334. if( ElectLargeCount ++>= 2) //连续2次采集数值都大于基准值BLOCKING_ALARM_DATA,进行报警处理
  335. {
  336. ElectLargeCount=0;
  337. SysAlarmJudge.JamFaultJudgeFlag = TASK_FLAG_SET;
  338. realTimeData.pressureF=50;
  339. for(k=0;k<3;k++) //基准值滚动式更新
  340. {
  341. Elect_adaption_buf[k+1] = Elect_adaption_buf2[k];
  342. }
  343. ElectricityDatabf=((Elect_adaption_buf[1]+Elect_adaption_buf[2]+Elect_adaption_buf[3])/3);
  344. // printf("Databf=%d\r\n",ElectricityDatabf);
  345. if(infusionMode == FirstDoseMode)
  346. {
  347. FirstSurplusDose = realTimeData.firstDose;
  348. }
  349. else if(infusionMode == SuperadditionMode)
  350. {
  351. PCASurplusDose = realTimeData.superaddition;
  352. }
  353. }
  354. }
  355. else
  356. {
  357. for(k=0;k<3;k++) //基准值滚动式更新
  358. {
  359. Elect_adaption_buf[k] = Elect_adaption_buf[k+1];
  360. }
  361. Elect_adaption_buf[3] = ElectricityData;
  362. ElectricityDatabf = ((Elect_adaption_buf[1] + Elect_adaption_buf[2] + Elect_adaption_buf[3])/3);
  363. // printf("Databf=%d\r\n",ElectricityDatabf);
  364. }
  365. }
  366. else if( ElectricityData <= ElectricityDatabf )
  367. {
  368. ElectLargeCount=0;
  369. {
  370. // ElectSmallCount=0; //如果采集值<BLOCKING_ALARM_DATA,清除计数
  371. if((ElectricityDatabf - ElectricityData) > BLOCKING_ALARM_DATA) //运行时关闭止流夹,然后再次打开,基准值重新备份
  372. {
  373. Elect_adaption_buf1[ElectRunCount] = ElectricityData;
  374. if( ElectRunCount++ >= 2) //连续2次采集数值都大于基准值BLOCKING_ALARM_DATA,进行基准数据重新采样处理
  375. {
  376. ElectRunCount=0;
  377. for(k=0;k<3;k++) //基准值滚动式更新
  378. {
  379. Elect_adaption_buf[k+1] = Elect_adaption_buf1[k];
  380. }
  381. ElectricityDatabf=((Elect_adaption_buf[1]+Elect_adaption_buf[2]+Elect_adaption_buf[3])/3);
  382. // printf("Databf=%d\r\n",ElectricityDatabf);
  383. }
  384. }
  385. else
  386. {
  387. ElectRunCount=0;//如果采集值<BLOCKING_ALARM_DATA,清除计数
  388. for(k=0;k<3;k++) //基准值滚动式更新
  389. {
  390. Elect_adaption_buf[k] = Elect_adaption_buf[k+1];
  391. }
  392. Elect_adaption_buf[3] = ElectricityData;
  393. ElectricityDatabf = ((Elect_adaption_buf[1] + Elect_adaption_buf[2] + Elect_adaption_buf[3])/3);
  394. // printf("Databf=%d\r\n",ElectricityDatabf);
  395. }
  396. }
  397. }
  398. }
  399. }
  400. }
  401. /********************************************************************************************************
  402. * Function: Electricity_WorkOffGet
  403. * Object: 电流数据采集
  404. * 输入: 无
  405. * 输出: 无
  406. * 备注: 1、只要TaskSchedulerFlag.sensorPWBatteryFlag标志位置位或 motorWorkState == MOTOR_WORK_OFF才会采集一次电池电压值
  407. * 2、uint32_t tempADC2 = 0;临时变量读取AD数值
  408. * 3、uint16_t BubbleVolt = 0;临时变量计算采集电压
  409. * 4、通过均值算法得出稳定电压值,每采集n次值,前2次值丢弃,比较一下,取最小值
  410. *
  411. ********************************************************************************************************/
  412. void Electricity_WorkOffGet( void )
  413. {
  414. uint16_t Electricity_Volt = 0;
  415. uint32_t tempADC2_15 = 0;
  416. if(( motorWorkState == MOTOR_WORK_OFF ) && (sysAlarmFlag.MechanicalFault != ALARM_CONTINUE) && ( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_SET ))//在电机运行的时候采集数据,在电机停止的时候出来数据
  417. {
  418. if( ElectricityOFFflag == 1 )//定时到进行AD采集
  419. {
  420. ElectricityOFFflag=0;
  421. ElectricityOffTime = ONE_SECOND_TIMER; //1s检测一下
  422. ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);
  423. ADC_SoftwareStartConvCmd(ADC2, ENABLE); //启动转换
  424. while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC )); //等待转换完成
  425. Electricity_Volt=ADC_GetConversionValue(ADC2); //获取转换结果*ADC_ConvertedValue*
  426. tempADC2_15 = Electricity_Volt * 2515 / 4096;
  427. ElectricityOffData=(uint16_t)tempADC2_15;
  428. // printf("%d\r\n",tempADC2_15);
  429. if( tempADC2_15 > ELECT_DISCONT_DATA) //如果在关闭电机工程中,采集的电流值大于ELECT_DISCONT_DATA,侧进行机械报警处理
  430. {
  431. if( ElectricityCountsOff++ >= 2 )
  432. {
  433. ElectricityCountsOff=0;
  434. sysAlarmFlag.MechanicalFault = ALARM_ON;
  435. }
  436. }
  437. else
  438. {
  439. ElectricityCountsOff=0;
  440. }
  441. }
  442. }
  443. }