上海維立勝衡傳感器有限公司
閱讀:83發(fā)布時間:2025-3-3
接近開關是非接觸式開關,可以檢測附近是否存在物體。通常,接近傳感器與非接觸式設備一起使用,例如非接觸式干手器和SUV中的免提電動尾門,也廣泛用于工業(yè)應用。配合使用線性執(zhí)行器,接近傳感器可用于各種情況,包括非接觸式控制和物體檢測反饋。
接近傳感器通常通過使用電磁場、光或聲音來檢測物體的存在。而線性執(zhí)行器檢測物體是否存在的方法取決于接近傳感器的類型。接近傳感器有四種常見類型:
電感式::使用磁場檢測含鐵材料
電容式:使用電容變化來檢測物體
光電:使用光來檢測物體是否存在
超聲波:使用聲音來檢測物體是否存在
當物體位于傳感器前面或物體被拿走時,這些傳感器會告訴線性執(zhí)行器移動或停止。它們還可用于確定最近的物體距它們有多遠,并可用于提供反饋來控制線性致動器。
對于非接觸式控制,就像使用簡單的按鈕一樣使用接近傳感器。為此,需要選擇一個檢測范圍較短的接近傳感器,這樣就不會意外觸發(fā)開關。這里我們以電容式接近開關為例:
將接近傳感器連接到微控制器,例如Arduino,讀取傳感器的輸出。如何將接近傳感器連接到微控制器將取決于選擇的傳感器,但在大多數情況下,微控制器將接收數字轉換的模擬值,或者需要將模擬信號轉換為數字值。
在此應用中,接近傳感器僅充當單個按鈕,這將限制我們對線性執(zhí)行器的控制。利用我們的微控制器,我們可以編寫代碼,在傳感器被觸發(fā)時在伸出和縮回之間切換,并利用線性執(zhí)行器的內部限位開關在執(zhí)行器到達伸出或縮回位置時停止執(zhí)行器。我們還可以利用內部反饋或外部限位開關利用到其他位置。
要在微控制器中執(zhí)行此操作,我們需要在每次觸發(fā)接近傳感器時切換標志變量。下面的代碼示例顯示了Arduino IDE代碼的主循環(huán),使用標志sensorFlag來確定要移動的方向驅動線性執(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);
}
}
要切換此標志,我們需要讀取接近傳感器的值。由于我們不知道傳感器何時會被觸發(fā),因此可以利用內部定時器中斷定期讀取傳感器。下面的代碼示例使用Arduino,展示了如何設置每秒觸發(fā)的內部計時器中斷。
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函數是定時器中斷的中斷服務程序,每次觸發(fā)中斷時都會運行該函數,每秒更新接近傳感器的值。如果從傳感器讀取的值小于我們的閾值,我們認為傳感器“被按下”并切換sensorFlag。需要通過測試傳感器來預先確定該閾值,并確定想要視為“按下”的輸出值。為了將sensorFlag的切換限制為在傳感器被“按下”時僅切換一次,還有另一個標志在傳感器值不再小于閾值之前不會重置。
接近傳感器還可用于測量前方最近物體的距離。這在使用線性執(zhí)行器的應用中特別有用,可以檢測執(zhí)行器前面的障礙物,并向控制器發(fā)送反饋,以便在執(zhí)行器距離物體太近時停止執(zhí)行器,
此應用的接近傳感器的設置與非接觸式控制非常相似。仍然需要使用微控制器讀取傳感器的輸出,并且將再次利用內部定時器中斷來定期讀取傳感器的值。不過,傳感器現在將放置在執(zhí)行器前面,以檢測其前面的障礙物。傳感器的輸出將與傳感器前面最近的物體的距離相關,這意味著我們可以根據最小安全距離確定一個閾值。該閾值將根據所選傳感器的不同而變化。在下面的代碼示例中,信號函數(中斷服務例程)每毫秒執(zhí)行一次,測量傳感器的輸出并將其與閾值進行比較。如果測量值小于閾值,則將標志sensorFlag設置為1,并在主循環(huán)中使用該標志來停止線性執(zhí)行器。當測量值小于閾值時,代碼將不允許執(zhí)行器進一步延伸,直到測量值大于閾值并且標志重置為0。代碼仍然允許線性當sensorFlag設置為1時,執(zhí)行器將縮回,因為縮回執(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);
}
}
儀表網 設計制作,未經允許翻錄必究 .? ? ?
請輸入賬號
請輸入密碼
請輸入你感興趣的產品
請簡單描述您的需求
號碼可能有誤,請核對!
請選擇省份