對于那些在花園中擁有風力渦輪機的人來說,最糟糕的事情之一就是看到螺旋槳平穩地轉彎并突然旋轉很短的時間然后再次轉彎,而顯然沒有任何理由停下來。發生了什么事 ?
可能是 3 線電纜短路。...如何查看?當然,有了電壓表,您可以進行驗證...但是大多數情況下,您只會測量出一切都正確。當然,短路非常短暫,非常短。
這是一個解決方案:安裝后,如果一切正常,將關閉 2 個紅色 LED。但是,一旦在 3 根線(或 3 根線)中的 2 根線之間未檢測到電壓,一條指示燈就會閃爍,這表明哪根線有問題:
紅色 led 1 如果在 volt1 和 volt3 之間存在問題,紅色 led 2 則在 volt2和 volt3 之間存在問題,兩個紅色 led 都表明 volt2 和 volt3 之間存在問題,或者沒有風....
R 設置為限制電流:4.7K 將在 47V 電壓下產生 10mA 電流,而在 94V電壓下產生 20mA 電流。
D 是一個整流二極管,例如 1N4001 或您想要的任何二極管。LED(綠色 LED)用作齊納二極管,以將輸入電壓限制為 Arduino 的模擬輸入。我使用 90 年綠色 LED,其工作電壓約為 2V。您可以使用任何希望的 LED,如果與 ATtiny85 一起使用,其工作電壓應低于2.5V。
該代碼執行什么操作?它連續讀取 volt1 和 volt2 電壓 100 個周期。不要忘記它是交流電壓,
因此需要一點時間來確保獲得多個電壓周期。如果在此時間之后該值太低,則它將停止測量,并且右紅色指示燈閃爍,直到重置。同時在電壓 1 和電壓 2 之間進行比較,如果測量值太近,則兩個紅色 LED 都閃爍。
該代碼是針對 Arduino 和 ATtiny85 提出的。
ATtiny85 的優勢非常小,因此可以構建一個尺寸很小的設備,該設備可以使用 CR2032 電池在 3V 的電壓下工作。由于代碼中的 sleeping方法可以確保單元能夠運行多年!
ATtiny85三相校驗碼.c
- /* 3 phases checker in triangle configuration
- *
- * For ATiny85
- *
- *
- +-------+
- RESET <= PB5 1|* |8 VCC
- input1 <= A3 = PB3 2| |7 PB2 => LED1
- input2 <= A2 = PB4 3| |6 PB1 => LED2
- input3 <= GND 4| |5 PB0 => startup LED
- +-------+
- connection :
- RESET in PB5 = pin1 => push-button to GND // 10K to Vcc
- volt1 in PB3 = pin2 => 1st wire
- volt2 in PB4 = pin3 => 2nd wire
- GND = pin4 => 3rd wire
- LED1 in PB2 = pin7 => 1st wire
- LED2 in PB1 = pin6 => 2nd wire
- startup LED PB0 = pin5 => flash after each reset push
-
- */
- #include <avr/sleep.h>
- #include <EEPROM.h>
- #ifndef cbi
- #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
- #endif
- #ifndef sbi
- #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
- #endif
- bool eveil = true; // WD flag
- bool v1cut = false, v2cut = false;
- void setup() {
- pinMode(0, INPUT);
- pinMode(3, INPUT);
- pinMode(4, INPUT);
- pinMode(2, INPUT);
- pinMode(1, INPUT);
- // the watchdog sets the interval delay :
- // 0=16ms, 1=32ms,2=64ms, 3=128ms, 4=250ms, 5=500ms, 6=1s, 7=2s, 8=4s, 9=8s
- setup_watchdog(6);
- set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode
- for( byte i=0; i<5; i++ ) {
- flasher(0);
- delay(100);
- }
- }
- void flasher(byte p) {
- pinMode(p, OUTPUT);
- digitalWrite(p, HIGH);
- delay(5);
- digitalWrite(p, LOW);
- pinMode(p, INPUT);
- }
- void loop() {
- unsigned long volt1, volt2;
- byte nbre_cc;
- byte a=0;
-
- while( v1cut == false && v2cut == false ) {
- volt1=0; volt2=0;
- nbre_cc=0;
- a++;
- if( a%10 == 0 ) flasher(0);
- for( byte i=0; i<100; i++ ) {
- unsigned int v1 = analogRead(A3);
- delayMicroseconds(10);
- unsigned int v2 = analogRead(A2);
- delayMicroseconds(10);
- volt1 += v1; volt2 += v2;
- if( v1-v2 < 20 || v2-v1 < 20 ) nbre_cc++;
- delay(1);
- }
-
- if( nbre_cc > 50 ) { v1cut = true; v2cut = true; }
- if( volt1 < 1000 ) v1cut = true;
- if( volt2 < 1000 ) v2cut = true;
- } // end of while
-
- if( eveil == true ) {
- eveil = false;
- if( v1cut == true ) flasher(2);
- if( v2cut == true ) flasher(1);
- system_sleep(); // go to sleep for 8 secondes
- }
- } // end of loop
- // set system into the sleep state - system wakes up when wtchdog is timed out
- void system_sleep() {
- cbi(ADCSRA,ADEN); // Switch ADC OFF, bacause ADC uses ~320uA
- EEPROM.write(0, v1cut);
- EEPROM.write(1, v2cut);
- sleep_enable();
- sleep_mode(); // System actually sleeps here
- sleep_disable(); // System continues execution here when watchdog timed out
- sbi(ADCSRA,ADEN); // Switch Analog to Digital converter ON
- v1cut = EEPROM.read(0);
- v2cut = EEPROM.read(1);
- }
- void setup_watchdog( byte tempo ) {
- byte val;
- val = tempo & 7;
- if (tempo > 7) val |= (1<<5);
- val |= (1<<WDCE);
- MCUSR &= ~(1<<WDRF); // start timed sequence
- WDTCR |= (1<<WDCE) | (1<<WDE); // set new watchdog timeout value
- WDTCR = val;
- WDTCR |= _BV(WDIE);
- }
-
- // Watchdog Interrupt Service / is executed when watchdog timed out
- ISR(WDT_vect) { eveil = true; } // set global flag
復制代碼
三相檢查器的Arduino Uno代碼.c
- /* 3 phases checker in triangle configuration
- *
- * For Arduino Uno
- *
- *
- RESET => Arduino Uno push-button
- volt1 = A3 => 1st wire
- volt2 = A2 => 2nd wire
- volt3 = GND => 3rd wire
- LED1 = 8 => 1st wire LED
- LED2 = 9 => 2nd wire LED
-
- */
- bool v1cut = false, v2cut = false;
- void setup() {
- pinMode(8, OUTPUT);
- pinMode(9, OUTPUT);
- }
- void flasher(byte p) {
- digitalWrite(p, HIGH);
- delay(5);
- digitalWrite(p, LOW);
- }
- void loop() {
- unsigned long volt1, volt2;
- byte nbre_cc;
- byte a=0;
-
- while( v1cut == false && v2cut == false ) {
- volt1=0; volt2=0;
- nbre_cc=0;
- a++;
- if( a%10 == 0 ) flasher(0);
- for( byte i=0; i<100; i++ ) {
- unsigned int v1 = analogRead(A3);
- delayMicroseconds(10);
- unsigned int v2 = analogRead(A2);
- delayMicroseconds(10);
- volt1 += v1; volt2 += v2;
- if( v1-v2 < 20 || v2-v1 < 20 ) nbre_cc++;
- delay(1);
- }
-
- if( nbre_cc > 50 ) { v1cut = true; v2cut = true; }
- if( volt1 < 1000 ) v1cut = true;
- if( volt2 < 1000 ) v2cut = true;
- } // end of while
- if( v1cut == true ) flasher(2);
- if( v2cut == true ) flasher(1);
- } // end of loop
復制代碼
|