1 (2021-06-18 20:24:39 отредактировано galina)

Тема: Измеритель фазы

Здравствуйте
Почему чтение на ЖК-дисплее скачет на 3.6 градуса (не меняется плавно а через 3.6 градуса  , 100, 103.6, 107.2 ...) и как это исправить. Выход генератора PB7 подключен к входу фазометра PA7, кнопки предназначены для изменения длительности импульсов, пропорциональной фазовому сдвигу.



HardwareTimer pwmtimer4(4);
#include <LiquidCrystal.h>
#include "EmonLib.h"
#include <EEPROM.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
///////////
int pin = PA7; // input
float rads = 57.29577951; // 1 radian = approx 57 deg.
float degree = 360;
float frequency = 10000;
float nano = 1 * pow (10,-6); // Multiplication factor to convert nano seconds into seconds

// Define floats to contain calculations

float pf;
float angle;
float pf_max = 0;
float angle_max = 0;
int ctr;
/////////
int i;
int ovfi;
void setup() {
  pinMode(pin, INPUT);// input
  pinMode(PB7, PWM); //Tx
  pinMode(PB14, INPUT_PULLUP);
  pinMode(PB12, INPUT_PULLUP);

  lcd.begin(16, 2);
  EEPROM.read(500, (uint16*)&i);
}
void loop() {
  /////////////////
for (ctr = 0; ctr <= 4; ctr++) // Perform 4 measurements then reset
  {
  // 1st line calculates the phase angle in degrees from differentiated time pulse
  // Function COS uses radians not Degree's hence conversion made by dividing angle / 57.2958
   angle = ((((pulseIn(pin, HIGH)) * nano)* degree)* frequency);
  // pf = cos(angle / rads); 
   
   if (angle > angle_max) // Test if the angle is maximum angle
     {
      angle_max = angle; // If maximum record in variable "angle_max"
      pf_max = cos(angle_max / rads); // Calc PF from "angle_max"
     }
   }
   if (angle_max > 360) // If the calculation is higher than 360 do following...
   {
    angle_max = 0; // assign the 0 to "angle_max"
    pf_max = 1; // Assign the Unity PF to "pf_max"
   }
   if (angle_max == 0) // If the calculation is higher than 360 do following...
   {
    angle_max = 0; // assign the 0 to "angle_max"
    pf_max = 1; // Assign the Unity PF to "pf_max"
   }
   Serial.print(angle_max, 2); // Print the result
   Serial.print(",");
   Serial.println(pf_max, 2);
   
  lcd.clear();
  /*
   lcd.setCursor(0,0);
   lcd.print("PF=");
   lcd.setCursor(4,0);
   lcd.print(pf_max);
   lcd.print(" ");
   */
    lcd.setCursor(0, 0);
  lcd.print("i =");
  lcd.print(i);
  
   lcd.setCursor(0,1);
   lcd.print("Ph-Shift=");
   lcd.setCursor(10,1);
   lcd.print(angle_max);
   lcd.print(" ");
   
   //delay(500);
   angle = 0; // Reset variables for next test
   angle_max = 0;
  //////////////////
  ovfi = 10000 - i;

  pwmtimer4.pause();
  pwmtimer4.setPrescaleFactor(1);
  pwmtimer4.setOverflow( 7200);

  pwmtimer4.setCompare(TIMER_CH2, i );//step = 100/7200 = 0.0138 micro sec = 13.8

  pwmtimer4.refresh();
  pwmtimer4.resume();

  if (digitalRead(PB12) == HIGH)
  {
    if (i < 7200)
      // if (i < 25)
    {
      i++;
      delay(10);
    }
  }

  if (digitalRead(PB14) == HIGH)
  {
    if (i > 0)
    {
      i--;
      delay(10);
    }
  }


  EEPROM.write(500, i);
}

2

Re: Измеритель фазы

http://forum.rcl-radio.ru/uploads/images/2021/06/59799d2d0ca6acab186df61c039bac80.jpg