Измерение скважности сигнала

Radioamater
Offline
Зарегистрирован: 06.06.2019

Добрый день! 

Прошу помощи в написании скетча либо в поиске готового проекта. Нужно измерять скважность сигнала частотой 60-70кгц с точностью +-10%. Подали сигнал, на LCD или в монитор порта выдало значение скважности. Если кто сможет помочь буду очень признателен. 

nik182
Offline
Зарегистрирован: 04.05.2015
Radioamater
Offline
Зарегистрирован: 06.06.2019

Благодарю за ссылку. Но а готового нет ни чего? Я в ардуино не очень соображаю. А измерять надо. Буду очень благодарен если эта операция будет в готовом скетче. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Radioamater пишет:

 буду очень признателен. 

Если ты не пишешь сам, то признательность на этом сайте выражают в разделе "Ищу исполнителя".

Radioamater
Offline
Зарегистрирован: 06.06.2019

Ну лично пишу в ардуино среде что то простое. типо лампочкой помигать. Шим сгенерировать. Не более того. Лично мне не очень понятно в наведении марафета в коде что по ссылке....куда там что выводить и какие библиотеки подключать

Radioamater
Offline
Зарегистрирован: 06.06.2019

Я думаю это задачка не очень сложная для опытных спецов. Прощу помощи. 

nik182
Offline
Зарегистрирован: 04.05.2015

По ссылке полный проект измерения скважности. Как раз для 60 кГц. Средствами ардуины можно измерить только с точностью 4 мкс. Для 60кГц это будет около ± 30%.  Если ардуиной то 2 раза вызов pulseIn с параметрами LOW & HIGH. 

Radioamater
Offline
Зарегистрирован: 06.06.2019

А можно готовый скетч под ардуино уно? 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Radioamater пишет:

А можно готовый скетч под ардуино уно? 

У меня в холодильнике есть продукты, но если я не умею, или не хочу готовить, я заказываю пиццу.

Да, твоя задача - проста, но 1000 р.  - вполне накормят какого-нибудь студента дошираком и пивом на неделю.

Так что иди в "Ищу исполнителя" и принеси пользу. ;)))

nik182
Offline
Зарегистрирован: 04.05.2015
int pin = 7;
unsigned long duration,tau,s;
void setup()
{
  pinMode(pin, INPUT);
}
void loop()
{
  duration = pulseInLong(pin, HIGH);
  tau = pulseIn(pin, HIGH);
  s = duration*100/tau;
}

 

Radioamater
Offline
Зарегистрирован: 06.06.2019

не работает. 

gena321
Offline
Зарегистрирован: 19.01.2019

числа на ЛСД зависят от ширины импульсов подаваемых на пин 13, использовал на 15 кгц должен работать и на 60.

lcd.print(angle_max);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int pin = 13;
float rads = 57.29577951; // 1 radian = approx 57 deg.
float degree = 360;
float frequency = 50;
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;

void setup()
{
 pinMode(pin, INPUT);
 Serial.begin(9600);
 lcd.begin(16, 2);
}

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,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;
}

 

SLKH
Offline
Зарегистрирован: 17.08.2015

Radioamater пишет:

не работает. 

Проверь программу и исправь ошибку.

Radioamater
Offline
Зарегистрирован: 06.06.2019

А можно чтобы в порт просто выдавалось число с значением скважности? 

gena321
Offline
Зарегистрирован: 19.01.2019
Serial.print(angle_max, 2); // Print the result

180 градусов = 50%скважность, вместо 50 герц 60 к герц = 60000

 

nik182
Offline
Зарегистрирован: 04.05.2015

 А выдать в порт число s слабо? Дописать 3 строки с выдачей?

Radioamater
Offline
Зарегистрирован: 06.06.2019

Я записал. В порт вываливается что то типо IP адреса число. 

nik182
Offline
Зарегистрирован: 04.05.2015

А так ?

 duration = pulseIn(pin, LOW);
  tau = pulseIn(pin, HIGH);
  s = (duration + tau) * 100 / tau;
  Serial.print("D= ");
  Serial.print((duration+tau));
  Serial.print(" T= ");
  Serial.print(tau);
  Serial.print(" S= ");
  Serial.print(s);
  Serial.println(" ");

Хочу заметить, что скважность я умножаю на 100, что бы видеть два знака после запятой. Когда дотрагиваюсь пальцем до ноги 7 получаю честные 20мс период наводки и число 300 - скважность тройку, точно как на осцилографе. 

Radioamater
Offline
Зарегистрирован: 06.06.2019

Сейчас попробую. Дайте полный код который копировать. 

nik182
Offline
Зарегистрирован: 04.05.2015

А ключ от квартиры где деньги лежат не дать? Трудно это всё в loop засунуть? Дальше только в разделза деньги. Это не ко мне. 

Radioamater
Offline
Зарегистрирован: 06.06.2019

Добавил. Ругается: 

Radioamater
Offline
Зарегистрирован: 06.06.2019

а можно скважность выводить в процентах?

nik182
Offline
Зарегистрирован: 04.05.2015

Ты не туда засунул. Перечитай тему. Найди правильный скетч и засунь не дополнением, а вместо. Процентах выводят не скважность, а коэффиент заполнения, величину обратную скважности. Расчитывается сразу в процентах : D=  100 * tau / (duration + tau);

Radioamater
Offline
Зарегистрирован: 06.06.2019

Не пойму куда код этот пихать. Я вычистил луп, засунул новый код, всё равно ругается....((

nik182
Offline
Зарегистрирован: 04.05.2015

Вставь по правилам форума код на который ругается, только не картинку, не ней ничего не видно. Правила в первом посте песочницы.

Radioamater
Offline
Зарегистрирован: 06.06.2019
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int pin = 13;
float rads = 57.29577951; // 1 radian = approx 57 deg.
float degree = 360;
float frequency = 50;
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;

void setup()
{
 pinMode(pin, INPUT);
 Serial.begin(9600);
 lcd.begin(16, 2);
}

void loop()
{
  
duration = pulseIn(pin, LOW);
 tau = pulseIn(pin, HIGH);
 s = (duration + tau) * 100 / tau;
 Serial.print("D= ");
 Serial.print((duration+tau));
 Serial.print(" T= ");
 Serial.print(tau);
 Serial.print(" S= ");
 Serial.print(s);
 Serial.println(" ");
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Скетч конечно же не тот, но да ладно. Из #9 поста перенесите описание переменных. А вообще вы не понимаете что делаете. Учиться надо сначала.  На этом заканчиваю общение. 

Radioamater
Offline
Зарегистрирован: 06.06.2019
int pin = 7;
unsigned long duration,tau,s;
void setup()
{
  pinMode(pin, INPUT);
  Serial.begin(9600);

}
void loop()
{
  duration = pulseIn(pin, LOW);
 tau = pulseIn(pin, HIGH);
 s = (duration + tau) * 100 / tau;
 Serial.print("D= ");
 Serial.print((duration+tau));
 Serial.print(" T= ");
 Serial.print(tau);
 Serial.print(" S= ");
 Serial.print(s);
 Serial.println(" ");
}

 

Radioamater
Offline
Зарегистрирован: 06.06.2019

Так? 

Radioamater
Offline
Зарегистрирован: 06.06.2019

Вроде заработало.

 

 

 

С ригола дал 100гц длительность импульса 1,5мс. Показания сходятся. 

Radioamater
Offline
Зарегистрирован: 06.06.2019

Сенкью вери мач друзья! 

Radioamater
Offline
Зарегистрирован: 06.06.2019

А можно сделать чтобы заполнение выводилось с одним знаком после запятой? 

b707
Offline
Зарегистрирован: 26.05.2017

дискуссия - великолепный пример наглости халявщика.

Всю душу вынет, лишь бы самому и пальцем не пошевелить...

Radioamater
Offline
Зарегистрирован: 06.06.2019

И ещё усреднение бы сделать. 

qbit
Offline
Зарегистрирован: 18.03.2019

Radioamater пишет:

И ещё усреднение бы сделать. 

Отбравь свою благодарность (размер не так важен) на баланс телефона подсказавшему. Один раз помогли, но халява не безгранична...

 

Radioamater
Offline
Зарегистрирован: 06.06.2019

Форум же. Для того он и нужен. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Где таким мантрам учат?

qbit
Offline
Зарегистрирован: 18.03.2019

Radioamater пишет:

Форум же. Для того он и нужен. 

Все правильно, тогда пальцы не загибай - "надо ещё". Тогда мозг включай и начни писать сам.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Дайте водички попить, а то так есть хочется, что переночевать негде )))

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

дискуссия - великолепный пример наглости халявщика.

Всю душу вынет, лишь бы самому и пальцем не пошевелить...

Так не послали куда следует после #4 и #5 - теперь кушайте, не обляпайтесь.

Radioamater
Offline
Зарегистрирован: 06.06.2019

Давайте карточки куда деньги переводить. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Radioamater пишет:

Так? 

не, скорость на порту надо ставить максимально возможную

Onkel
Offline
Зарегистрирован: 22.02.2016

Radioamater пишет:

Вроде заработало.

 

 

 

С ригола дал 100гц длительность импульса 1,5мс. Показания сходятся. 


Но тут 70 кHz  и не пахнет, 50 Hz.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Radioamater пишет:

Сенкью вери мач друзья! 

с тех пор, как появились денежные знаки, слово "спасибо" утратило своё первоначальное значение !