91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何對(duì)基于Arduino的金屬探測器進(jìn)行編程

454398 ? 來源:wv ? 2019-09-26 14:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

第1步:基本知識(shí)-時(shí)序,定時(shí)器,中斷。..

一般思想

金屬探測器的基本原理是,線圈中的電感/信號(hào)會(huì)隨著目標(biāo)靠近線圈而改變。識(shí)別這些變化的常用方法是測量頻移,衰減時(shí)間,選定時(shí)間點(diǎn)的電壓變化等?;诨贏Tmega328的Arduino的功能,這些輸入可以通過模擬讀取,數(shù)字讀取來測量

此指令將覆蓋這些輸入。

要獲得靈敏的檢測器,不幸的是,需要非??焖俚販y量輸入。以16MHz運(yùn)行的ATmega似乎運(yùn)行得很快,但是在許多情況下,這太慢了,無法使用基于標(biāo)準(zhǔn)Arduino的例程。這里將提供各種“外部”標(biāo)準(zhǔn)Arduino例程“外部”的方法,以提供盡可能高的速度

定時(shí),定時(shí),定時(shí)。..。.

基于線圈的金屬探測器的關(guān)鍵要素是時(shí)候了。通常,信號(hào)是快速的,因此時(shí)序上的小誤差會(huì)導(dǎo)致讀數(shù)錯(cuò)誤,從而難以獲得穩(wěn)定的讀數(shù)。

Arduino時(shí)序的標(biāo)準(zhǔn)功能是諸如millis(),micros(), delay()和delaymicroseconds()。在大多數(shù)應(yīng)用中,這些例程運(yùn)行良好,對(duì)于金屬探測器設(shè)計(jì),它們的性能并不理想。

根據(jù)參考,millis()的分辨率為4μS。另一方面,當(dāng)查看Arduino的振蕩頻率時(shí),兩個(gè)脈沖在16MHz處的延遲為0,0625μS,是分辨率的64倍。為了獲得對(duì)此16MHz頻率的訪問以進(jìn)行計(jì)時(shí),最方便的方法是使用ATmega內(nèi)部定時(shí)器。共有三個(gè)計(jì)時(shí)器(timer0,timer1和timer2)。

可以通過預(yù)分頻器(分頻器)將定時(shí)器設(shè)置為以16MHz或更低的頻率運(yùn)行。定時(shí)器具有不同的模式,但在最簡單的模式下,它們僅從0計(jì)數(shù)到給定值,觸發(fā)中斷服務(wù)程序(ISR –小程序)并重新開始計(jì)數(shù)。這種操作模式稱為比較時(shí)清除定時(shí)器(CTC)。在計(jì)時(shí)器計(jì)數(shù)期間,在程序的任何時(shí)間都可以訪問計(jì)數(shù)器值并將其復(fù)制到變量中。

在Arduino運(yùn)行的大多數(shù)時(shí)間里都是如此。不幸的是,不僅定時(shí)器觸發(fā)中斷,而且許多其他事件也觸發(fā)中斷。因此,即使在執(zhí)行ISR期間,中斷也可能在相似的時(shí)間發(fā)生。由于每個(gè)中斷都會(huì)延遲當(dāng)前代碼的執(zhí)行,因此會(huì)再次導(dǎo)致較小的誤讀甚至完全丟失值。為了使ATmega本身具有某種順序,可以對(duì)優(yōu)先級(jí)不同的中斷進(jìn)行處理。

Vector Addr Source Interrupts definition

1 0x0000 RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset

2 0x0002 INT0 External Interrupt Request 0

3 0x0004 INT1 External Interrupt Request 0

4 0x0006 PCINT0 Pin Change Interrupt Request 0

5 0x0008 PCINT1 Pin Change Interrupt Request 1

6 0x000A PCINT2 Pin Change Interrupt Request 2

7 0x000C WDT Watchdog Time-out Interrupt

8 0x000E TIMER2_COMPA Timer/Counter2 Compare Match A

9 0x0010 TIMER2_COMPB Timer/Coutner2 Compare Match B

10 0x0012 TIMER2_OVF Timer/Counter2 Overflow

11 0x0014 TIMER1_CAPT Timer/Counter1 Capture Event

12 0x0016 TIMER1_COMPA Timer/Counter1 Compare Match A

13 0x0018 TIMER1_COMPB Timer/Coutner1 Compare Match B

14 0x001A TIMER1_OVF Timer/Counter1 Overflow

15 0x001C TIMER0_COMPA Timer/Counter0 Compare Match A

16 0x001E TIMER0_COMPB Timer/Coutner0 Compare Match B

17 0x0020 TIMER0_OVF Timer/Counter0 Overflow

18 0x0022 SPI STC SPI Serial Transfer Complete

19 0x0024 USART_RX USART Rx Complete

20 0x0026 USART_UDRE USART Data Register Empty

21 0x0028 USART_TX USART Tx Complete

22 0x002A ADC ADC Conversion Complete

23 0x002C EE READY EEPROM Ready

24 0x002E ANALOG COMP Analog Comparator

25 0x0030 TWI 2-wire Serial Interface (I2C

26 0x0032 SPM READY Store Program Memory Ready

穩(wěn)定時(shí)序編程的目標(biāo)是盡可能使用最高優(yōu)先級(jí)的中斷并找到解決方法防止在ISR期間發(fā)生其他中斷。這導(dǎo)致了處理中斷的第一條規(guī)則:減小ISR! (。.我將定期違反該規(guī)則……)。

由于標(biāo)準(zhǔn)Arduino函數(shù)也了解這些計(jì)時(shí)器,因此許多例程和庫都在使用它們。這意味著,如果我們使用計(jì)時(shí)器并更改其預(yù)設(shè)值,則某些標(biāo)準(zhǔn)例程將不再起作用。

延遲,音調(diào),傳感器,步進(jìn),PWM功能以及通信可能不再正常工作。

步驟2:如何使用計(jì)時(shí)器

有關(guān)如何使用計(jì)時(shí)器的說明非常棒。我使用了這個(gè)Instructable的參考,這里只會(huì)給出一些摘要。如果您想更深入地了解計(jì)時(shí)器,請(qǐng)參閱說明“ Arduino計(jì)時(shí)器中斷:6個(gè)步驟(帶有圖片)”。

基本原理是,首先您要告訴timer0,timer1或timer2

它應(yīng)該運(yùn)行多快(寄存器TCCR0B,TCCR2B,TCCR2B中的預(yù)分頻器)

要計(jì)算的值(寄存器OCR0A,OCR1A,OCR2A中的值)

此時(shí)要執(zhí)行的操作(TCCR0A,TCCR1A,TCCR2A中的設(shè)置-》重置并重新啟動(dòng),觸發(fā)PWM信號(hào)等…)

將計(jì)數(shù)器設(shè)置為一個(gè)給定的值(從TCNT0,TCNT1,TCNT2中的值開始)

啟用相關(guān)中斷(在TIMSK0,TIMSK1, TIMSK2)→這將調(diào)用ISR

,然后使用中斷向量名稱e定義ISR。 G。 ISR(TIMER0_COMPA_vect)并定義在此ISR期間應(yīng)執(zhí)行的操作。再次,此代碼應(yīng)保持簡短,因?yàn)榇舜a可隨時(shí)被其他中斷打斷,這將破壞值或?qū)е鲁绦虮罎ⅰ?/p>

另一部分信息是,計(jì)時(shí)器0和計(jì)時(shí)器2可以計(jì)數(shù)到255,計(jì)時(shí)器1可以計(jì)數(shù)到65535。

如何將計(jì)時(shí)器用于金屬探測器

如前所述,計(jì)時(shí)對(duì)于金屬探測器至關(guān)重要。因此,所有與時(shí)間相關(guān)的工作都將通過使用計(jì)時(shí)器來完成。

通常,向線圈提供一個(gè)初始脈沖。之后,測量線圈的反應(yīng)(可以是相同的線圈,也可以是不同的線圈)。在測量期間,應(yīng)避免所有其他中斷!在這段時(shí)間內(nèi)中斷會(huì)導(dǎo)致值略有下降,值損壞,值丟失。

我將計(jì)時(shí)器用于3種不同目的:

timer0用于主事件(例如用于脈沖感應(yīng)檢測器的脈沖)

timer1用于數(shù)據(jù)采集(例如,頻移檢測,模數(shù)轉(zhuǎn)換的時(shí)序)

timer2用于音調(diào)/音量生成。

timer0

脈沖感應(yīng)(PI)檢測器的主周期包括兩個(gè)階段。首先是為線圈供電的脈沖,然后是進(jìn)行數(shù)據(jù)采集的靜音狀態(tài)。對(duì)于PI檢測器,脈沖的正常持續(xù)時(shí)間約為250μS,脈沖后的靜音應(yīng)足以進(jìn)行數(shù)據(jù)采集,處理和更新輸出。

因此,首先要一方面將timer0設(shè)置為所需的“事件速度”,以提供接近250μS的脈沖和可用的靜音時(shí)間。對(duì)于200Hz PI檢測器,這將是1024的預(yù)分頻器(aka每周期16MHz/1024 = 15.625kHz→64μS),脈沖的比較計(jì)數(shù)器為“ 4”,而靜默計(jì)數(shù)器為“ 72”。

// set timer0 - taking care of the pulse to the coil and the pause between two pulses

// Pulse composes of 4.672ms “off” (72) and 0.32ms “on”(4)

// separate times for OCR0A will be set in the interrupt routine

// Resulting frequency is 200Hz

cli();

TCCR0A = 0; // set entire TCCR0A register to 0

TCCR0B = 0; // same for TCCR0B

TCNT0 = 0; // initialize counter value to 0

// set compare match register to required pulse with

OCR0A = 72; // = (4672μS/(0.0625μS * 1024)) - 1 (must be 《256)

// turn on Clear Timer on Compare (CTC) mode

TCCR0A |= (1 《《 WGM01);

// Set CS01 and CS00 bits for 1024 prescaler

TCCR0B |= (1 《《 CS02) | (1 《《 CS00);

// enable timer compare interrupt

TIMSK0 |= (1 《《 OCIE0A); sei();

由于信號(hào)非常不對(duì)稱,因此可以在每次中斷時(shí)將值設(shè)置為4和72。

ISR基本看起來像這樣(帶有全局易失性布爾“ toggle”):

ISR(TIMER0_COMPA_vect){

if(toggle){

cli();

OCR0A = 72; // set for a long “off-time” -》 next interrupt timer0 in 4.672ms

sei();

}

else{

cli();

OCR0A = 4; // set for a short “on-time” -》 next interrupt timer0 in 320μS

sei();

}

toggle=!toggle;

}

當(dāng)然,在if和else期間,還有一些其他代碼可用于

timer1

由于timer1的計(jì)數(shù)器值最高(65535),因此可以用來高精度地測量“長”時(shí)間段。以最大速度(16MHz),超限之前的最長事件為4.1ms。如果事件的時(shí)間變化很小,則超限甚至可以忽略。然后,最大定時(shí)分辨率為0.0625μs!那就是后臺(tái)timer1用于數(shù)據(jù)采集。

首先將計(jì)時(shí)器設(shè)置為最大速度

cli();

TCCR1A = 0; // set entire TCCR1A register to 0

TCCR1B = 0; // same for TCCR1B

TCNT1 = 0; // initialize counter value to 0

// set compare match register

OCR1A = timer1MaxValue; // just a value to start with -》 set to a long period

// to prevent unwanted interrupt interference

// turn on Clear Timer on Compare (CTC) mode

TCCR1B |= (1 《《 WGM12);

// Set CS10 no prescaler → running at full 16MHz

TCCR1B |= (1 《《 CS10);

// enable timer compare interrupt → calling the ISR

TIMSK1 |= (1 《《 OCIE1A);

sei();

要開始數(shù)據(jù)采集,timer0重新啟動(dòng)通過將timer1的計(jì)數(shù)器設(shè)置為0(TCNT1 = 0),在每個(gè)脈沖后將timer1設(shè)置為1。現(xiàn)在有兩個(gè)數(shù)據(jù)采集選項(xiàng):

等待事件發(fā)生,并通過讀取計(jì)數(shù)器TCNT1,使用timer1查看事件發(fā)生的時(shí)間。

事件,例如在脈沖后的特定時(shí)間(使用timer1的預(yù)設(shè)比較值)讀取模擬信號(hào)。

在第一種情況下,ISR(例如,模擬比較器或引腳變化)將讀取TCNT1,例如g。

ISR(ANALOG_COMP_vect){ // for analog comparator @ pin D6 and D7

Toggles[toggleCounter]=TCNT1;

toggleCounter++;

}

在第二種情況下,比較值OCR1A設(shè)置為將調(diào)用timer1比較ISR并執(zhí)行模擬讀取的值。在ISR期間,可以將比較值OCR1A更改為新值,以重復(fù)執(zhí)行模數(shù)轉(zhuǎn)換(ADC)周期e。 g。

ISR(TIMER1_COMPA_vect){

cli();

OCR1A = timer1PauseValue; // set the next interrupt to the value where a

// next ADC will give a usefull value

ADCSRA |= (1 《《 ADSC); // ADSC -》 start the cycle -》 will be cleared

// after the conversion is done

sei();

}

timer2

指示目標(biāo)的最簡單方法是通過聲音。在尋找寶藏時(shí),您的眼睛通常會(huì)集中在尋找地點(diǎn)。因此,它們不能用于顯示或LED。使用聲音可以輕松地在觀看線圈并同時(shí)收聽時(shí)找到確切的位置。為了給目標(biāo)提供精確度和某種感覺,音調(diào)應(yīng)根據(jù)信號(hào)強(qiáng)度改變其音量。因此,我認(rèn)為應(yīng)該為揚(yáng)聲器實(shí)現(xiàn)音量調(diào)制。

這只是通過向揚(yáng)聲器發(fā)送32kHz PWM信號(hào)來完成的。標(biāo)準(zhǔn)揚(yáng)聲器應(yīng)緩慢將32kHz信號(hào)轉(zhuǎn)換為音調(diào)。 32kHz被“解釋”,而不是模擬值。通過提供一個(gè)“開”脈沖由32kHz信號(hào)組成的可聽頻率,該信號(hào)具有不同的PWM比例,可改變可聽音的音量。

Timer2的優(yōu)點(diǎn)是它是硬連線的D3和D11引腳的PWM功能

可以通過設(shè)置寄存器TCCR2A的COM2x1(COM2A1和COM2B1)中的位將這些引腳激活為PWM。寄存器/輸出A為D11,寄存器/輸出B為D3。通過將“如何表現(xiàn)”設(shè)置為“快速PWM”,可以將PWM設(shè)置為直接驅(qū)動(dòng)引腳,而無需任何ISR!比較值OCR2A設(shè)置PWM比(OCR2A = 0→0%正波→0V; OCR2A = 255→100%正波→5V)。

OCR2A,因此PWM比可以設(shè)置為任意值在代碼中放置以更改音量。

現(xiàn)在有了音量,我們?nèi)匀恍枰獎(jiǎng)?chuàng)建可聽到的聲音/頻率??梢允褂闷銲SR中的其他定時(shí)器之一來完成此操作(例如,在啟動(dòng)脈沖時(shí)將OCR2A設(shè)置為“ volume”,將OCR2A = 0設(shè)置為“ 0”;在啟動(dòng)脈沖時(shí)會(huì)產(chǎn)生200Hz的可聽音)。

第3步:使用數(shù)字和模擬引腳

如何對(duì)基于Arduino的金屬探測器進(jìn)行編程

模擬讀取,但速度非常快。

通過使用AnalogRead()可以以良好的精度和穩(wěn)定性讀取10Bit值。不幸的是,最大采樣率約為10kHz。這部分歸因于AnalogRead()中的一些附加代碼,部分歸因于AD轉(zhuǎn)換的時(shí)鐘預(yù)分頻器。

幸運(yùn)的是,可指導(dǎo)的“ Girino-快速Arduino示波器”提供了有關(guān)如何進(jìn)行獲得更高的采樣率。只需取消相關(guān)行的注釋,就可以設(shè)置模數(shù)轉(zhuǎn)換(ADC)速度的采樣。

// ADCSRA |= (1 《《 ADPS2) | (1 《《 ADPS0); // 32 prescaler for 38.5 KHz

ADCSRA |= (1 《《 ADPS2); // 16 prescaler for 76.9 KHz

// ADCSRA |= (1 《《 ADPS1) | (1 《《 ADPS0); // 8 prescaler for 153.8 KHz

要使用ADC,有以下三種基本方法:

自由運(yùn)行模式–每次轉(zhuǎn)換完成后都會(huì)調(diào)用特定的ISR。

帶中斷的單次轉(zhuǎn)換–轉(zhuǎn)換完成后將調(diào)用ISR

單次轉(zhuǎn)換和“延遲”直到值可用(例如在analogRead()中)

盡管自由運(yùn)行模式在給定時(shí)間內(nèi)可以最終獲得最多樣本,但我不建議使用用于金屬檢測。為什么?由于中斷的優(yōu)先級(jí)較低(請(qǐng)參見中斷優(yōu)先級(jí)表):優(yōu)先級(jí)為22!前幾個(gè)讀數(shù)很可能會(huì)精確計(jì)時(shí)。此后,其他中斷將開始產(chǎn)生干擾并稍微延遲ADC。

所以我真正建議使用的是通過帶有中斷的單次轉(zhuǎn)換觸發(fā)的timer1觸發(fā)測量。

因此,timer1的每個(gè)ISR只需設(shè)置

ADCSRA |= (1 《《 ADSC);

大約270個(gè)(理論上為208個(gè))xtal周期即可觸發(fā)ADC,“ I-am-finish-with-the-Analog”到數(shù)字轉(zhuǎn)換” ISR(ADC_vect)被調(diào)用,并且可以讀取該值。在16位預(yù)分頻器上,只能使用10位分辨率中的8位,這是因?yàn)檩^低的兩個(gè)字節(jié)不會(huì)在高速下給出精確值(請(qǐng)參見數(shù)據(jù)手冊(cè))。

因?yàn)锳DC將在在硬件級(jí)別上具有背景知識(shí),因此此時(shí)間范圍可用于在ISR期間執(zhí)行一些命令以存儲(chǔ)值和限制測量值的數(shù)量等

對(duì)于某些應(yīng)用,信號(hào)的動(dòng)態(tài)范圍與預(yù)期會(huì)產(chǎn)生什么樣的效果(在一次AD轉(zhuǎn)換中看到完整的波形)。但這似乎并不是一個(gè)大問題。這很可能是由于ATmega芯片內(nèi)部的內(nèi)部采樣和保持電路工作得很好!

數(shù)字端口的嚴(yán)重位限制

在某些情況下,必須設(shè)置Arduino。這可以通過使用digitalWrite()輕松完成。仍然,這些函數(shù)還有一些額外的開銷代碼,這使它們變慢,因此需要相當(dāng)長的周期。

由于某些輸出在ISR期間發(fā)生了變化,因此對(duì)端口進(jìn)行位沖擊是一個(gè)更好的選擇

基本功能是:

PORTD = PORTD | B00000100;//將D2設(shè)置為高電平,而不更改其他端口

PORTD = PORTD&B11111011;//將D2設(shè)置為低電平而不更改其他端口

PIND = PIND | B00000100;//如果從低到高切換D2;如果為高→低

端口分配按位分配

PORTD D7 D6 D5 D4 D3 D2 D1(TXD) D0(RXD)

PORTB N.A. N.A. D13 D12 D11 D10 D9 D8

PORTC A0 A1 A2 A3 A4 A5 Reset N.A.

為線圈供電,應(yīng)將端口直接設(shè)置為“高”或“低” ,對(duì)于音頻輸出,PIND命令(切換)提供了一個(gè)簡潔的功能:多音目標(biāo)識(shí)別。

如果在一個(gè)循環(huán)中有兩個(gè)點(diǎn)切換了揚(yáng)聲器的引腳,我們可以決定是否根據(jù)目標(biāo),在兩個(gè)點(diǎn)或僅在一個(gè)點(diǎn)之間切換銷釘。這樣,我們可以達(dá)到高音(每個(gè)周期200Hz的兩個(gè)切換)或低音(每個(gè)周期100Hz的一個(gè)切換)。

使用引腳進(jìn)行測試

尤其是在測試新開發(fā)的電路和新代碼非常有用,它可以驅(qū)動(dòng)一個(gè)額外的引腳來指示代碼中正在發(fā)生的事情。它既可以用來觸發(fā)示波器,也可以用來顯示代碼中某個(gè)例程花費(fèi)多長時(shí)間。通過在例程開始時(shí)將引腳設(shè)置為高電平,然后在例程之后將其設(shè)置為低電平,可以很好地看出這段代碼是否干擾了中斷或其他信號(hào),或者可以比較哪個(gè)版本的代碼更快或更慢。

附帶的是模擬信號(hào)(紅色)和表示AD轉(zhuǎn)換需要多長時(shí)間的引腳信號(hào)的圖片。

步驟4:接口和數(shù)據(jù)輸出

探測器的主要目標(biāo)是找到一個(gè)目標(biāo),然后向用戶提供有關(guān)目標(biāo)的一些信息。指示目標(biāo)的一種方式是使用揚(yáng)聲器,如計(jì)時(shí)器2所述。

串行輸出。

這主要用于測試和實(shí)驗(yàn),但是它是無與倫比的!

Serial.print ()和兄弟姐妹的速度非常快(如果設(shè)置為Serial.begin(115200))。因此,在嘗試電路并獲得讀數(shù)的感覺時(shí),Serial.print()可用于向計(jì)算機(jī)發(fā)送大量數(shù)據(jù)。如果以適當(dāng)?shù)姆绞礁袷交ɡ?,值之間的“空格”,循環(huán)之間的“返回”)格式,則可以通過將串行監(jiān)視器的輸出復(fù)制到Excel或類似的電子表格程序中來傳輸大量數(shù)據(jù),以便以后進(jìn)行分析(我正在使用Libre Office )。

我廣泛使用了此功能,一個(gè)探測器項(xiàng)目將合并使用此功能,以便在以后的某個(gè)時(shí)間將數(shù)據(jù)打印到16x2 LCD。

16x2 LCD

我認(rèn)為這是提供有關(guān)目標(biāo)的其他信息的好方法。這可以合并信號(hào)強(qiáng)度,但同時(shí)提供菜單以瀏覽電位設(shè)置(靈敏度,自動(dòng)平衡,功率,辨別力)。

有兩種簡單的方法來驅(qū)動(dòng)典型的16x2 LCD

使用I2C背包傳輸4位直接接線

我知道,也有UART封裝,但是它們不像I2C背包那樣常見。

直接接線是直接的,但是很麻煩,因?yàn)橐褂迷S多端口,并且需要一些接線。因此,使用16x2顯示屏的最簡單方法是使用I2C背包。應(yīng)該?。〔恍业氖?,這里有一些真實(shí)的話題:

它似乎在啟動(dòng)過程中正在使用timer0

I2C的運(yùn)行速度非常慢!

1。。在lcd.begin(16,2)期間;顯然,使用了delay()和同級(jí)(很有趣,僅在那里)。這意味著,如果我們希望像其他操作一樣將這些計(jì)時(shí)器用于其他目的,則必須在設(shè)置計(jì)時(shí)器之前調(diào)用lcd.begin(16,2)(這花了我一點(diǎn)時(shí)間。..)。 LCD上的其他呼叫不使用計(jì)時(shí)器,或者至少可以在修改的計(jì)時(shí)器設(shè)置下使用。

2。 最大的缺點(diǎn)絕對(duì)是I2C的速度。在將所有信息發(fā)送到LCD的第一個(gè)實(shí)現(xiàn)過程中,LCD根本不顯示任何內(nèi)容,而只是掛起。我意識(shí)到發(fā)送包括lcd.clear()在內(nèi)的32個(gè)字符太多了,所以我減少了2個(gè)字符的數(shù)量。但是,即使發(fā)送兩個(gè)字符也要花費(fèi)大約3毫秒,這太長了。

在200Hz的工作頻率下,該周期包括一個(gè)300μs的脈沖和4.7ms的靜音。這種“靜音”用于數(shù)據(jù)采集(在我的情況下約為2.5毫秒),數(shù)據(jù)處理(在我的情況下為1毫秒)為LCD輸出留出約1.1毫秒的時(shí)間。實(shí)驗(yàn)表明,即使是一個(gè)字符也要花費(fèi)1.5毫秒。為了解決此問題,例程Wire.setClock(400000)非常有用。

通常,默認(rèn)情況下,I2C時(shí)鐘設(shè)置為100kHz。通過使用Wire.setClock(400000),可以將時(shí)鐘設(shè)置為400kHz。在wire.begin()中設(shè)置了默認(rèn)的100kHz。在lcd.begin()期間調(diào)用此例程。因此必須在lcd.begin()之后調(diào)用Wire.setClock(400000)(…。再受挫幾個(gè)小時(shí))。

仍然必須解決該問題,即每個(gè)字符只能發(fā)送一個(gè)字符周期。為了解決這個(gè)問題,創(chuàng)建了一個(gè)數(shù)組(總共16x2個(gè)字符→總共32個(gè)字符),并填充了所有需要顯示的信息。然后,該數(shù)組每個(gè)周期讀取一個(gè)字符并發(fā)送到顯示器。

3。。默認(rèn)情況下,I2C連接到A4和A5。在測試過程中顯而易見的是,驅(qū)動(dòng)I2C總線正在使模擬引腳上的電壓不穩(wěn)定(可能是所有引腳的電壓都不穩(wěn)定,但是模擬引腳對(duì)ADC的影響非常敏感)。這就導(dǎo)致了時(shí)序問題,所有I2C傳輸都應(yīng)與任何敏感的ADC周期完全隔離。

因此,通過將I2C時(shí)鐘速度設(shè)置為400kHz并在每個(gè)周期內(nèi)僅發(fā)送一個(gè)字符來進(jìn)行通信。在將下一個(gè)脈沖發(fā)送到線圈之前,可以將LCD縮小為完成狀態(tài)。因此,在脈沖后從引腳A0開始數(shù)據(jù)采集時(shí),A4和A5相當(dāng)不錯(cuò)。因此,LCD的刷新率是200Hz/32個(gè)字符→6.25Hz

聲音

如有關(guān)計(jì)時(shí)器的步驟中所述,timer2用于為顯示器產(chǎn)生動(dòng)態(tài)聲音輸出。探測器。一個(gè)簡單的揚(yáng)聲器通過100歐姆電阻連接到端口A(D11)或端口B(D3),可以使您感覺到信號(hào)強(qiáng)度和目標(biāo)類型(如果使用了多音目標(biāo)識(shí)別)。要實(shí)現(xiàn)此目的,代碼并不是很好,但是可以完成工作。

在代碼中的兩個(gè)位置,由timer0計(jì)時(shí),例如在dataCrunching之后,有兩個(gè)由布爾“聲音”驅(qū)動(dòng)的代碼片段和“音高”

if((sound)&&(highPitch)) { // if the speaker should sound and at high pitch

if(OCR2A)

OCR2A=0;

else

OCR2A=volume;

} if(sound){ // if the speaker should make noise

if(OCR2A)

OCR2A=0;

else

OCR2A=volume;

}

else

OCR2A=0;

設(shè)置布爾值“ sound”和“ pitch”應(yīng)該在代碼中的其他位置進(jìn)行,因?yàn)樗鼈儾皇菚r(shí)間緊迫的。

將變量“ volume”作為無符號(hào)字符或字節(jié)進(jìn)行相同計(jì)數(shù)。

LED

由于通常在所有Arduino板上D13處都存在一個(gè)LED LED墊片,通過上一步中所述的位敲擊來設(shè)置銷釘。在測試過程中,這給人留下了很好的印象,供以后使用,該引腳可用于驅(qū)動(dòng)外部LED。

附有來自不同時(shí)序的屏幕截圖,可通過外部引腳看到??梢钥吹匠跏济}沖,而不是一些劇烈的振蕩。在振蕩期間,進(jìn)行數(shù)據(jù)采集。數(shù)據(jù)采集后,數(shù)據(jù)處理開始(黃色信號(hào)設(shè)置為高電平)。在所有數(shù)據(jù)處理和數(shù)據(jù)傳輸結(jié)束時(shí),黃色信號(hào)設(shè)置為低電平。圖片顯示了以下持續(xù)時(shí)間的差異:

僅數(shù)據(jù)處理

數(shù)據(jù)處理,并通過Serial.print()發(fā)送50個(gè)值

數(shù)據(jù)處理并通過I2C @ 100kHz將僅1個(gè)字符發(fā)送到LCD

步驟5:數(shù)據(jù)處理

在理想情況下,接收到的信號(hào)將非常清晰,與參考值相比最小的變化將指示目標(biāo)。不幸的是,這個(gè)世界并不理想,并且金屬探測器中的信號(hào)嘈雜,骯臟(尤其是當(dāng)我使用很少的外部組件時(shí))。為了過濾掉數(shù)據(jù)的相關(guān)部分,嘗試了一些方法來過濾接收到的數(shù)據(jù),甚至找到了一些有用的方法。

優(yōu)化的第一要點(diǎn)是電路!

如果電路和線圈是報(bào)廢的,那么最好的濾波算法就無法為您提供幫助。

有一些通用規(guī)則,例如使用大型電容器。屏蔽電路也將有所幫助,應(yīng)進(jìn)行試驗(yàn)。

真正使事情變得困難的一件事是信號(hào)尖峰。如果信號(hào)高于5V或低于0V,則有一些內(nèi)部電路可防止ATmega爆炸。僅當(dāng)電流保持較低時(shí),此方法才有效。為了保護(hù)起見,這很好用,對(duì)于程序的穩(wěn)定性而言,則不是那么好。

已經(jīng)處理了相當(dāng)“骯臟”的信號(hào),代碼產(chǎn)生了錯(cuò)誤,ADC周期出現(xiàn)了嚴(yán)重的誤讀。這可能會(huì)導(dǎo)致讀數(shù)延遲小,讀數(shù)遺漏或無法解釋的原始值。優(yōu)化電路是獲得合格數(shù)據(jù)的第一步。

這里需要對(duì)電路進(jìn)行一些單獨(dú)的測試。方法是:

使連接保持短路

使用電容器穩(wěn)定電源電壓

防止Arduino引腳上的大負(fù)載

防止靠近敏感零件/連接的大電流

防止組件加熱/冷卻

屏蔽組件,連接,完整電路

雙絞線

防止移動(dòng)/丟失電線

知道自己在做什么……。.

如何解釋測量值

最簡單的方法識(shí)別被測信號(hào)變化的方法是將信號(hào)與信號(hào)的參考值進(jìn)行比較。如果測量值不同于該參考值,則您發(fā)現(xiàn)了一些東西。

事實(shí)證明與眾不同。

實(shí)際上,您的讀數(shù)會(huì)有很小的偏差。

這些偏差是由于來自主電網(wǎng)的50/60Hz信號(hào)的信號(hào)干擾,屏蔽不良的設(shè)備(交流適配器,計(jì)算機(jī))的高頻信號(hào),對(duì)其他無線信號(hào)(Wifi,GSM)的干擾引起的或僅僅是由于電路設(shè)計(jì)而產(chǎn)生的振蕩。這些干擾可能會(huì)偏離參考值,幅度如此之大,以致使檢測器的靈敏度變得毫無用處。

在接下來的部分中,將介紹用于處理噪聲信號(hào)的不同方法。

創(chuàng)建平均值

在最后幾個(gè)值上創(chuàng)建平均值是一個(gè)不錯(cuò)的起點(diǎn)。這樣,可以消除正負(fù)方向上的小偏差。根據(jù)噪聲的大小和外觀,可以選擇不同的值來創(chuàng)建平均值。

最簡單的方法是定義一個(gè)數(shù)組,然后將獲得的值填充到該數(shù)組中,并按每個(gè)周期遞增。在每個(gè)循環(huán)中,您將所有值相加,然后將它們與參考值進(jìn)行比較。小偏差將被消除。這可以通過全局計(jì)數(shù)器輕松實(shí)現(xiàn),全局計(jì)數(shù)器每個(gè)周期遞增一次。如果達(dá)到“ maxValue”,則將其設(shè)置為0。

每個(gè)循環(huán),for循環(huán)從0到“ maxValue”計(jì)數(shù)以求和??梢詫⒖偤统詍axValue確實(shí)沒有意義。參考值可以直接與總和進(jìn)行比較。

優(yōu)點(diǎn):易于實(shí)現(xiàn),快速代碼,易于閱讀。

缺點(diǎn):延遲?。赡軣o關(guān)緊要) ),僅適用于噪音很小

#define maxValue 20

int valueCounter=0;

int valueSamples[maxValue];

void dataCrunching(void ){

int i;

double average;

valueSamples[valueCounter]=nextValue;

valueCounter++;

if(valueCounter》(maxValue-1))

valueCounter=0;

average=0;

for(i=0; i average=average+valueSamples[i];

}

觀察邊界

如果信號(hào)太不穩(wěn)定,則可以采用其他方法查看最小值或最大值在一個(gè)數(shù)組中。如果信號(hào)傾向于在一個(gè)方向上特別偏離,這將特別有用。再次使用數(shù)組,每個(gè)周期填充一個(gè)值。每個(gè)循環(huán)檢查數(shù)組的e。 G。最低值。然后將該值與參考值進(jìn)行比較。

創(chuàng)建e。 G??梢酝ㄟ^給變量一個(gè)高的值開始(例如255),然后在for循環(huán)中檢查給定的數(shù)組值是否較小

if(minValueminValue=array[i];

循環(huán)minValue具有數(shù)組的最小值。

優(yōu)點(diǎn):即使嘈雜的信號(hào)也可以很好地分析

缺點(diǎn):數(shù)組需要足夠大(可以減慢反應(yīng)速度)速度)

#define maxValue 20

int valueCounter=0;

int valueSamples[maxValue];

void dataCrunching(void){

int i;

int minValue;

valueSamples[valueCounter]=nextValue;

valueCounter++;

if(valueCounter》(maxValue-1))

valueCounter=0;

minValue=32767;

for(i=0;i if(minValueminValue=valueSamples[i];

}

}

忽略值

有時(shí)信號(hào)中會(huì)出現(xiàn)一些毛刺或明顯的誤讀。如果將這些值添加到數(shù)組,它們將完全破壞對(duì)數(shù)組的分析。為了避免這種情況,可以通過設(shè)置“期望邊界”來濾除“不可信”的值。最簡單的方法是查看數(shù)組中的平均值,并且僅接受平均值的+/-范圍內(nèi)的值。我不建議這樣做!為什么不?可能導(dǎo)致平均值“卡住”的情況。如果讀數(shù)緩慢上升,然后突然回到“正常”,則平均值將停留在較高的值,因?yàn)檎V悼赡艹?/-范圍。

如果相對(duì)于數(shù)組中的參考值信號(hào)不在+/-范圍內(nèi),則舊值將保留在數(shù)組中。這將導(dǎo)致在相同范圍內(nèi)充滿值的數(shù)組。優(yōu)點(diǎn):將陣列的平均值與參考值進(jìn)行比較將對(duì)微小的變化非常敏感。

優(yōu)點(diǎn):過濾掉毛刺和嚴(yán)重誤讀的好方法,即使在噪聲信號(hào)中也可以檢測到很小的變化。

缺點(diǎn):足夠的值需要在該范圍內(nèi),參考值和范圍應(yīng)謹(jǐn)慎選擇。

#define maxValue 20

int valueCounter=0;

int valueSamples[maxValue];

int limit=10;

int referenceValue; // needs to be created somewhere in the program?。。?/p>

void dataCrunching(void){

int i;

int diff;

diff=abs(nextValue-referenceValue) // create the difference

if(diff valueSamples[valueCounter]=nextValue;

valueCounter++;

if(valueCounter》(maxValue-1))

valueCounter=0;

average=0;

for(i=0;i average=average+valueSamples[i];

}

平均單個(gè)值

一種濾除小偏差的方法是使用前一個(gè)值乘以一個(gè)因子,再加上新值,然后除以(factor + 1)。

優(yōu)點(diǎn):非常易于實(shí)現(xiàn),濾除細(xì)小的噪聲

缺點(diǎn):即使細(xì)微變化是持久的,也忽略不了細(xì)微變化(新值需要偏差超過“因素”以影響除法后的結(jié)果)

#define maxValue 20

int valueCounter=0;

int valueSamples[maxValue];

int factor=3;

void dataCrunching(void){

int i;

double filterValue;

filterValue=valueSamples[valueCounter];

filterValue=filterValue*factor;

filterValue=filterValue+nextValue;

valueSamples[valueCounter]=filterValue/(factor+1);

valueCounter++;

if(valueCounter》(maxValue-1))

valueCounter=0;

average=0;

for(i=0; i average=average+valueSamples[i];

}

使用較高/較低的計(jì)數(shù)器

在這種情況下,會(huì)將測量值與先前創(chuàng)建的平均值進(jìn)行比較。如果該值較大,則平均值diffdiffer將增加。如果該值較小,則diffCounter將減少。如果diffCounter達(dá)到最大值maxDiffCounter,則將平均值增加,并將diffCounter設(shè)置為0。如果diffCounter降至0以下,則將減小平均值,并將diffCounter設(shè)置為maxDiffCounter。

優(yōu)點(diǎn):甚至

缺點(diǎn):高/低的分布應(yīng)該“穩(wěn)定”,偏差的指示可能很慢

#define maxDiffCounter 30

int diffCounter=0;

int referenceValue; // needs to be created elsewhere in the program!?。?/p>

int sampleValue;

int average=0;

void dataCrunching(void){

int i;

double average;

if(nextValue》referenceValue) // if larger than the reference

diffCounter++; // increase the diffCounter

else if(nextValue diffCounter--; // decrease the difCounter

if(diffCounter》maxDiffCounter){ // maximum value reached

average++; // correct the average

diffCounter=0; // restart at 0

}

else if(diffCounter《0){ // minimum value reached

average--; // correct the average

diffCounter=maxDiffCounter; // restart at maximum value

}

}

創(chuàng)建參考值

數(shù)據(jù)處理中最簡單的部分是采用不同的方法來濾除噪聲。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97204
  • 金屬探測器
    +關(guān)注

    關(guān)注

    19

    文章

    79

    瀏覽量

    25768
  • Arduino
    +關(guān)注

    關(guān)注

    190

    文章

    6526

    瀏覽量

    196982
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    電氣火災(zāi)監(jiān)控探測器的防護(hù)方

    1. 電氣火災(zāi)監(jiān)控探測器 電氣火災(zāi)監(jiān)控探測器是指探測被保護(hù)線路中的剩余電流、溫度等電氣火災(zāi)危險(xiǎn)參數(shù)變化的探測器,適用在電氣火災(zāi)發(fā)生機(jī)率最大的工廠、大型庫房、辦公室、商業(yè)建筑、賓館、住宅
    的頭像 發(fā)表于 01-26 16:43 ?203次閱讀
    電氣火災(zāi)監(jiān)控<b class='flag-5'>探測器</b>的防護(hù)方

    紅外焦平面探測器核心指標(biāo)NETD介紹

    紅外焦平面探測器的NETD(Noise Equivalent Temperature Difference),即等效噪聲溫差,又稱為熱靈敏度。NETD是衡量其靈敏度的核心參數(shù),表示探測器能夠分辨的最小溫度差異。
    的頭像 發(fā)表于 01-26 14:24 ?416次閱讀
    紅外焦平面<b class='flag-5'>探測器</b>核心指標(biāo)NETD介紹

    寒潮來襲,氣體探測器能否“扛住”?

    ——諾安智能氣體探測器冬季防護(hù)指南全國各地已開啟“速凍模式”,強(qiáng)寒潮持續(xù)侵襲,氣溫再創(chuàng)新低,各類場所用氣需求增加,氣體安全監(jiān)測仍然是重中之重。而在工業(yè)生產(chǎn)、管道運(yùn)輸?shù)纫寻惭b氣體探測器的場景中,一個(gè)
    的頭像 發(fā)表于 01-13 14:28 ?397次閱讀
    寒潮來襲,氣體<b class='flag-5'>探測器</b>能否“扛住”?

    Amphenol數(shù)字紅外探測器評(píng)估套件使用指南

    Amphenol數(shù)字紅外探測器評(píng)估套件使用指南 在電子設(shè)計(jì)領(lǐng)域,紅外探測器的應(yīng)用越來越廣泛。Amphenol的數(shù)字紅外探測器評(píng)估套件(Digital IR EVM KIT,Part No.
    的頭像 發(fā)表于 12-11 09:20 ?526次閱讀

    關(guān)于探測器的操作、運(yùn)輸、焊接和靜電防護(hù)注意事項(xiàng)

    探測器在在工業(yè)測量測繪,生物醫(yī)藥檢測,消費(fèi)電子等行業(yè)都有廣泛的應(yīng)用。探測器的封裝包括金屬,陶瓷和塑料等形式。本文主要是針對(duì)不同封裝形式的探測器,講解從開箱、安裝、日常操作到長期存儲(chǔ)的全
    的頭像 發(fā)表于 11-17 07:40 ?345次閱讀
    關(guān)于<b class='flag-5'>探測器</b>的操作、運(yùn)輸、焊接和靜電防護(hù)注意事項(xiàng)

    相機(jī)分辨率:融合探測器與光學(xué)性能

    圖1、該系統(tǒng)的調(diào)制傳遞函數(shù)為 MTFSYS = MTFOPTICS*MTFDETECTOR。由于探測器的調(diào)制傳遞函數(shù)起著主導(dǎo)作用,所以這是一個(gè)受探測器限制的系統(tǒng)(Fλ/d = 0.1) 相機(jī)的分辨率
    的頭像 發(fā)表于 11-11 07:58 ?454次閱讀
    相機(jī)分辨率:融合<b class='flag-5'>探測器</b>與光學(xué)性能

    混合探測器與光電倍增管的區(qū)別以及參數(shù)解析

    的是一種半導(dǎo)體元件,這也是它被稱為混合探測器的原因。 傳統(tǒng)光電倍增管實(shí)現(xiàn)電子的倍增是通過多個(gè)分離的打拿極進(jìn)行倍增,所以傳統(tǒng)的光電倍增管也稱之為打拿型光電倍增管?;旌?b class='flag-5'>探測器光陰極釋放的電子直接入射到半導(dǎo)體中,然后通過半導(dǎo)體
    的頭像 發(fā)表于 10-11 08:14 ?640次閱讀
    混合<b class='flag-5'>探測器</b>與光電倍增管的區(qū)別以及參數(shù)解析

    光電探測器PMT、APD、CCD、CMos、ICCD、EMCCD

    ,屬于靈敏度極高,響應(yīng)速度非??斓膯吸c(diǎn)光探測器。 主要是由光電發(fā)射陰極(光陰極)和聚焦電極、電子倍增極及電子收集極(陽極)等組成。 核心原理就是:通過把入射的光子轉(zhuǎn)化成電子,在電子倍增電場作用下進(jìn)行倍增放大,放大后的電子通過陽極收集后輸出。通過AD轉(zhuǎn)換
    的頭像 發(fā)表于 09-16 07:58 ?1648次閱讀
    光電<b class='flag-5'>探測器</b>PMT、APD、CCD、CMos、ICCD、EMCCD

    VirtualLab:通用探測器

    分量。注意:VirtualLab Fusion使用Ex和Ey進(jìn)行傳播,并根據(jù)需要計(jì)算其他分量。 域 : 探測器可以評(píng)估和輸出x域(空間域)和/或k域(空間-頻率域)的數(shù)據(jù)。 應(yīng)用傍軸近似計(jì)算分量
    發(fā)表于 06-12 08:59

    DZR185AC零偏壓肖特基二極管探測器

    DZR185AC是一款由HEROTEK公司生產(chǎn)的零偏壓肖特基二極管探測器,專為高頻信號(hào)檢測設(shè)計(jì)。其核心優(yōu)勢在于無需外部偏置電壓即可工作,通過金屬-半導(dǎo)體接觸形成的肖特基勢壘實(shí)現(xiàn)信號(hào)檢波。相比傳統(tǒng)對(duì)數(shù)
    發(fā)表于 05-12 09:18

    VirtualLab Fusion應(yīng)用:光波導(dǎo)系統(tǒng)的均勻性探測器

    個(gè)均勻性檢測,為此類研究提供工具。在本文檔中,我們演示了均勻性檢測的配置選項(xiàng)。 這個(gè)使用用例展示了 … 均勻性檢測 均勻性檢測的編輯對(duì)話框
    發(fā)表于 04-30 08:49

    激光焊接技術(shù)在焊接探測器元器件的工藝流程

    準(zhǔn)備, 1.材料準(zhǔn)備, 對(duì)探測器元器件和焊接材料進(jìn)行清潔和處理,去除表面的油污、鐵銹等雜質(zhì),確保焊接表面的潔凈度。 根據(jù)焊接要求,選擇合適的焊接材料,如金屬絲、金屬片等。 2.設(shè)備檢查
    的頭像 發(fā)表于 04-28 10:47 ?686次閱讀

    紅外探測器像元尺寸怎么選

    像元尺寸指的是在紅外探測器芯片焦平面陣列上,每個(gè)像元的實(shí)際物理尺寸,通常以微米(μm)為單位。常見的規(guī)格有8μm、12μm、17μm、25μm等。像元尺寸直接影響著紅外熱成像組件的體積、成本以及成像
    的頭像 發(fā)表于 04-01 16:43 ?1518次閱讀
    紅外<b class='flag-5'>探測器</b>像元尺寸怎么選

    紅外探測器像元尺寸詳解

    紅外探測器像元尺寸是紅外熱成像領(lǐng)域中的一個(gè)關(guān)鍵參數(shù),它指的是在紅外探測器芯片焦平面陣列上,每個(gè)像元的實(shí)際物理尺寸,通常以微米(μm)為單位來進(jìn)行表示,常見的像元尺寸有8μm、12μm、17μm、25μm等。以下是對(duì)紅外
    的頭像 發(fā)表于 03-31 16:33 ?1969次閱讀
    紅外<b class='flag-5'>探測器</b>像元尺寸詳解