对于那些在花园中拥有风力涡轮机的人来说,最糟糕的事情之一就是看到螺旋桨平稳地转弯并突然旋转很短的时间然后再次转弯,而显然没有任何理由停下来。发生了什么事 ?
可能是 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
复制代码
|