Ad.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487
  1. /*****************************************
  2. *AD程序
  3. *编写:李平
  4. *版本号:V1.00
  5. *日期:2011-7-16
  6. *文件名:Ad.c
  7. */
  8. #include "Ad.h"
  9. #include "flash.h"
  10. #include "usart.h"
  11. #include "buffer.h"
  12. #include "weight.h"
  13. #define ZERO 500000
  14. #define SPANZERO ZERO
  15. #define TRN_INI 2
  16. extern unsigned char usart1_send_data[64];
  17. extern void USART_Send_DMA(unsigned char j,int n);
  18. extern unsigned char WeightConst_ChanCheShu;
  19. ulng keyword=0;
  20. uchar stas_s0=0;//状态标志变量 0:称重状态 1:工厂标定和工厂设置状态 2:用户设置状态
  21. uchar fs[16]= {0}; //工厂参数
  22. uchar ZeroPass=0;
  23. uchar IsRealZero=0;
  24. uchar IsZeroFlag=0;
  25. uchar num_stbn=0;
  26. uchar n_stbn=0;
  27. uchar num_trn=0;
  28. uchar stbn=0;
  29. uchar IsStb=0;
  30. uchar Isol=0;
  31. uchar ad_nag_flag=0;
  32. uchar nag=0;
  33. uchar IsTare=0;
  34. ulng ad_lcd=0;
  35. ulng ad_lcd1=0;
  36. ulng ad_read=0;
  37. ulng ad_start=0;
  38. ulng ad_sample=0;
  39. ulng ad_zero=0;
  40. ulng real_zero=0;
  41. ulng ad_last=0;
  42. ulng ad_tare=0;
  43. ulng Maxval=0;
  44. uchar Inteval=0;
  45. uchar point1=0;
  46. uchar point2=0;
  47. float spanz=0;
  48. ulng Low_w=0;
  49. ulng Up_w=0;
  50. ulng err_cnt=0;
  51. ulng ok_cnt=0;
  52. uchar STB_N=2;
  53. uchar start_loop;
  54. ulng AD=0;
  55. /*******************************************/
  56. float Avad[6]= {0};
  57. float Bvad[6]= {0};
  58. float Cvad[6]= {0};
  59. float Dvad[6]= {0};
  60. float Evad[6]= {0};
  61. float Fvad[6]= {0};
  62. float Gvad[6]= {0};
  63. float Hvad[6]= {0};
  64. float Ivad[6]= {0};
  65. float Jvad[6]= {0};
  66. float AD_result=0;
  67. uchar ad_ini_flag=0;
  68. uchar ad_ini_flag1=0;
  69. float Ad_tol=0;
  70. uchar Ad_cnt=0;
  71. uchar Ad_I=0;
  72. uchar AVG_CNT=4;
  73. uchar f_zeroset=1;
  74. uchar FLT_CNT=16;
  75. uchar FLT_XF_CNT=1;
  76. ulng FilterArray[128];
  77. uchar FilterPos=0;
  78. uchar dat[32]= {0};
  79. ulng Kalman_FilterArray[128];
  80. uchar Kalman_ini_flag=0;
  81. uchar Kalman_FilterPos=0;
  82. uchar key_CNT_f=0;
  83. float percent_fl=1.000f;
  84. ulng percent_ul=999;
  85. extern uchar ini_flag1;
  86. uchar Rsbuffer[7]= {0}; //RS232使用
  87. uchar RsWeight[]=
  88. {
  89. 0x30,0x31,0x32,0x33,0x34,0x35,
  90. // "0" "1" "2" "3" "4" "5"
  91. 0x36,0x37,0x38,0x39
  92. // "6" "7" "8" "9"
  93. };
  94. float x1=0,x2=0,x0=0,y0=0,y1=0,y2=0;
  95. unsigned char buf[4] = {0,0,0,0};
  96. unsigned char isIRQ;
  97. ulng ad_sample_temp;
  98. extern void Delay(__IO uint32_t nCount);
  99. #define _nop_() Delay(1)
  100. ulng get_weight(void)
  101. {
  102. ulng tempval=0;
  103. ulng tempvalw=0;
  104. isIRQ=0;
  105. tempval = Ad_Sample1();
  106. if (tempval<0xFFFFFFFF)
  107. {
  108. ad_sample_temp = tempval;
  109. }
  110. // if (ad_sample_temp>0 && ad_sample_temp<0xFFFFF && isIRQ==0)
  111. if (isIRQ==0 && tempval<0xFFFFFFFF)
  112. ad_sample=ad_sample_temp;
  113. // ad_sample_=ad_sample;
  114. // ad_sample=(int)((float)ad_sample * 0.01 + (1.0 - 0.01) * (float)ad_sample);
  115. ad_sample = AdFilter_xf(ad_sample); //限幅滤波 FLT_XF_CNT=32;
  116. tempvalw = ad_sample;
  117. switch(fs[1])
  118. {
  119. case 1:
  120. ad_sample = Kalman_Filter(ad_sample, 0.5, 0.5);
  121. break;
  122. case 2:
  123. ad_sample = Kalman_Filter(ad_sample, 0.1, 0.5);
  124. break;
  125. case 3:
  126. ad_sample = Kalman_Filter(ad_sample, 0.05, 0.5);
  127. break;
  128. case 4:
  129. ad_sample = Kalman_Filter(ad_sample, 0.01, 0.5);
  130. break;
  131. case 5:
  132. ad_sample = Kalman_Filter(ad_sample, 0.1, 0.5);
  133. break;
  134. case 6:
  135. ad_sample = Kalman_Filter(ad_sample, 0.05, 0.5);
  136. break;
  137. case 7:
  138. ad_sample = Kalman_Filter(ad_sample, 0.1, 0.5);
  139. break;
  140. default:
  141. ad_sample = Kalman_Filter(ad_sample, 0.125, 0.5);
  142. break;
  143. }
  144. ad_sample = AdFilter(ad_sample); //滑动滤波 FLT_CNT=32;
  145. if (tempWeighttime<100){
  146. tempWeighttime ++;
  147. ad_sample = tempvalw;
  148. }
  149. ad_read = adcalculate(ad_sample);
  150. Common(); //称量状态
  151. // RS232weight(ad_lcd1);
  152. return ad_lcd1;
  153. }
  154. //---------------------------------
  155. //Function that writes to the AD7190 via the SPI port.
  156. //--------------------------------------------------------------------------------
  157. void WriteToAD7190(unsigned char count, unsigned char *buf)
  158. {
  159. unsigned char ValueToWrite = 0;
  160. unsigned char i = 0;
  161. unsigned char j = 0;
  162. // __disable_irq();
  163. AD_CLK_1;
  164. _nop_();
  165. for(i=count; i>0; i--)
  166. {
  167. ValueToWrite = *(buf + i - 1);
  168. for(j=0; j<8; j++)
  169. {
  170. AD_CLK_0;
  171. if(0x80 == (ValueToWrite & 0x80))
  172. {
  173. AD_DIN_1; //Send one to SDO pin
  174. }
  175. else
  176. {
  177. AD_DIN_0; //Send zero to SDO pin
  178. }
  179. _nop_();
  180. AD_CLK_1;
  181. _nop_();
  182. ValueToWrite <<= 1; //Rotate data
  183. }
  184. }
  185. AD_DIN_0;
  186. // __enable_irq();
  187. }
  188. //---------------------------------
  189. //Function that reads from the AD7190 via the SPI port.
  190. //--------------------------------------------------------------------------------
  191. void ReadFromAD7190(unsigned char count, unsigned char *buf)
  192. {
  193. unsigned char i = 0;
  194. unsigned char j = 0;
  195. unsigned int iTemp = 0;
  196. unsigned char RotateData = 0;
  197. // __disable_irq();
  198. AD_CLK_1;
  199. _nop_();
  200. for(j=count; j>0; j--)
  201. {
  202. for(i=0; i<8; i++)
  203. {
  204. AD_CLK_0;
  205. RotateData <<= 1; //Rotate data
  206. _nop_();
  207. iTemp = AD_R_DI; //Read SDI of AD7190
  208. AD_CLK_1;
  209. if(0x00000001 == (iTemp & 0x00000001))
  210. {
  211. RotateData |= 1;
  212. }
  213. _nop_();
  214. }
  215. *(buf + j - 1)= RotateData;
  216. }
  217. // __enable_irq();
  218. }
  219. // extern void led_change(void);
  220. /***********************************
  221. *读AD7190函数
  222. */
  223. ulng Ad_Sample1(void)
  224. {
  225. uchar i;
  226. ulng j=0;
  227. ulng AdSample=0XFFFFFFFF;
  228. // __disable_irq();
  229. AD_CLK_1;
  230. _nop_();
  231. // _nop_();
  232. while(AD_R_DI==1) {
  233. j++;
  234. if (j>1000) break;
  235. }
  236. if (j<1000)
  237. {
  238. AdSample=0;
  239. for(i=0; i<24; i++)
  240. {
  241. AD_CLK_0;
  242. // _nop_();
  243. _nop_();
  244. AdSample<<=1;
  245. if(AD_R_DI==1)
  246. AdSample++;
  247. AD_CLK_1;
  248. _nop_();
  249. // _nop_();
  250. }
  251. /*
  252. if ((AdSample&0x00800000)!=0)
  253. {
  254. AdSample=~AdSample+1;
  255. AdSample&=0x007fffff;
  256. AdSample=0x007fffff-AdSample;
  257. }
  258. else
  259. {
  260. AdSample&=0x007fffff;
  261. AdSample=0x007fffff+AdSample;
  262. }
  263. */
  264. if (fs[1]<=4 && fs[1]>0 )
  265. AdSample = AdSample>>3;
  266. else if (fs[1]>4 && fs[1]<=6 )
  267. AdSample = AdSample>>2;
  268. else
  269. AdSample = AdSample;
  270. // led_change();
  271. }
  272. //__enable_irq();
  273. return(AdSample);
  274. }
  275. /*********************************************
  276. *AD7190上电初始化处理
  277. */
  278. void adFs(unsigned char fs_)
  279. {
  280. Delay(100);
  281. AD_CS_0;
  282. AD_SYNC_1;
  283. Delay(100);
  284. //Reset AD7190
  285. buf[2]= 0xff;
  286. buf[1]= 0xff;
  287. buf[0]= 0xff;
  288. WriteToAD7190(3,buf);
  289. buf[1]= 0xff;
  290. buf[0]= 0xff;
  291. WriteToAD7190(2,buf);
  292. Delay(200);
  293. /***********************************
  294. 通信寄存器
  295. WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0
  296. 0 0 0 0 1 0 0 0
  297. */
  298. /***********************************
  299. 模式寄存器
  300. MD2|MD1|MD0|DAT_STA|CLK1|CLK0| 0 | 0
  301. 0 0 0 0 0 0 0 0
  302. SINC3| 0 |ENPAR| 0 |SINGLE|REJ60|FS9|FS8
  303. 0 0 0 0 0 1 0 0
  304. FS7|FS6|FS5|FS4|FS3|FS2|FS1|FS0
  305. 0 0 0 0 0 1 0 1
  306. */
  307. //mode register
  308. buf[0] = 0x08;
  309. WriteToAD7190(1,buf);
  310. buf[2] = 0x00;
  311. buf[1] = 0x04;
  312. // buf[0] = 0x50;//xxx Hz
  313. if (fs_==0)
  314. buf[0] = 80;//xxx Hz
  315. else
  316. /*if (fs_==1)
  317. {
  318. buf[1] = buf[1]|((480>>8)&3);//xxx Hz
  319. buf[0] = 480&0xff;//xxx Hz
  320. }
  321. else if (fs_==2)
  322. {
  323. buf[1] = buf[1]|((480>>8)&3);//xxx Hz
  324. buf[0] = 480&0xff;//xxx Hz
  325. }
  326. else if (fs_==3)
  327. {
  328. buf[1] = buf[1]|((640>>8)&3);//xxx Hz
  329. buf[0] = 640&0xff;//xxx Hz
  330. }
  331. else if (fs_==4)
  332. {
  333. buf[1] = buf[1]|((640>>8)&3);//xxx Hz
  334. buf[0] = 640&0xff;//xxx Hz
  335. }
  336. else if (fs_==5)
  337. {
  338. buf[1] = buf[1]|((1023>>8)&3);//xxx Hz
  339. buf[0] = 1023&0xff;//xxx Hz
  340. }
  341. else if (fs_==6)
  342. {
  343. buf[1] = buf[1]|((1023>>8)&3);//xxx Hz
  344. buf[0] = 1023&0xff;//xxx Hz
  345. }
  346. else if (fs_==7)
  347. */
  348. {
  349. buf[1] = buf[1]|((120>>8)&3);//xxx Hz
  350. buf[0] = 120&0xff;//xxx Hz
  351. }
  352. /*
  353. else
  354. {
  355. buf[0] = 80;//xxx Hz
  356. }
  357. */
  358. WriteToAD7190(3,buf);
  359. /***********************************
  360. 通信寄存器
  361. WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0
  362. 0 0 0 1 0 0 0 0
  363. */
  364. /*********************************
  365. 配置寄存器
  366. CHOP| 0 | 0 |REFSEL| 0 | 0 | 0| 0
  367. 0 0 0 0 0 0 0 0
  368. CH7|CH6|CH5|CH4|CH3|CH2|CH1|CH0
  369. 0 0 0 0 0 0 1 0
  370. BURN|REFDET| 0 |BUF|U/B|G2|G1|G0
  371. 0 0 0 1 0 1 1 1
  372. */
  373. //Configuration register
  374. buf[0] = 0x10;
  375. WriteToAD7190(1,buf);
  376. buf[2] = 0x80; //buf[2] = 0x80;
  377. buf[1] = 0x02;
  378. buf[0] = 0x17;
  379. WriteToAD7190(3,buf);
  380. /***********************************
  381. 通信寄存器
  382. WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0
  383. 0 0 1 0 1 0 0 0
  384. */
  385. /***********************************
  386. GPOCON寄存器
  387. 0 |BPDSW|GP32EN|GPIOEN|P3DAT|P2DAT|P1DAT|P0DAT
  388. 0 1 0 0 0 0 0 0
  389. */
  390. //GPOCON register
  391. buf[0] = 0x28;
  392. WriteToAD7190(1,buf);
  393. buf[0] = 0x40;
  394. WriteToAD7190(1,buf);
  395. /***********************************
  396. 通信寄存器
  397. WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0
  398. 0 1 0 1 1 1 0 0
  399. */
  400. //通信寄存器,连续读数据寄存器
  401. buf[0] = 0x5c;
  402. WriteToAD7190(1,buf);
  403. Delay(5);
  404. }
  405. /*********************************************
  406. *AD7190上电初始化处理
  407. */
  408. void adini(void)
  409. {
  410. Delay(100);
  411. AD_CS_0;
  412. AD_SYNC_1;
  413. Delay(100);
  414. //Reset AD7190
  415. buf[2]= 0xff;
  416. buf[1]= 0xff;
  417. buf[0]= 0xff;
  418. WriteToAD7190(3,buf);
  419. buf[1]= 0xff;
  420. buf[0]= 0xff;
  421. WriteToAD7190(2,buf);
  422. Delay(200);
  423. /***********************************
  424. 通信寄存器
  425. WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0
  426. 0 0 0 0 1 0 0 0
  427. */
  428. /***********************************
  429. 模式寄存器
  430. MD2|MD1|MD0|DAT_STA|CLK1|CLK0| 0 | 0
  431. 0 0 0 0 0 0 0 0
  432. SINC3| 0 |ENPAR| 0 |SINGLE|REJ60|FS9|FS8
  433. 0 0 0 0 0 1 0 0
  434. FS7|FS6|FS5|FS4|FS3|FS2|FS1|FS0
  435. 0 0 0 0 0 1 0 1
  436. */
  437. //mode register
  438. buf[0] = 0x08;
  439. WriteToAD7190(1,buf);
  440. buf[2] = 0x00;
  441. buf[1] = 0x04;
  442. buf[0] = 0x50;//xxx Hz
  443. WriteToAD7190(3,buf);
  444. /***********************************
  445. 通信寄存器
  446. WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0
  447. 0 0 0 1 0 0 0 0
  448. */
  449. /*********************************
  450. 配置寄存器
  451. CHOP| 0 | 0 |REFSEL| 0 | 0 | 0| 0
  452. 0 0 0 0 0 0 0 0
  453. CH7|CH6|CH5|CH4|CH3|CH2|CH1|CH0
  454. 0 0 0 0 0 0 1 0
  455. BURN|REFDET| 0 |BUF|U/B|G2|G1|G0
  456. 0 0 0 1 0 1 1 1
  457. */
  458. //Configuration register
  459. buf[0] = 0x10;
  460. WriteToAD7190(1,buf);
  461. buf[2] = 0x00;
  462. buf[1] = 0x02;
  463. buf[0] = 0x17;
  464. WriteToAD7190(3,buf);
  465. /***********************************
  466. 通信寄存器
  467. WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0
  468. 0 0 1 0 1 0 0 0
  469. */
  470. /***********************************
  471. GPOCON寄存器
  472. 0 |BPDSW|GP32EN|GPIOEN|P3DAT|P2DAT|P1DAT|P0DAT
  473. 0 1 0 0 0 0 0 0
  474. */
  475. //GPOCON register
  476. buf[0] = 0x28;
  477. WriteToAD7190(1,buf);
  478. buf[0] = 0x40;
  479. WriteToAD7190(1,buf);
  480. /***********************************
  481. 通信寄存器
  482. WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0
  483. 0 1 0 1 1 1 0 0
  484. */
  485. //通信寄存器,连续读数据寄存器
  486. buf[0] = 0x5c;
  487. WriteToAD7190(1,buf);
  488. Delay(5);
  489. }
  490. /************************
  491. *AD采样速度选择函数
  492. */
  493. void Speed(void)
  494. {
  495. switch(fs[1])
  496. {
  497. case 0:
  498. ad_ini_flag=0;
  499. ad_ini_flag1=0;
  500. FLT_CNT=4; //滑动滤波
  501. AVG_CNT=4; //平均滤波
  502. break;
  503. case 1:
  504. ad_ini_flag1=0;
  505. FLT_CNT=24;
  506. AVG_CNT=6;
  507. break;
  508. case 2:
  509. ad_ini_flag1=0;
  510. FLT_CNT=24;
  511. AVG_CNT=6;
  512. break;
  513. case 3:
  514. ad_ini_flag1=0;
  515. FLT_CNT=24;
  516. AVG_CNT=6;
  517. break;
  518. case 4:
  519. ad_ini_flag1=0;
  520. FLT_CNT=24;
  521. AVG_CNT=6;
  522. break;
  523. case 5:
  524. ad_ini_flag1=0;
  525. FLT_CNT=24;
  526. AVG_CNT=6;
  527. break;
  528. case 6:
  529. ad_ini_flag1=0;
  530. FLT_CNT=24;
  531. AVG_CNT=6;
  532. break;
  533. case 7:
  534. ad_ini_flag1=0;
  535. FLT_CNT=24;
  536. AVG_CNT=6;
  537. break;
  538. default:
  539. ad_ini_flag1=0;
  540. FLT_CNT=32;
  541. AVG_CNT=4;
  542. break;
  543. }
  544. }
  545. /****限幅滤波**********************/
  546. uchar count_xf;
  547. ulng AdFilter_xf_value;
  548. uchar ad_ini_flag_xf=0;
  549. ulng AdFilter_xf(ulng x) {
  550. uint32_t FILTER_A = 0x7FFF; //限幅100公斤
  551. int32_t FILTER_1 ;
  552. if(ad_ini_flag_xf==0)
  553. {
  554. ad_ini_flag_xf=1;
  555. count_xf=0;
  556. AdFilter_xf_value=x;
  557. return x;
  558. }
  559. FILTER_1 = x - AdFilter_xf_value;
  560. if (FILTER_1<0)
  561. FILTER_1 = FILTER_1 * -1;
  562. if(FILTER_1 > FILTER_A && count_xf<=FLT_XF_CNT)
  563. {
  564. count_xf++;
  565. }
  566. else
  567. {
  568. count_xf=0;
  569. AdFilter_xf_value = x;
  570. }
  571. return AdFilter_xf_value;
  572. }
  573. /***kalman滤波*************/
  574. /*
  575. Q:过程噪声,Q增大,动态响应变快,收敛稳定性变坏
  576. R:测量噪声,R增大,动态响应变慢,收敛稳定性变好
  577. */
  578. ulng Kalman_Filter(const double ResrcData, double ProcessNiose_Q,double MeasureNoise_R)
  579. {
  580. int32_t ad_sum = 0;
  581. ulng ad_avg = 0;
  582. double R = MeasureNoise_R;
  583. double Q = ProcessNiose_Q;
  584. static double x_last;
  585. static double p_last;
  586. double x_mid;
  587. double x_now;
  588. double p_mid ;
  589. double p_now;
  590. double kg;
  591. uchar i;
  592. uchar x__=3;
  593. uchar y__=1<<x__;
  594. if(Kalman_ini_flag==0)
  595. {
  596. for(i=0; i<y__; i++)
  597. Kalman_FilterArray[i]=0;
  598. Kalman_ini_flag=1;
  599. }
  600. Kalman_FilterPos++;
  601. if (Kalman_FilterPos>=y__)
  602. Kalman_FilterPos=0;
  603. Kalman_FilterArray[Kalman_FilterPos]=ResrcData;
  604. ad_sum = 0;
  605. for (i=0; i<y__; i++)
  606. ad_sum+=Kalman_FilterArray[i];
  607. ad_avg = ad_sum>>x__;
  608. ad_sum = 0;
  609. // for (i=0; i<y__; i++)
  610. // ad_sum+=(int)(Kalman_FilterArray[i]-ad_avg)*(int)(Kalman_FilterArray[i]-ad_avg);
  611. //
  612. // R = (ad_sum>>(x__+2));
  613. for (i=0; i<y__; i++)
  614. ad_sum+=(Kalman_FilterArray[i]-ad_avg);
  615. if (ad_sum <0) ad_sum=ad_sum*-1;
  616. // R = 1<<ad_sum;
  617. x_mid=x_last; //x_last=x(k-1|k-1),x_mid=x(k|k-1)
  618. p_mid=p_last+Q; //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声
  619. kg=p_mid/(p_mid+R); //kg为kalman filter,R为噪声
  620. x_now=x_mid+kg*(ResrcData-x_mid); //估计出的最优值
  621. p_now=(1-kg)*p_mid; //最优值对应的covariance
  622. p_last = p_now; //更新covariance值
  623. x_last = x_now; //更新系统状态值
  624. return x_now;
  625. }
  626. /****************************/
  627. ulng AdFilter(ulng x)
  628. {
  629. ulng ad_sum = 0;
  630. uchar i;
  631. if(ad_ini_flag1==0)
  632. {
  633. for(i=0; i<FLT_CNT; i++)
  634. {
  635. FilterArray[i]=x;
  636. }
  637. ad_ini_flag1=1;
  638. return x;
  639. }
  640. FilterPos++;
  641. if (FilterPos>=FLT_CNT)
  642. {
  643. FilterPos=0;
  644. }
  645. FilterArray[FilterPos]=x;
  646. for (i=0; i<FLT_CNT; i++)
  647. {
  648. ad_sum+=FilterArray[i];
  649. }
  650. return(ad_sum/(FLT_CNT));
  651. }
  652. /***************************
  653. *标定系数保存
  654. *地址:33--52
  655. */
  656. void ArgSave(void)
  657. {
  658. ad_Maxval = Maxval;
  659. ad_Inteval = Inteval;
  660. ad_Point = point1;
  661. ad_Spanz = spanz;
  662. ad_Zero = ad_zero;
  663. write_Flash("ad_Maxval", &ad_Maxval, sizeof(ad_Maxval));
  664. write_Flash("ad_Inteval", &ad_Inteval, sizeof(ad_Inteval));
  665. write_Flash("ad_Point", &ad_Point, sizeof(ad_Point));
  666. write_Flash("ad_Spanz", &ad_Spanz, sizeof(ad_Spanz));
  667. write_Flash("ad_Zero", &ad_Zero, sizeof(ad_Zero));
  668. W_fs();
  669. if((stas_s0==0)||(stas_s0==1))
  670. Zero_Save();
  671. }
  672. /***************************
  673. *标定系数读出
  674. *地址:32--52
  675. */
  676. void ArgRead(void)
  677. {
  678. Maxval = ad_Maxval;
  679. Inteval = ad_Inteval;
  680. point1 = ad_Point;
  681. spanz = ad_Spanz;
  682. ad_zero = ad_Zero;
  683. point2=0;
  684. adini();
  685. R_fs();
  686. Zero_Read();
  687. Speed();
  688. adFs(fs[1]);
  689. }
  690. /**********************************
  691. *写工厂设置参数
  692. *固定地址:1-16
  693. */
  694. void W_fs(void)
  695. {
  696. ad_FS = fs[1];
  697. write_Flash("ad_FS", &ad_FS, sizeof(ad_FS));
  698. }
  699. /***************************
  700. *读工厂设置参数
  701. *固定地址:1-16
  702. */
  703. void R_fs(void)
  704. {
  705. fs[1] = ad_FS;
  706. }
  707. /************************************
  708. *标定参数默认值
  709. */
  710. void ArgIni(void)
  711. {
  712. fs[1]=0;
  713. Maxval=3000;
  714. spanz=0.5;
  715. Inteval=1;
  716. point1=3;
  717. point2=0;
  718. ad_zero=ZERO;
  719. }
  720. /************************************
  721. *零点参数保存
  722. *地址 53--56
  723. */
  724. void Zero_Save(void)
  725. {
  726. ad_Tare = ad_tare;
  727. write_Flash("ad_Tare", &ad_Tare, sizeof(ad_Tare));
  728. }
  729. /************************************
  730. *零点参数读出
  731. *地址 53--56
  732. */
  733. void Zero_Read(void)
  734. {
  735. ad_tare = ad_Tare;
  736. }
  737. /*************************************
  738. Description: 转换十进制至bcd准备显示(重量)
  739. Argument: none
  740. Return: none
  741. *************************************/
  742. void DisplayWeight_ww(__IO ulng dis_data)
  743. {
  744. uchar digit;
  745. ulng divider=100000; //除数
  746. uchar quotient=0; //商
  747. if(dis_data>999999)
  748. {
  749. dis_data=0; //超过显示最大值送零
  750. }
  751. for(digit=0; digit<6; digit++)
  752. {
  753. quotient=0;
  754. while(dis_data>(divider-1))
  755. {
  756. dis_data-=divider;
  757. quotient++;
  758. }
  759. divider/=10;
  760. Rsbuffer[digit]=RsWeight[quotient];
  761. }
  762. }
  763. void RS232weight(__IO ulng x)
  764. {
  765. DisplayWeight_ww(x);
  766. //2D 33 36 35 34 0D
  767. //02 2B 30 30 30 30 30 30 33 03
  768. // 30 30 2E 30 30 30 0D 0A
  769. if (WeightConst_ChanCheShu==9)
  770. {
  771. usart1_send_data[0] = 0x04;
  772. usart1_send_data[1] = (ad_sample_temp>>24)&0xFF;
  773. usart1_send_data[2] = (ad_sample_temp>>16)&0xFF;
  774. usart1_send_data[3] = (ad_sample_temp>>8)&0xFF;
  775. usart1_send_data[4] = ad_sample_temp&0xFF;
  776. }
  777. else
  778. {
  779. usart1_send_data[0] = 0x06;
  780. if (nag)
  781. {
  782. usart1_send_data[1] = 0x2D;
  783. for(int i=2; i<6; i++) usart1_send_data[i] = Rsbuffer[i];
  784. }
  785. else
  786. for(int i=1; i<6; i++) usart1_send_data[i] = Rsbuffer[i];
  787. }
  788. usart1_send_data[6] = 0x0D;
  789. rt_sem_take(uart1_lock, RT_WAITING_FOREVER);
  790. HAL_UART_Transmit_DMA(&huart1, usart1_send_data, usart1_send_data[0]);
  791. rt_sem_release(uart1_lock);
  792. }
  793. /*********************************
  794. *小数点位 1-5
  795. */
  796. void setPoint(__IO uchar val_)
  797. {
  798. point1 = val_;
  799. ArgSave();
  800. }
  801. /*********************************
  802. *分度值 1、2、5、10
  803. */
  804. void setInteval(__IO uchar val_)
  805. {
  806. Inteval=val_;
  807. ArgSave();
  808. }
  809. /*********************************
  810. *滤波级别 1-8
  811. */
  812. void setFS(__IO uchar val_)
  813. {
  814. fs[1] = val_;
  815. adFs(fs[1]);
  816. Speed();
  817. ArgSave();
  818. }
  819. /*********************************
  820. *校正百分比
  821. */
  822. void setPercent(__IO int val_)
  823. {
  824. percent_fl=(float)val_/1000;
  825. spanz = spanz + spanz * percent_fl; //保存新的校正
  826. ArgSave();
  827. }
  828. /*********************************
  829. *最大称量
  830. */
  831. void setMaxval(__IO ulng val_)
  832. {
  833. Maxval = val_;
  834. ArgSave();
  835. }
  836. /*********************************
  837. *0点校正
  838. */
  839. void setZeroCal(void)
  840. {
  841. if ((ad_sample>0)&&(ad_sample<50000000))
  842. {
  843. zerocalculate(); //0点计算
  844. ArgSave();
  845. }
  846. }
  847. /*********************************
  848. *砝码校正
  849. */
  850. void setFullCal(__IO ulng val_)
  851. {
  852. keyword = val_;
  853. if ((ad_sample-ad_zero)>=(keyword/Inteval*10)&&(ad_sample>ad_zero)&&(keyword!=0))
  854. {
  855. fullcalculate(); //砝码计算
  856. ArgSave();
  857. }
  858. }
  859. /*********************************
  860. *置零
  861. */
  862. void setZero(void)
  863. {
  864. Zero_Pro();
  865. }
  866. /*********************************
  867. *称量计算显示函数
  868. */
  869. void Common(void)
  870. {
  871. if(f_zeroset==0)
  872. {
  873. CommonModeIni();
  874. }
  875. CheckZero(ad_read);
  876. Do();
  877. Dis_Weight();
  878. }
  879. /*********************************************
  880. *零点检测
  881. */
  882. void CheckZero(__IO ulng check_data)
  883. {
  884. ulng zero_range;
  885. zero_range=24;
  886. if(check_data>real_zero)
  887. {
  888. check_data-=real_zero;
  889. }
  890. else
  891. {
  892. check_data=real_zero-check_data;
  893. }
  894. IsRealZero=(check_data<zero_range);
  895. IsZeroFlag=IsRealZero;
  896. }
  897. /*********************************************
  898. *初始零点建立
  899. */
  900. void CommonModeIni(void)
  901. {
  902. IsStb=0;
  903. while(!IsStb)
  904. {
  905. ad_sample=Ad_Sample1();
  906. ad_sample=AdFilter(ad_sample);
  907. ad_sample=EX_QR_Filter(ad_sample);
  908. ad_read=adcalculate(ad_sample);
  909. Check_Wen1();
  910. ad_last=ad_read;
  911. }
  912. Zero_Read();
  913. ad_read=ad_tare;
  914. ad_lcd=ad_read;
  915. ad_start=ad_read;
  916. ad_last=ad_read;
  917. real_zero=ad_read;
  918. f_zeroset=1;
  919. }
  920. /*********************************************
  921. *开机稳定判别
  922. */
  923. void Check_Wen1(void)
  924. {
  925. ulng check_Wdata1;
  926. ulng check_Wdata2;
  927. ulng stb_w;
  928. stb_w=50;
  929. check_Wdata1 = ad_last - stb_w;
  930. check_Wdata2 = ad_last + stb_w;
  931. if(((ad_read>check_Wdata1)&&(ad_read<check_Wdata2) ))
  932. {
  933. if(n_stbn>=20)
  934. {
  935. n_stbn=0;
  936. IsStb=1;
  937. }
  938. else
  939. {
  940. n_stbn++;
  941. }
  942. }
  943. else
  944. {
  945. n_stbn=0;
  946. }
  947. }
  948. /*********************************************
  949. *稳定判别
  950. */
  951. void Check_Wen(void)
  952. {
  953. ulng check_Wdata1;
  954. ulng check_Wdata2;
  955. ulng stb_w;
  956. stb_w=5;
  957. STB_N=5;
  958. check_Wdata1 = ad_last - stb_w;
  959. check_Wdata2 = ad_last + stb_w;
  960. if((ad_read>check_Wdata1)&&(ad_read<check_Wdata2))
  961. {
  962. if(n_stbn>=STB_N)
  963. {
  964. n_stbn=0;
  965. IsStb=1;
  966. }
  967. else
  968. {
  969. n_stbn++;
  970. }
  971. }
  972. else
  973. {
  974. n_stbn=0;
  975. }
  976. }
  977. /*********************************************
  978. *不稳定判别
  979. */
  980. void Check_Not_Wen(void)
  981. {
  982. ulng check_data1;
  983. ulng check_data2;
  984. ulng nstb_w;
  985. nstb_w=10;
  986. check_data1=ad_lcd-nstb_w;
  987. check_data2=ad_lcd+nstb_w;
  988. if((ad_read<check_data1)||(ad_read>check_data2))
  989. {
  990. IsStb=0;
  991. }
  992. }
  993. /*********************************************
  994. *开机零点检测
  995. *Return: 0 开机零点超出范围
  996. * 1 开机零点在范围内
  997. */
  998. uchar Check_Start(void)
  999. {
  1000. ulng check1=0;
  1001. ulng check2=0;
  1002. check1=SPANZERO-(Maxval/(ulng)Inteval*2);//20%
  1003. check2=SPANZERO+(Maxval/(ulng)Inteval*2);
  1004. if((ad_read<check1)||(ad_read>check2))
  1005. {
  1006. return(0);
  1007. }
  1008. else
  1009. {
  1010. return(1);
  1011. }
  1012. }
  1013. /*********************************************
  1014. *零点跟踪
  1015. */
  1016. void Zero_Trace(void)
  1017. {
  1018. ulng check_data1;
  1019. ulng check_data2;
  1020. ulng ZeroTrace_w;
  1021. uchar trn_cnt;
  1022. ZeroTrace_w = 5;
  1023. check_data1=ad_start-Maxval/((ulng)Inteval*2)/10;//600;
  1024. check_data2=ad_start+Maxval/((ulng)Inteval*2)/10;//600;
  1025. if((ad_read<check_data1)||(ad_read>check_data2))
  1026. {
  1027. num_trn=0;
  1028. return;
  1029. }
  1030. check_data1=real_zero-1;
  1031. check_data2=real_zero+1;
  1032. if((ad_read>=check_data1)&&(ad_read<=check_data2))
  1033. {
  1034. num_trn=0;
  1035. return;
  1036. }
  1037. check_data1=real_zero-ZeroTrace_w;
  1038. check_data2=real_zero+ZeroTrace_w;
  1039. if((ad_read<=check_data1)||(ad_read>=check_data2))
  1040. {
  1041. num_trn=0;
  1042. return;
  1043. }
  1044. trn_cnt=5;
  1045. if(num_trn>=trn_cnt)
  1046. {
  1047. if (ad_read>=real_zero)
  1048. {
  1049. real_zero++;
  1050. ad_tare++;
  1051. }
  1052. else
  1053. {
  1054. real_zero--;
  1055. ad_tare--;
  1056. }
  1057. num_trn=0;
  1058. }
  1059. else
  1060. {
  1061. num_trn++;
  1062. }
  1063. }
  1064. /*********************************************
  1065. *四舍五入计算
  1066. */
  1067. ulng RoundOff(__IO ulng data1,__IO ulng data2)
  1068. {
  1069. ulng result;
  1070. ulng remainder;
  1071. result=data1/data2;
  1072. remainder=data1%data2 ;
  1073. if ((remainder*2)>=data2)
  1074. {
  1075. result++;
  1076. }
  1077. return (result);
  1078. }
  1079. /*********************************************
  1080. *外码计算
  1081. */
  1082. void Dis_Weight(void)
  1083. {
  1084. ulng Ovcheck;
  1085. ad_dis_calcu();
  1086. AD=ad_lcd1;//保存ad码
  1087. if(ad_lcd>=real_zero)
  1088. {
  1089. Ovcheck=ad_lcd-real_zero;
  1090. }
  1091. else
  1092. {
  1093. Ovcheck=real_zero-ad_lcd;
  1094. }
  1095. if(Ovcheck<=((Maxval/Inteval)*10+90))
  1096. {
  1097. Isol=0;
  1098. }
  1099. else
  1100. {
  1101. Isol=1;
  1102. }
  1103. ad_lcd1=RoundOff(ad_lcd1,10);
  1104. ad_lcd1 = ad_lcd1 * Inteval;
  1105. if(ad_lcd1==0)
  1106. {
  1107. ad_nag_flag=0;
  1108. }
  1109. if (ad_lcd1<=Inteval*3)
  1110. {
  1111. nag=0;
  1112. }
  1113. if (ad_lcd1<=20*Inteval)
  1114. {
  1115. ZeroPass=0;
  1116. }
  1117. }
  1118. /***************************************
  1119. *皮重计算
  1120. */
  1121. void ad_dis_calcu(void)
  1122. {
  1123. if(ad_lcd>=ad_tare)
  1124. {
  1125. ad_nag_flag=0;
  1126. nag=0;
  1127. ad_lcd1=ad_lcd-ad_tare;
  1128. }
  1129. else
  1130. {
  1131. ad_nag_flag=1;
  1132. nag=1;
  1133. ad_lcd1=ad_tare-ad_lcd;
  1134. }
  1135. if(ad_tare>=real_zero)
  1136. {
  1137. if((ad_tare-real_zero)<5)
  1138. {
  1139. IsTare=0;
  1140. }
  1141. else
  1142. {
  1143. IsTare=1;
  1144. }
  1145. }
  1146. else
  1147. {
  1148. if((real_zero-ad_tare)<5)
  1149. {
  1150. IsTare=0;
  1151. }
  1152. else
  1153. {
  1154. IsTare=1;
  1155. }
  1156. }
  1157. }
  1158. /*********************************************
  1159. Description:
  1160. Argument :
  1161. Return :
  1162. **********************************************/
  1163. void Do()
  1164. {
  1165. if(IsStb)
  1166. {
  1167. Check_Not_Wen();
  1168. Zero_Trace();
  1169. ad_lcd = ad_read;
  1170. }
  1171. else
  1172. {
  1173. Check_Wen();
  1174. ad_lcd = ad_read;
  1175. }
  1176. CheckZero(ad_read);
  1177. ad_last=ad_read;
  1178. }
  1179. /*********************************************/
  1180. /******************************
  1181. *置零处理
  1182. */
  1183. void Zero_Pro(void)
  1184. {
  1185. //ulng Start_w;
  1186. if(stas_s0==0)
  1187. {
  1188. //Start_w=((Maxval/(ulng)Inteval)*5)/10;//5%
  1189. //if ((IsStb)&&(ad_lcd<=(ad_start+Start_w))&&(ad_lcd>=(ad_start-Start_w))&&(!IsTare))
  1190. if ((IsStb)&&(!IsTare))
  1191. // if (IsStb)
  1192. {
  1193. ad_tare=ad_tare+(ad_lcd-real_zero);
  1194. real_zero=ad_lcd;
  1195. Zero_Save();
  1196. }
  1197. return;
  1198. }
  1199. }
  1200. /***************************
  1201. *最大去皮量计算
  1202. */
  1203. ulng maxtare(void)
  1204. {
  1205. return(Maxval-Inteval);
  1206. }
  1207. /***************************
  1208. *去皮处理
  1209. */
  1210. void Tare_Pro(void)
  1211. {
  1212. if ((IsStb)&&(stas_s0==0))
  1213. {
  1214. if ((ad_lcd>=real_zero) && ((ad_lcd-real_zero)<=((maxtare()/Inteval)*10)))
  1215. {
  1216. ad_tare = ad_lcd;
  1217. }
  1218. }
  1219. if ((IsStb)&&(IsZeroFlag)&&(stas_s0==0))
  1220. {
  1221. ad_tare = ad_lcd;
  1222. real_zero = ad_lcd;
  1223. IsTare = 0;
  1224. }
  1225. if ((IsStb)&&(IsTare)&&(ad_lcd<real_zero)&&(stas_s0==0))
  1226. {
  1227. ad_tare = real_zero;
  1228. }
  1229. }
  1230. /*************************************************/
  1231. /******************************
  1232. *置零处理
  1233. */
  1234. void Zero_Pro1(void)
  1235. {
  1236. ulng Start_w;
  1237. if(stas_s0==0)
  1238. {
  1239. Start_w=((Maxval/(ulng)Inteval)*5)/10;//5%
  1240. if ((IsStb)&&(ad_lcd<=(ad_start+Start_w))&&(ad_lcd>=(ad_start-Start_w))&&(!IsTare))
  1241. {
  1242. ad_tare=ad_tare+(ad_lcd-real_zero);
  1243. real_zero=ad_lcd;
  1244. Zero_Save();
  1245. }
  1246. return;
  1247. }
  1248. }
  1249. /***********************************
  1250. *重量标定计算
  1251. */
  1252. void fullcalculate(void)
  1253. {
  1254. float SpanFull=0;
  1255. float spanz1=0;
  1256. SpanFull=((float)keyword/(float)Inteval*10);
  1257. spanz1=SpanFull;
  1258. spanz=(spanz1/((float)ad_sample-(float)ad_zero));
  1259. ad_read=adcalculate(ad_zero); //建立零点
  1260. ad_last=ad_read;
  1261. ad_lcd= ad_read;
  1262. ad_start=ad_read;
  1263. ad_tare=ad_read;
  1264. real_zero=ad_read;
  1265. f_zeroset=1;
  1266. }
  1267. /******************************************
  1268. *标定零位计算
  1269. */
  1270. void zerocalculate(void)
  1271. {
  1272. ad_zero=ad_sample;
  1273. }
  1274. /***********************************
  1275. *AD值计算
  1276. */
  1277. ulng adcalculate(__IO ulng ads)
  1278. {
  1279. float adcal=0;
  1280. adcal=(float)ads-((float)ad_zero-((float)ZERO/spanz)); // ZERO=500000; ad_zero=500000; spanz=1。2010-01-24
  1281. adcal=adcal*spanz;
  1282. return((ulng)(adcal+0.5));
  1283. }
  1284. /***************************************/
  1285. /*************************************
  1286. *滤波函数
  1287. *输入:采样值x
  1288. *输出:返回滤波后的结果值
  1289. */
  1290. ulng EX_QR_Filter(ulng x)
  1291. {
  1292. uchar i;
  1293. if(ad_ini_flag==0)
  1294. {
  1295. for(i=0; i<4; i++)
  1296. {
  1297. Avad[i]=x;
  1298. Bvad[i]=x;
  1299. Cvad[i]=x;
  1300. Dvad[i]=x;
  1301. Evad[i]=x;
  1302. Fvad[i]=x;
  1303. Gvad[i]=x;
  1304. Hvad[i]=x;
  1305. Ivad[i]=x;
  1306. Jvad[i]=x;
  1307. }
  1308. ad_ini_flag=1;
  1309. return(x);
  1310. }
  1311. else
  1312. {
  1313. Ad_tol+=x;
  1314. Ad_cnt++;
  1315. if(Ad_cnt>=AVG_CNT)
  1316. {
  1317. Avad[3]=Avad[2];
  1318. Avad[2]=Avad[1];
  1319. Avad[1]=Avad[0];
  1320. Avad[0]=Ad_tol/AVG_CNT;
  1321. Ad_cnt=0;
  1322. Ad_tol=0;
  1323. }
  1324. else
  1325. {
  1326. return((ulng)(AD_result+0.5f));
  1327. }
  1328. }
  1329. Bvad[3]=Bvad[2];
  1330. Bvad[2]=Bvad[1];
  1331. Bvad[1]=Bvad[0];
  1332. Bvad[0]=0.1f*Avad[0]+0.2f*Avad[1]+0.3f*Avad[2]+0.4f*Avad[3];
  1333. Cvad[3]=Cvad[2];
  1334. Cvad[2]=Cvad[1];
  1335. Cvad[1]=Cvad[0];
  1336. Cvad[0]=0.1f*Bvad[0]+0.2f*Bvad[1]+0.3f*Bvad[2]+0.4f*Bvad[3];
  1337. Dvad[3]=Dvad[2];
  1338. Dvad[2]=Dvad[1];
  1339. Dvad[1]=Dvad[0];
  1340. Dvad[0]=0.1f*Cvad[0]+0.2f*Cvad[1]+0.3f*Cvad[2]+0.4f*Cvad[3];
  1341. Evad[3]=Evad[2];
  1342. Evad[2]=Evad[1];
  1343. Evad[1]=Evad[0];
  1344. Evad[0]=0.1f*Dvad[0]+0.2f*Dvad[1]+0.3f*Dvad[2]+0.4f*Dvad[3];
  1345. Fvad[3]=Fvad[2];
  1346. Fvad[2]=Fvad[1];
  1347. Fvad[1]=Fvad[0];
  1348. Fvad[0]=0.1f*Evad[0]+0.2f*Evad[1]+0.3f*Evad[2]+0.4f*Evad[3];
  1349. if (fs[1]==0)
  1350. AD_result=Avad[0];
  1351. else if (fs[1]==1)
  1352. AD_result=Avad[0];
  1353. else if (fs[1]==2)
  1354. AD_result=Avad[0];
  1355. else if (fs[1]==3)
  1356. AD_result=Avad[0];
  1357. else if (fs[1]==4)
  1358. AD_result=Avad[0];
  1359. else if (fs[1]==5)
  1360. AD_result=Bvad[0];
  1361. else if (fs[1]==6)
  1362. AD_result=Cvad[0];
  1363. else
  1364. AD_result=Dvad[0];
  1365. return((ulng)(AD_result+0.5f));
  1366. }
  1367. /****************************************************
  1368. * 这是一个延迟函数
  1369. */
  1370. void Delay(__IO uint32_t nCount)
  1371. {
  1372. /* __IO 就是volatile, 加上这个后可以避免延迟函数被编译器优化掉 */
  1373. for(; nCount != 0; nCount--);
  1374. }
  1375. /********************************************************/