找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1710|回复: 1
打印 上一主题 下一主题
收起左侧

Arduino ATtiny85 Delta AC三相检查器电路原理图

[复制链接]
跳转到指定楼层
楼主
ID:928738 发表于 2021-11-24 14:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对于那些在花园中拥有风力涡轮机的人来说,最糟糕的事情之一就是看到螺旋桨平稳地转弯并突然旋转很短的时间然后再次转弯,而显然没有任何理由停下来。发生了什么事 ?

可能是 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
  1. /* 3 phases checker in triangle configuration
  2. *  
  3. *  For ATiny85
  4. *  
  5. *  
  6.                         +-------+
  7.         RESET  <= PB5  1|*      |8  VCC
  8.    input1 <= A3 = PB3  2|       |7  PB2 => LED1
  9.    input2 <= A2 = PB4  3|       |6  PB1 => LED2
  10.         input3 <= GND  4|       |5  PB0 => startup LED
  11.                         +-------+
  12. connection :

  13.    RESET in PB5 = pin1  => push-button to GND // 10K to Vcc
  14.    volt1 in PB3 = pin2  => 1st wire
  15.    volt2 in PB4 = pin3  => 2nd wire
  16.             GND = pin4  => 3rd wire
  17.     LED1 in PB2 = pin7  => 1st wire
  18.     LED2 in PB1 = pin6  => 2nd wire
  19. startup LED PB0 = pin5  => flash after each reset push

  20. */

  21. #include <avr/sleep.h>
  22. #include <EEPROM.h>

  23. #ifndef cbi
  24. #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
  25. #endif
  26. #ifndef sbi
  27. #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
  28. #endif

  29. bool eveil = true;                      // WD flag
  30. bool v1cut = false, v2cut = false;      

  31. void setup() {

  32.   pinMode(0, INPUT);  
  33.   pinMode(3, INPUT);
  34.   pinMode(4, INPUT);
  35.   pinMode(2, INPUT);
  36.   pinMode(1, INPUT);

  37. // the watchdog sets the interval delay :
  38. // 0=16ms, 1=32ms,2=64ms, 3=128ms, 4=250ms, 5=500ms, 6=1s, 7=2s, 8=4s, 9=8s
  39.   setup_watchdog(6);
  40.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // sleep mode

  41.   for( byte i=0; i<5; i++ ) {
  42.     flasher(0);
  43.     delay(100);
  44.   }
  45. }

  46. void flasher(byte p) {
  47.   pinMode(p, OUTPUT);
  48.   digitalWrite(p, HIGH);
  49.   delay(5);
  50.   digitalWrite(p, LOW);
  51.   pinMode(p, INPUT);
  52. }

  53. void loop() {

  54.   unsigned long volt1, volt2;
  55.   byte nbre_cc;
  56.   byte a=0;
  57.   
  58.   while( v1cut == false && v2cut == false ) {
  59.     volt1=0; volt2=0;
  60.     nbre_cc=0;
  61.     a++;
  62.     if( a%10 == 0 ) flasher(0);
  63.     for( byte i=0; i<100; i++ ) {
  64.       unsigned int v1 = analogRead(A3);
  65.       delayMicroseconds(10);
  66.       unsigned int v2 = analogRead(A2);
  67.       delayMicroseconds(10);
  68.       volt1 += v1; volt2 += v2;
  69.       if( v1-v2 < 20 || v2-v1 < 20 ) nbre_cc++;           
  70.       delay(1);
  71.     }
  72.    
  73.     if( nbre_cc > 50 ) { v1cut = true; v2cut = true; }
  74.     if( volt1 < 1000 ) v1cut = true;
  75.     if( volt2 < 1000 ) v2cut = true;
  76.   }   // end of while
  77.   
  78.   if( eveil == true ) {
  79.     eveil = false;
  80.     if( v1cut == true ) flasher(2);
  81.     if( v2cut == true ) flasher(1);
  82.     system_sleep();           // go to sleep for 8 secondes
  83.   }
  84. }   // end of loop

  85. // set system into the sleep state - system wakes up when wtchdog is timed out
  86. void system_sleep() {
  87.   cbi(ADCSRA,ADEN);           // Switch ADC OFF, bacause ADC uses ~320uA
  88.   EEPROM.write(0, v1cut);
  89.   EEPROM.write(1, v2cut);
  90.   sleep_enable();
  91.   sleep_mode();               // System actually sleeps here
  92.   sleep_disable();            // System continues execution here when watchdog timed out
  93.   sbi(ADCSRA,ADEN);           // Switch Analog to Digital converter ON
  94.   v1cut = EEPROM.read(0);
  95.   v2cut = EEPROM.read(1);
  96. }

  97. void setup_watchdog( byte tempo ) {
  98.   byte val;
  99.   val = tempo & 7;
  100.   if (tempo > 7) val |= (1<<5);
  101.   val |= (1<<WDCE);
  102.   MCUSR &= ~(1<<WDRF);                  // start timed sequence
  103.   WDTCR |= (1<<WDCE) | (1<<WDE);        // set new watchdog timeout value
  104.   WDTCR = val;
  105.   WDTCR |= _BV(WDIE);
  106. }
  107.   
  108. // Watchdog Interrupt Service / is executed when watchdog timed out
  109. ISR(WDT_vect) { eveil = true; }        // set global flag  
复制代码

三相检查器的Arduino Uno代码.c
  1. /* 3 phases checker in triangle configuration
  2. *  
  3. *  For Arduino Uno
  4. *  
  5. *  


  6.    RESET  => Arduino Uno push-button
  7.    volt1 = A3  => 1st wire
  8.    volt2 = A2  => 2nd wire
  9.    volt3 = GND => 3rd wire
  10.     LED1 = 8   => 1st wire LED
  11.     LED2 = 9   => 2nd wire LED

  12. */

  13. bool v1cut = false, v2cut = false;      

  14. void setup() {
  15.   pinMode(8, OUTPUT);
  16.   pinMode(9, OUTPUT);
  17. }

  18. void flasher(byte p) {
  19.   digitalWrite(p, HIGH);
  20.   delay(5);
  21.   digitalWrite(p, LOW);
  22. }

  23. void loop() {
  24.   unsigned long volt1, volt2;
  25.   byte nbre_cc;
  26.   byte a=0;
  27.   
  28.   while( v1cut == false && v2cut == false ) {
  29.     volt1=0; volt2=0;
  30.     nbre_cc=0;
  31.     a++;
  32.     if( a%10 == 0 ) flasher(0);
  33.     for( byte i=0; i<100; i++ ) {
  34.       unsigned int v1 = analogRead(A3);
  35.       delayMicroseconds(10);
  36.       unsigned int v2 = analogRead(A2);
  37.       delayMicroseconds(10);
  38.       volt1 += v1; volt2 += v2;
  39.       if( v1-v2 < 20 || v2-v1 < 20 ) nbre_cc++;
  40.       delay(1);
  41.     }
  42.    
  43.     if( nbre_cc > 50 ) { v1cut = true; v2cut = true; }
  44.     if( volt1 < 1000 ) v1cut = true;
  45.     if( volt2 < 1000 ) v2cut = true;
  46.   }   // end of while

  47.     if( v1cut == true ) flasher(2);
  48.     if( v2cut == true ) flasher(1);
  49. }   // end of loop
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:228452 发表于 2022-4-1 22:16 | 只看该作者
Hello
This is Schneider schematic input 140-580VAC from factory made module
I hope this can be of use

Schneider Schematic.pdf

1.28 MB, 下载次数: 9, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表