




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目實(shí)戰(zhàn)之一:基于ADUC7061的Modbus智能傳感器模塊已經(jīng)兩周沒寫文章了,適逢金三銀四,最近也打算換工作,好好把項(xiàng)目復(fù)盤下。目錄項(xiàng)目實(shí)戰(zhàn)之一:基于ADUC7061的Modbus智能傳感器模塊前言一、硬件二、軟件1.CRC-16校驗(yàn)算法2.中位值平均濾波算法3.快速排序4.二分查找總結(jié)前言現(xiàn)在所在的這家公司是做儀器儀表的,所有的產(chǎn)品都是圍繞傳感器開發(fā)。傳感器大部分來自美國(guó)Baseline和英國(guó)Alpha,一個(gè)上千;也有國(guó)產(chǎn)的,幾百不等,不過說真的,性能差太多。這玩意核心還是材料,國(guó)產(chǎn)在這方面還有很長(zhǎng)的路要走。靠賣傳感器自然賺不到錢,主要收入還是靠產(chǎn)品定制。比如前一個(gè)客戶需要TVOC,后一個(gè)客戶需要NH3和H2S,只要稍微修改下就好了;傳感器越多,儀表售價(jià)越高,特別是帶顯示的那種。由于是Modbus協(xié)議和4~20mA輸出,所以在工業(yè)上用途很廣。一、硬件我來這家公司的時(shí)候,源代碼都沒有,于是讓我重新開發(fā)。硬件平臺(tái)是ADUC7061,好家伙,內(nèi)置24位ADC。于是我就自己畫了個(gè)開發(fā)板,自己焊好,對(duì)于不擅長(zhǎng)硬件的我來說,這MCU是真難焊。不過點(diǎn)燈成功的時(shí)候,還是成就感滿滿。這塊芯片baidu上資料不多,直接開源了吧:二、軟件當(dāng)時(shí)老板提出的要求是:1、功能在原來的基礎(chǔ)上增加多點(diǎn)標(biāo)定、0.4-2V輸出;2、輸出協(xié)議改成RS485/Modbus協(xié)議;3、精度提升。于是軟件功能模塊很明顯了:GPIO、ADC、DAC、UART、FLASH。軟件算法主要用到了CRC-16校驗(yàn)、快速排序、中位值平均濾波、二分查找,其他好像也沒了。1.CRC-16校驗(yàn)算法這個(gè)是比較常見的校驗(yàn)算法。//CRC校驗(yàn)//arr[]:要校驗(yàn)的數(shù)組//size:數(shù)組長(zhǎng)度-2//比如010301010001D436,輸入010301010001//輸出CRC_tmp,(char)CRC_tmp和CRC_tmp>>8即D436u16CRC_Check(u8arr[350],u8size){ u16j,k,CRC_tmp=0xffff;//CRC寄存器初始值for(j=0;j<size;j++)//循環(huán)計(jì)算每個(gè)數(shù)據(jù){CRC_tmp=arr[j]^CRC_tmp;//將八位數(shù)據(jù)與crc寄存器異或for(k=0;k<8;k++)//此處的8--指每一個(gè)char類型8bit,每bit都要處理{ if(CRC_tmp&0x01)//判斷右移出的是不是1,如果是1則與多項(xiàng)式進(jìn)行異或{CRC_tmp=CRC_tmp>>1;//先將數(shù)據(jù)右移一位CRC_tmp=CRC_tmp^0xa001; //與上面的多項(xiàng)式進(jìn)行異或}else{CRC_tmp=CRC_tmp>>1; //如果不是1,則直接移出}}}returnCRC_tmp;}其他校驗(yàn)算法還有校驗(yàn)和、異或校驗(yàn)等。//校驗(yàn)和uint8_tCheckSum(uint8_t*Buf,uint8_tLen){uint8_ti=0;uint8_tsum=0;uint8_tchecksum=0;for(i=0;i<Len;i++){sum+=*Buf++;}checksum=sum&0xff;returnchecksum;}//異或校驗(yàn)uint8_tCheckXOR(uint8_t*Buf,uint8_tLen){uint8_ti=0;uint8_tx=0;for(i=0;i<Len;i++){x=x^(*(Buf+i));}returnx;}2.中位值平均濾波算法要提高精度,24bits的ADC已經(jīng)足夠高了,但是我測(cè)試中發(fā)現(xiàn)硬件并不能達(dá)到,于是還得在軟件上增加濾波。一開始使用的是滑動(dòng)平均濾波,測(cè)試中發(fā)現(xiàn)偶爾來一個(gè)干擾就會(huì)把平均值拉高;然后改成了中值濾波,發(fā)現(xiàn)又沒有均值濾波穩(wěn)定;于是就把兩種濾波結(jié)合到了一起:#defineFilter_N9doublefilter(doubleADC_Rtd)//滑動(dòng)均值濾波 {unsignedcharl,m;doublesum=0,value=0;doublefilter_buf[Filter_N];//滑動(dòng)AdcBuf_Sliding[Sliding_N]=ADC_Rtd; if(Sliding_N==Filter_N){Sliding_N=0;}else{Sliding_N++;}for(l=0;l<Filter_N;l++){filter_buf[l+1]=AdcBuf_Sliding[l];}//冒泡排序 for(j=0;j<Filter_N-1;j++) {for(i=0;i<Filter_N-j;i++){if(AdcBuf_Filter[i]>AdcBuf_Filter[i+1]){temp=AdcBuf_Filter[i];AdcBuf_Filter[i]=AdcBuf_Filter[i+1];AdcBuf_Filter[i+1]=temp;}}}for(m=Filter_N/3+1;m<Filter_N*2/3+1;m++){//去掉最低1/3和最高1/3取平均sum+=filter_buf[m];value=sum*3/Filter_N;}return(value);}3.快速排序然后發(fā)現(xiàn)丟包有點(diǎn)高,把上面的冒泡排序改成了快速排序。intqusort(doubles[],intstart,intend)//快速排序{inti,j; //定義變量為基本整型i=start; //將每組首個(gè)元素賦給ij=end; //將每組末尾元素賦給js[0]=s[start]; //設(shè)置基準(zhǔn)值while(i<j){while(i<j&&s[0]<s[j])j--; //位置左移if(i<j){s[i]=s[j];//將s[j]放到s[i]的位置上i++; //位置右移}while(i<j&&s[i]<=s[0])i++; //位置左移if(i<j){s[j]=s[i];//將大于基準(zhǔn)值的s[j]放到s[i]位置j--; //位置左移}}s[i]=s[0]; //將基準(zhǔn)值放入指定位置if(start<i)qusort(s,start,j-1);//對(duì)分割出的部分遞歸調(diào)用qusort()函數(shù)if(i<end)qusort(s,j+1,end);return0;}#defineFilter_N9doublefilter(doubleADC_Rtd)//滑動(dòng)均值濾波{unsignedcharl,m;doublesum=0,value=0;doublefilter_buf[Filter_N];AdcBuf_Sliding[Sliding_N]=ADC_Rtd;//滑動(dòng)if(Sliding_N==Filter_N){Sliding_N=0;}else{Sliding_N++;}for(l=0;l<Filter_N;l++){filter_buf[l+1]=AdcBuf_Sliding[l];}qusort(filter_buf,0,Filter_N);//快速排序for(m=Filter_N/3+1;m<Filter_N*2/3+1;m++)//去掉最低1/3和最高1/3取平均{sum+=filter_buf[m];value=sum*3/Filter_N;}return(value);}4.二分查找由于需要多點(diǎn)標(biāo)定,濃度與ADC是成正線性關(guān)系,就滿足了有序數(shù)列,于是就想到了用二分算法。#include<stdio.h>/*----------------------------------------------------------------------*Function:BinarySearch(int*arr,intkey,intmin,intmax)*Discription:二分查找首個(gè)大于等于指定數(shù)字的位置*Inputs:arr,指向被查找有序序列的指針;*key,被查找的數(shù)*min,左邊界*msx,右邊界*Outputs:none*return:-1,未找到;*-2,輸入?yún)?shù)異常;*其他,被查找元素對(duì)應(yīng)的數(shù)組下標(biāo)*---------------------------------------------------------------------*/intBinarySearch(int*arr,intkey,intmin,intmax){intmid=0;if(arr==NULL){return-2;}else{while(min<=max){mid=(min+max)/2;if(arr[mid]<key){min=mid+1;//在右邊}elseif(arr[mid]>key){min=mid-1;//在左邊}else{if(min==max){returnmid;//找到}else{max=mid;//在左邊或者mid}}}return-1;}}intmain(){inta[]={2,4,6,8,10,12,14},target=8;printf("等于%d的數(shù)組下標(biāo)為%d\r\n",target,BinarySearch(a,target,0,sizeof(a)/4-1));return0;}//輸出:等于8的數(shù)組下標(biāo)為3根據(jù)實(shí)際項(xiàng)目需求改動(dòng):每次標(biāo)定后,利用快速排序?qū)?biāo)定的ADC從小到大寫入;每次讀取濃度時(shí),計(jì)算實(shí)時(shí)ADC處于哪個(gè)區(qū)間,就可以快速計(jì)算出濃度。這就變成了一道算法題:查找首個(gè)大于等于指定數(shù)字的位置,注意(min+max)/2越界:#include<stdio.h>/*----------------------------------------------------------------------*Function:BinarySearch(int*arr,intkey,intmin,intmax)*Discription:二分查找首個(gè)大于等于指定數(shù)字的位置*Inputs:arr,指向被查找有序序列的指針;*key,被查找的數(shù)*min,左邊界*msx,右邊界*Outputs:none*return:-1,未找到;*-2,輸入?yún)?shù)異常;*其他,被查找元素對(duì)應(yīng)的數(shù)組下標(biāo)*---------------------------------------------------------------------*/intBinarySearch(int*arr,intkey,intmin,intmax){intmid=0;if(arr==NULL){return-2;}else{while(min<=max){mid=min+((max-min)>>2);if(arr[mid]<key){min=mid+1;//在右邊}else{if(min
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西新建二中2025屆高三下學(xué)期期末復(fù)習(xí)檢測(cè)試題(一模)生物試題含解析
- 四川文化傳媒職業(yè)學(xué)院《室內(nèi)設(shè)計(jì)及原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣西質(zhì)量工程職業(yè)技術(shù)學(xué)院《民樂合奏》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇安全技術(shù)職業(yè)學(xué)院《數(shù)字合成技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年福建省泉州聚龍外國(guó)語校中考化學(xué)試題仿真卷:化學(xué)試題試卷(4)含解析
- 山東服裝職業(yè)學(xué)院《系統(tǒng)解剖學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海對(duì)外經(jīng)貿(mào)大學(xué)《海洋生物學(xué)B》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年江蘇省南京師大附中中考英語試題命題比賽模擬試題含答案
- 浙江汽車職業(yè)技術(shù)學(xué)院《獸醫(yī)免疫學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025屆浙江省溫州十五校聯(lián)合體高三下學(xué)期大聯(lián)考卷Ⅱ歷史試題試卷含解析
- 《巖土工程勘察安全》課件
- 《宮頸癌防治》課件
- 小學(xué)數(shù)學(xué):時(shí)間教材
- 220V直流容量計(jì)算書
- 腦卒中康復(fù)臨床路徑(PT)
- 鐵路客運(yùn)段QC小組運(yùn)用PDCA循環(huán)減少旅客列車乘降問題發(fā)生次數(shù)現(xiàn)場(chǎng)型成果匯報(bào)
- 紅外測(cè)溫培訓(xùn)課件
- 四百字作文格子稿紙(可打印編輯)
- 醫(yī)院培訓(xùn)課件:《基于醫(yī)院感染防控的安全注射》
- 私募股權(quán)投資PE
- 【抖音直播帶貨模式研究國(guó)內(nèi)外文獻(xiàn)綜述3200字】
評(píng)論
0/150
提交評(píng)論