Ad.c 30 KB

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