手機(jī)訪問更快捷
更多流量 更易傳播
隨時(shí)掌握行業(yè)動(dòng)態(tài)
網(wǎng)絡(luò)課堂 行業(yè)直播
產(chǎn)品推薦:水表|流量計(jì)|壓力變送器|熱電偶|液位計(jì)|冷熱沖擊試驗(yàn)箱|水質(zhì)分析|光譜儀|試驗(yàn)機(jī)|試驗(yàn)箱
接近開關(guān)是非接觸式開關(guān),可以檢測(cè)附近是否存在物體。通常,接近傳感器與非接觸式設(shè)備一起使用,例如非接觸式干手器和SUV中的免提電動(dòng)尾門,也廣泛用于工業(yè)應(yīng)用。配合使用線性執(zhí)行器,接近傳感器可用于各種情況,包括非接觸式控制和物體檢測(cè)反饋。
接近傳感器通常通過使用電磁場(chǎng)、光或聲音來檢測(cè)物體的存在。而線性執(zhí)行器檢測(cè)物體是否存在的方法取決于接近傳感器的類型。接近傳感器有四種常見類型:
電感式::使用磁場(chǎng)檢測(cè)含鐵材料
電容式:使用電容變化來檢測(cè)物體
光電:使用光來檢測(cè)物體是否存在
超聲波:使用聲音來檢測(cè)物體是否存在
當(dāng)物體位于傳感器前面或物體被拿走時(shí),這些傳感器會(huì)告訴線性執(zhí)行器移動(dòng)或停止。它們還可用于確定最近的物體距它們有多遠(yuǎn),并可用于提供反饋來控制線性致動(dòng)器。
對(duì)于非接觸式控制,就像使用簡(jiǎn)單的按鈕一樣使用接近傳感器。為此,需要選擇一個(gè)檢測(cè)范圍較短的接近傳感器,這樣就不會(huì)意外觸發(fā)開關(guān)。這里我們以電容式接近開關(guān)為例:
將接近傳感器連接到微控制器,例如Arduino,讀取傳感器的輸出。如何將接近傳感器連接到微控制器將取決于選擇的傳感器,但在大多數(shù)情況下,微控制器將接收數(shù)字轉(zhuǎn)換的模擬值,或者需要將模擬信號(hào)轉(zhuǎn)換為數(shù)字值。
在此應(yīng)用中,接近傳感器僅充當(dāng)單個(gè)按鈕,這將限制我們對(duì)線性執(zhí)行器的控制。利用我們的微控制器,我們可以編寫代碼,在傳感器被觸發(fā)時(shí)在伸出和縮回之間切換,并利用線性執(zhí)行器的內(nèi)部限位開關(guān)在執(zhí)行器到達(dá)伸出或縮回位置時(shí)停止執(zhí)行器。我們還可以利用內(nèi)部反饋或外部限位開關(guān)利用到其他位置。
要在微控制器中執(zhí)行此操作,我們需要在每次觸發(fā)接近傳感器時(shí)切換標(biāo)志變量。下面的代碼示例顯示了Arduino IDE代碼的主循環(huán),使用標(biāo)志sensorFlag來確定要移動(dòng)的方向驅(qū)動(dòng)線性執(zhí)行器:
void loop() {
if(sensorFlag == 0){
// Retract Linear Actuator
analogWrite(10, 0);
analogWrite(11, 255);
}else if(sensorFlag == 1){
// Extend Linear Actuator
analogWrite(10, 255);
analogWrite(11, 0);
}
}
要切換此標(biāo)志,我們需要讀取接近傳感器的值。由于我們不知道傳感器何時(shí)會(huì)被觸發(fā),因此可以利用內(nèi)部定時(shí)器中斷定期讀取傳感器。下面的代碼示例使用Arduino,展示了如何設(shè)置每秒觸發(fā)的內(nèi)部計(jì)時(shí)器中斷。
void setup() {
// Set Timer1 Interrupt to Trigger Every Second
TCCR1A = 0; // Set TCCR1A Register to 0
TCCR1B = 0; // Set TCCR1B Register to 0
TCNT1 = 0; // Initialize counter
// Set compare match register for 1hz increments
OCR1A = 15624; // = (16*10^6) / (1*1024) - 1 (must be <65536)
// Turn On CTC Mode
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 Bits for 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
// Enable Timer Compare Interrupt
TIMSK1 |= (1 << OCIE1A);// Setup Pins
pinMode(A1, INPUT); // Input For Analog Signal From Proximity Sensor
pinMode(10, OUTPUT); // Configure pin 10 as an Output to Motor Driver
pinMode(11, OUTPUT); // Configure pin 11 as an Output to Motor Driver
}SIGNAL(TIMER1_COMPA_vect) {
sensorValue = analogRead(A1);
if(sensorValue < thresholdValue & pressedFlag == 0){
sensorFlag = !sensorFlag;
pressedFlag = 1;
} else if(sensorValue > thresholdValue){
pressedFlag = 0;
}
}
上面代碼中的SINGAL函數(shù)是定時(shí)器中斷的中斷服務(wù)程序,每次觸發(fā)中斷時(shí)都會(huì)運(yùn)行該函數(shù),每秒更新接近傳感器的值。如果從傳感器讀取的值小于我們的閾值,我們認(rèn)為傳感器“被按下”并切換sensorFlag。需要通過測(cè)試傳感器來預(yù)先確定該閾值,并確定想要視為“按下”的輸出值。為了將sensorFlag的切換限制為在傳感器被“按下”時(shí)僅切換一次,還有另一個(gè)標(biāo)志在傳感器值不再小于閾值之前不會(huì)重置。
接近傳感器還可用于測(cè)量前方最近物體的距離。這在使用線性執(zhí)行器的應(yīng)用中特別有用,可以檢測(cè)執(zhí)行器前面的障礙物,并向控制器發(fā)送反饋,以便在執(zhí)行器距離物體太近時(shí)停止執(zhí)行器,
此應(yīng)用的接近傳感器的設(shè)置與非接觸式控制非常相似。仍然需要使用微控制器讀取傳感器的輸出,并且將再次利用內(nèi)部定時(shí)器中斷來定期讀取傳感器的值。不過,傳感器現(xiàn)在將放置在執(zhí)行器前面,以檢測(cè)其前面的障礙物。傳感器的輸出將與傳感器前面最近的物體的距離相關(guān),這意味著我們可以根據(jù)最小安全距離確定一個(gè)閾值。該閾值將根據(jù)所選傳感器的不同而變化。在下面的代碼示例中,信號(hào)函數(shù)(中斷服務(wù)例程)每毫秒執(zhí)行一次,測(cè)量傳感器的輸出并將其與閾值進(jìn)行比較。如果測(cè)量值小于閾值,則將標(biāo)志sensorFlag設(shè)置為1,并在主循環(huán)中使用該標(biāo)志來停止線性執(zhí)行器。當(dāng)測(cè)量值小于閾值時(shí),代碼將不允許執(zhí)行器進(jìn)一步延伸,直到測(cè)量值大于閾值并且標(biāo)志重置為0。代碼仍然允許線性當(dāng)sensorFlag設(shè)置為1時(shí),執(zhí)行器將縮回,因?yàn)榭s回執(zhí)行器仍然是安全的。
void setup() {
// Set Timer1 Interrupt to Trigger Every Millisecond
TCCR1A = 0; // Set TCCR1A Register to 0
TCCR1B = 0; // Set TCCR1B Register to 0
TCNT1 = 0; // Initialize counter
// Set compare match register for 1000hz increments
OCR1A = 15; // = (16*10^6) / (1*1024) - 1 (must be <65536)
// Turn On CTC Mode
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 Bits for 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
// Enable Timer Compare Interrupt
TIMSK1 |= (1 << OCIE1A);// Setup Pins
pinMode(A1, INPUT); // Input For Analog Signal From Proximity Sensor
pinMode(10, OUTPUT); // Configure pin 10 as an Output to Motor Driver
pinMode(11, OUTPUT); // Configure pin 11 as an Output to Motor Driver
}SIGNAL(TIMER1_COMPA_vect) {
sensorValue = analogRead(A1);
if(sensorValue > thresholdValue){
sensorFlag = 1;
} else{
sensorFlag = 0;
}
}void loop() {
if(digitalRead(2) == HIGH & digitalRead(3) == LOW){
// Retract Actuator
analogWrite(10, 0);
analogWrite(11, 255);
}
else if(digitalRead(2) == LOW & digitalRead(3) == HIGH){
if(sensorFlag == 1){
// Stop Actuator
analogWrite(10, 0);
analogWrite(11, 0);
} else {
// Extend Actuator
analogWrite(10, 255);
analogWrite(11, 0);
}
}
else{
// Stop Actuator
analogWrite(10, 0);
analogWrite(11, 0);
}
}
相關(guān)產(chǎn)品
免責(zé)聲明
客服熱線: 15267989561
加盟熱線: 15267989561
媒體合作: 0571-87759945
投訴熱線: 0571-87759942
下載儀表站APP
Ybzhan手機(jī)版
Ybzhan公眾號(hào)
Ybzhan小程序