Advertisement
Guest User

Untitled

a guest
Apr 18th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.96 KB | None | 0 0
  1. //ПОДВЕСТИ 5ВОЛЬТ!!!
  2. /*
  3. Программа-демонстрация управления ваттметром М3-22А с микроконтроллера.
  4.  
  5. Установка режима управления происходит через микросхему pcf8475A с адресом 56 на шине i2c, где:
  6.  
  7. отсчёт битов в формате Вхххххххх идёт СПРАВА НАЛЕВО.
  8. нумерация битов совпадает с нумерацией выходов P0-P7 в pcf.
  9.  
  10. 0бит (ЛСБ) - нуль для включения управления контроллером (4 контакт на разъёме м3-22а)
  11. 1 - не распаян
  12. 2 - не распаян
  13. 3 - не распаян
  14. 4 - установка предела 2 (7 контакт)
  15. 5 - установка предела 1 (6 контакт) (коды пределов: 11 - 10мвт, 00 - 10мквт, 10 - 1мВт, 01 - 100мкВт)
  16. 6 - (24 контакт) если единица, то включает режим автоматического выбора предела на ваттметре
  17. 7(МСБ) - (5 контакт) устанавливает нуль на индикаторе автоматически когда подан нуль
  18.  
  19. распиновка розетки м3-22а (РПМ7-36Г), вид ззади:
  20. _________________
  21. \35-33-....-3-1 /
  22.  \36-34-...-4-2/
  23.   \___________/
  24.  
  25. 1 контакт - питание +5В микросхем , но лучше питаться автономно, т.к. выключение м322 сбрасывает конфигурацию выходов пцф
  26. 2 контакт - 2мс синхроимпульс отрицательной полярности, во время которого надо считывать данные
  27. можно повесить на прерывание, но хватает и скорости обычного digitalRead()
  28. скорость считывания мощности ограничивается 5 синхроимпульсами в секунду.
  29. 25 и 27 контакты - корпус
  30.  
  31. Пцфки с адресами 57 и 58 отвечают за збор данных
  32.  
  33. пцф57 :
  34. 0 и 1 бит - контакты 8 и 9 соответствуют коду предела для считывания в режиме автопредела
  35. (11 - 10мвт, 00 - 10мквт, 10 - 1мвт, 01 - 100мквт)
  36. 2 и 3 бит - 34 и 23 контакты - полярность и единица старшего (I) разряда
  37. 4-7 бит - 18, 19, 21 и 22 контакты - BCD-код II разряда (который в описании ошибочно обозначен как IV)
  38.  
  39. пцф58:
  40. 0-3 бит - 17-14 контакты, BCD-код третьего разряда
  41. 4-7 бит - 10-13 контакты, BCD-код младшего IV разряда, обозначенного в схеме как II.
  42. */
  43.  
  44. #include <Wire.h>
  45.  
  46. byte pcf57 = B00000000;
  47. byte pcf58 = B00000000;
  48. int i, j, I, II, III, IV;
  49. boolean KP1, KP2;
  50.  
  51. //===================================================================================================
  52.  
  53. void setup() {
  54.     Wire.begin();
  55.     Serial.begin(9600);
  56.     pinMode(2, INPUT_PULLUP);
  57. }
  58.  
  59. //===================================================================================================
  60.  
  61. void loop() {
  62.  
  63.     Wire.beginTransmission(57);
  64.     Wire.write(B11111111);
  65.     Serial.print(Wire.endTransmission());
  66.    
  67.     Wire.beginTransmission(58);
  68.     Wire.write(B11111111);
  69.     Serial.print(Wire.endTransmission());
  70.    
  71.     //===================================================================================================
  72.     // просто чтение на пределе 10мВт
  73.    
  74.     Wire.beginTransmission(56);
  75.     Wire.write(B10110000);
  76.     Serial.println(Wire.endTransmission());
  77.     Serial.println("READING 10mW SCALE");
  78.    
  79.    
  80.     delay(2000);
  81.     for (i = 0; i<10; i++) {
  82.         while( (digitalRead(2)) ) {
  83.             continue ;
  84.         };
  85.         Wire.requestFrom(57,1);
  86.         for (j = 0; j<100; j++) {
  87.             if (Wire.available()) {
  88.                 pcf57 = Wire.read();
  89.             };
  90.         };
  91.         Wire.requestFrom(58,1);
  92.         for (j = 0; j<100; j++) {
  93.             if (Wire.available()) {
  94.                 pcf58= Wire.read();
  95.             };
  96.         };
  97.         if ( bitRead(pcf57,2) ) {
  98.             Serial.print("+");
  99.         }
  100.         else {
  101.             Serial.print("-");
  102.         };
  103.         I =   bitRead(pcf57,3);
  104.         Serial.print(I);
  105.         II =  bitRead(pcf57,4) + bitRead(pcf57,5) * 2 + bitRead(pcf57,6) * 4 + bitRead(pcf57,7) * 8 ;
  106.         Serial.print(II);
  107.         Serial.print(",");
  108.         III = bitRead(pcf58,3) + bitRead(pcf58,2) * 2 + bitRead(pcf58,1) * 4 + bitRead(pcf58,0) * 8 ;
  109.         Serial.print(III);
  110.         IV =  bitRead(pcf58,4) + bitRead(pcf58,5) * 2 + bitRead(pcf58,6) * 4 + bitRead(pcf58,7) * 8 ;
  111.         Serial.print(IV);
  112.         Serial.println("mW");
  113.         delay(1000);
  114.     }
  115.     //===================================================================================================
  116.     //установка предела 1мВт и чтение
  117.    
  118.     Wire.beginTransmission(56);
  119.     Wire.write(B10100000);
  120.     Serial.println(Wire.endTransmission());
  121.     Serial.println("READING 1mW SCALE");
  122.    
  123.     delay(2000);
  124.     for (i = 0; i<10; i++) {
  125.         while( (digitalRead(2)) ) {
  126.             continue ;
  127.         };
  128.         Wire.requestFrom(57,1);
  129.         for (j = 0; j<100; j++) {
  130.             if (Wire.available()) {
  131.                 pcf57 = Wire.read();
  132.             };
  133.         };
  134.         Wire.requestFrom(58,1);
  135.         for (j = 0; j<100; j++) {
  136.             if (Wire.available()) {
  137.                 pcf58= Wire.read();
  138.             };
  139.         };
  140.         if ( bitRead(pcf57,2) ) {
  141.             Serial.print("+");
  142.         }
  143.         else {
  144.             Serial.print("-");
  145.         };
  146.         I =   bitRead(pcf57,3);
  147.         Serial.print(I);
  148.         Serial.print(",");
  149.         II =  bitRead(pcf57,4) + bitRead(pcf57,5) * 2 + bitRead(pcf57,6) * 4 + bitRead(pcf57,7) * 8 ;
  150.         Serial.print(II);
  151.         III = bitRead(pcf58,3) + bitRead(pcf58,2) * 2 + bitRead(pcf58,1) * 4 + bitRead(pcf58,0) * 8 ;
  152.         Serial.print(III);
  153.         IV =  bitRead(pcf58,4) + bitRead(pcf58,5) * 2 + bitRead(pcf58,6) * 4 + bitRead(pcf58,7) * 8 ;
  154.         Serial.print(IV);
  155.         Serial.println("mW");
  156.         delay(1000);
  157.     }
  158.     //===================================================================================================
  159.     // установка предела 100мквт и чтение
  160.     Wire.beginTransmission(56);
  161.     Wire.write(B10010000);
  162.     Serial.println(Wire.endTransmission());
  163.     Serial.println("READING 100uW SCALE");
  164.    
  165.     delay(2000);
  166.     for (i = 0; i<10; i++) {
  167.         while( (digitalRead(2)) ) {
  168.             continue ;
  169.         };
  170.         Wire.requestFrom(57,1);
  171.         for (j = 0; j<100; j++) {
  172.             if (Wire.available()) {
  173.                 pcf57 = Wire.read();
  174.             };
  175.         };
  176.         Wire.requestFrom(58,1);
  177.         for (j = 0; j<100; j++) {
  178.             if (Wire.available()) {
  179.                 pcf58= Wire.read();
  180.             };
  181.         };
  182.         if ( bitRead(pcf57,2) ) {
  183.             Serial.print("+");
  184.         }
  185.         else {
  186.             Serial.print("-");
  187.         };
  188.         I =   bitRead(pcf57,3);
  189.         Serial.print(I);
  190.         II =  bitRead(pcf57,4) + bitRead(pcf57,5) * 2 + bitRead(pcf57,6) * 4 + bitRead(pcf57,7) * 8 ;
  191.         Serial.print(II);
  192.         III = bitRead(pcf58,3) + bitRead(pcf58,2) * 2 + bitRead(pcf58,1) * 4 + bitRead(pcf58,0) * 8 ;
  193.         Serial.print(III);
  194.         Serial.print(",");
  195.         IV =  bitRead(pcf58,4) + bitRead(pcf58,5) * 2 + bitRead(pcf58,6) * 4 + bitRead(pcf58,7) * 8 ;
  196.         Serial.print(IV);
  197.         Serial.println("uW");
  198.         delay(1000);
  199.     }
  200.     //===================================================================================================
  201.     // установка предела 10мквт и чтение
  202.     Wire.beginTransmission(56);
  203.     Wire.write(B10000000);
  204.     Serial.println(Wire.endTransmission());
  205.     Serial.println("READING 10uW SCALE");
  206.    
  207.     delay(2000);
  208.     for (i = 0; i<10; i++) {
  209.         while( (digitalRead(2)) ) {
  210.             continue ;
  211.         };
  212.         Wire.requestFrom(57,1);
  213.         for (j = 0; j<100; j++) {
  214.             if (Wire.available()) {
  215.                 pcf57 = Wire.read();
  216.             };
  217.         };
  218.         Wire.requestFrom(58,1);
  219.         for (j = 0; j<100; j++) {
  220.             if (Wire.available()) {
  221.                 pcf58= Wire.read();
  222.             };
  223.         };
  224.         if ( bitRead(pcf57,2) ) {
  225.             Serial.print("+");
  226.         }
  227.         else {
  228.             Serial.print("-");
  229.         };
  230.         I =   bitRead(pcf57,3);
  231.         Serial.print(I);
  232.         II =  bitRead(pcf57,4) + bitRead(pcf57,5) * 2 + bitRead(pcf57,6) * 4 + bitRead(pcf57,7) * 8 ;
  233.         Serial.print(II);
  234.         Serial.print(",");
  235.         III = bitRead(pcf58,3) + bitRead(pcf58,2) * 2 + bitRead(pcf58,1) * 4 + bitRead(pcf58,0) * 8 ;
  236.         Serial.print(III);
  237.         IV =  bitRead(pcf58,4) + bitRead(pcf58,5) * 2 + bitRead(pcf58,6) * 4 + bitRead(pcf58,7) * 8 ;
  238.         Serial.print(IV);
  239.         Serial.println("uW");
  240.         delay(1000);
  241.     }
  242.    
  243.     //===================================================================================================
  244.     //установка предела 10мкВт c автоустановкой нуля
  245.     //автоустановка работает только в режиме кнопки измерений
  246.    
  247.     Wire.beginTransmission(56);
  248.     Wire.write(B10000000);
  249.     Serial.println(Wire.endTransmission());
  250.     Serial.println("SETTING 10uW SCALE");
  251.     delay(1000);
  252.     Wire.beginTransmission(56);
  253.     Wire.write(B00000000);
  254.     Serial.println(Wire.endTransmission());
  255.     Serial.println("AutoSETTING ZERO...");
  256.     delay(10000);
  257.     Wire.beginTransmission(56);
  258.     Wire.write(B10000000);
  259.     Serial.println(Wire.endTransmission());
  260.     Serial.println("READING 10uW SCALE");
  261.     Serial.println("REMOTE CONTROL ENABLED");
  262.    
  263.     delay(2000);
  264.     for (i = 0; i<10; i++) {
  265.         while( (digitalRead(2)) ) {
  266.             continue ;
  267.         };
  268.         Wire.requestFrom(57,1);
  269.         for (j = 0; j<100; j++) {
  270.             if (Wire.available()) {
  271.                 pcf57 = Wire.read();
  272.             };
  273.         };
  274.         Wire.requestFrom(58,1);
  275.         for (j = 0; j<100; j++) {
  276.             if (Wire.available()) {
  277.                 pcf58= Wire.read();
  278.             };
  279.         };
  280.         if ( bitRead(pcf57,2) ) {
  281.             Serial.print("+");
  282.         }
  283.         else {
  284.             Serial.print("-");
  285.         };
  286.         I =   bitRead(pcf57,3);
  287.         Serial.print(I);
  288.         II =  bitRead(pcf57,4) + bitRead(pcf57,5) * 2 + bitRead(pcf57,6) * 4 + bitRead(pcf57,7) * 8 ;
  289.         Serial.print(II);
  290.         Serial.print(",");
  291.         III = bitRead(pcf58,3) + bitRead(pcf58,2) * 2 + bitRead(pcf58,1) * 4 + bitRead(pcf58,0) * 8 ;
  292.         Serial.print(III);
  293.         IV =  bitRead(pcf58,4) + bitRead(pcf58,5) * 2 + bitRead(pcf58,6) * 4 + bitRead(pcf58,7) * 8 ;
  294.         Serial.print(IV);
  295.         Serial.println("uW");
  296.         delay(1000);
  297.     }
  298.    
  299.     //===================================================================================================
  300.     //просто отключение дистанционного управления (для установки нуля потенциометром).
  301.    
  302.     Wire.beginTransmission(56);
  303.     Wire.write(B10110001);
  304.     Serial.println(Wire.endTransmission());
  305.     Serial.println("REMOTE CONTROL DISABLED");
  306.     delay(10000);
  307.    
  308.    
  309.     //===================================================================================================
  310.     //настройка на автоустановку и чтение предела
  311.     Wire.beginTransmission(56);
  312.     Wire.write(B11110000);
  313.     Serial.println(Wire.endTransmission());
  314.     Serial.println("AutoSCALE FEATURE");
  315.    
  316.    
  317.     delay(2000);
  318.     for (i = 0; i<10; i++) {
  319.         while( (digitalRead(2)) ) {
  320.             continue ;
  321.         };
  322.         Wire.requestFrom(57,1);
  323.         for (j = 0; j<100; j++) {
  324.             if (Wire.available()) {
  325.                 pcf57 = Wire.read();
  326.             };
  327.         };
  328.         Wire.requestFrom(58,1);
  329.         for (j = 0; j<100; j++) {
  330.             if (Wire.available()) {
  331.                 pcf58= Wire.read();
  332.             };
  333.         };
  334.        
  335.         KP1 = bitRead(pcf57,0);
  336.         KP2 = bitRead(pcf57,1);
  337.         if ( bitRead(pcf57,2) ) {
  338.             Serial.print("+");
  339.         }
  340.         else {
  341.             Serial.print("-");
  342.         };
  343.        
  344.         I =   bitRead(pcf57,3);
  345.         Serial.print(I);
  346.         if (!KP1 & KP2) {
  347.             Serial.print(",");
  348.         };
  349.        
  350.         II =  bitRead(pcf57,4) + bitRead(pcf57,5) * 2 + bitRead(pcf57,6) * 4 + bitRead(pcf57,7) * 8 ;
  351.         Serial.print(II);
  352.         if ( (KP1 & KP2) | (!KP1 & !KP2) ) {
  353.             Serial.print(",");
  354.         };
  355.        
  356.         III = bitRead(pcf58,3) + bitRead(pcf58,2) * 2 + bitRead(pcf58,1) * 4 + bitRead(pcf58,0) * 8 ;
  357.         Serial.print(III);
  358.         if (KP1 & !KP2) {
  359.             Serial.print(",");
  360.         };
  361.        
  362.         IV =  bitRead(pcf58,4) + bitRead(pcf58,5) * 2 + bitRead(pcf58,6) * 4 + bitRead(pcf58,7) * 8 ;
  363.         Serial.print(IV);
  364.        
  365.         if ( (KP1 & KP2) | (!KP1 & KP2) ) {
  366.             Serial.println("mW");
  367.         }
  368.         else {
  369.             Serial.println("uW");
  370.         };
  371.        
  372.         delay(1000);
  373.     }
  374.    
  375.     //===================================================================================================
  376.     //установка предела c автоустановкой нуля
  377.     //автоустановка работает только в режиме кнопки измерений
  378.    
  379.     Wire.beginTransmission(56);
  380.     Wire.write(B11110000);
  381.     Serial.println(Wire.endTransmission());
  382.     Serial.println("AutoSCALE");
  383.     delay(1000);
  384.     Wire.beginTransmission(56);
  385.     Wire.write(B01110000);
  386.     Serial.println(Wire.endTransmission());
  387.     Serial.println("AutoSETTING ZERO...");
  388.     delay(10000);
  389.     Wire.beginTransmission(56);
  390.     Wire.write(B11110000);
  391.     Serial.println(Wire.endTransmission());
  392.     Serial.println("READING 10uW SCALE");
  393.     Serial.println("REMOTE CONTROL ENABLED");
  394.    
  395.     //===================================================================================================
  396.     //бесконечный цикл на автопределе
  397.     while ( true ) {
  398.         while( (digitalRead(2)) ) {
  399.             continue ;
  400.         };
  401.         Wire.requestFrom(57,1);
  402.         for (j = 0; j<100; j++) {
  403.             if (Wire.available()) {
  404.                 pcf57 = Wire.read();
  405.             };
  406.         };
  407.         Wire.requestFrom(58,1);
  408.         for (j = 0; j<100; j++) {
  409.             if (Wire.available()) {
  410.                 pcf58= Wire.read();
  411.             };
  412.         };
  413.        
  414.         KP1 = bitRead(pcf57,0);
  415.         KP2 = bitRead(pcf57,1);
  416.         if ( bitRead(pcf57,2) ) {
  417.             Serial.print("+");
  418.         }
  419.         else {
  420.             Serial.print("-");
  421.         };
  422.        
  423.         I =   bitRead(pcf57,3);
  424.         Serial.print(I);
  425.         if (!KP1 & KP2) {
  426.             Serial.print(",");
  427.         };
  428.        
  429.         II =  bitRead(pcf57,4) + bitRead(pcf57,5) * 2 + bitRead(pcf57,6) * 4 + bitRead(pcf57,7) * 8 ;
  430.         Serial.print(II);
  431.         if ( (KP1 & KP2) | (!KP1 & !KP2) ) {
  432.             Serial.print(",");
  433.         };
  434.        
  435.         III = bitRead(pcf58,3) + bitRead(pcf58,2) * 2 + bitRead(pcf58,1) * 4 + bitRead(pcf58,0) * 8 ;
  436.         Serial.print(III);
  437.         if (KP1 & !KP2) {
  438.             Serial.print(",");
  439.         };
  440.        
  441.         IV =  bitRead(pcf58,4) + bitRead(pcf58,5) * 2 + bitRead(pcf58,6) * 4 + bitRead(pcf58,7) * 8 ;
  442.         Serial.print(IV);
  443.        
  444.         if ( (KP1 & KP2) | (!KP1 & KP2) ) {
  445.             Serial.println("mW");
  446.         }
  447.         else {
  448.             Serial.println("uW");
  449.         };
  450.     }
  451. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement