Измерение скважности сигнала
- Войдите на сайт для отправки комментариев
Чт, 06/06/2019 - 11:06
Добрый день!
Прошу помощи в написании скетча либо в поиске готового проекта. Нужно измерять скважность сигнала частотой 60-70кгц с точностью +-10%. Подали сигнал, на LCD или в монитор порта выдало значение скважности. Если кто сможет помочь буду очень признателен.
https://embedds.com/programming-16-bit-timer-on-atmega328/
Благодарю за ссылку. Но а готового нет ни чего? Я в ардуино не очень соображаю. А измерять надо. Буду очень благодарен если эта операция будет в готовом скетче.
буду очень признателен.
Если ты не пишешь сам, то признательность на этом сайте выражают в разделе "Ищу исполнителя".
Ну лично пишу в ардуино среде что то простое. типо лампочкой помигать. Шим сгенерировать. Не более того. Лично мне не очень понятно в наведении марафета в коде что по ссылке....куда там что выводить и какие библиотеки подключать
Я думаю это задачка не очень сложная для опытных спецов. Прощу помощи.
По ссылке полный проект измерения скважности. Как раз для 60 кГц. Средствами ардуины можно измерить только с точностью 4 мкс. Для 60кГц это будет около ± 30%. Если ардуиной то 2 раза вызов pulseIn с параметрами LOW & HIGH.
А можно готовый скетч под ардуино уно?
А можно готовый скетч под ардуино уно?
У меня в холодильнике есть продукты, но если я не умею, или не хочу готовить, я заказываю пиццу.
Да, твоя задача - проста, но 1000 р. - вполне накормят какого-нибудь студента дошираком и пивом на неделю.
Так что иди в "Ищу исполнителя" и принеси пользу. ;)))
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; }не работает.
числа на ЛСД зависят от ширины импульсов подаваемых на пин 13, использовал на 15 кгц должен работать и на 60.
#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; }не работает.
А можно чтобы в порт просто выдавалось число с значением скважности?
180 градусов = 50%скважность, вместо 50 герц 60 к герц = 60000
А выдать в порт число s слабо? Дописать 3 строки с выдачей?
Я записал. В порт вываливается что то типо IP адреса число.
А так ?
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 - скважность тройку, точно как на осцилографе.
Сейчас попробую. Дайте полный код который копировать.
А ключ от квартиры где деньги лежат не дать? Трудно это всё в loop засунуть? Дальше только в разделза деньги. Это не ко мне.
Добавил. Ругается:
а можно скважность выводить в процентах?
Ты не туда засунул. Перечитай тему. Найди правильный скетч и засунь не дополнением, а вместо. Процентах выводят не скважность, а коэффиент заполнения, величину обратную скважности. Расчитывается сразу в процентах : D= 100 * tau / (duration + tau);
Не пойму куда код этот пихать. Я вычистил луп, засунул новый код, всё равно ругается....((
Вставь по правилам форума код на который ругается, только не картинку, не ней ничего не видно. Правила в первом посте песочницы.
#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(" "); }Скетч конечно же не тот, но да ладно. Из #9 поста перенесите описание переменных. А вообще вы не понимаете что делаете. Учиться надо сначала. На этом заканчиваю общение.
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(" "); }Так?
Вроде заработало.
С ригола дал 100гц длительность импульса 1,5мс. Показания сходятся.
Сенкью вери мач друзья!
А можно сделать чтобы заполнение выводилось с одним знаком после запятой?
дискуссия - великолепный пример наглости халявщика.
Всю душу вынет, лишь бы самому и пальцем не пошевелить...
И ещё усреднение бы сделать.
И ещё усреднение бы сделать.
Отбравь свою благодарность (размер не так важен) на баланс телефона подсказавшему. Один раз помогли, но халява не безгранична...
Форум же. Для того он и нужен.
Где таким мантрам учат?
Форум же. Для того он и нужен.
Все правильно, тогда пальцы не загибай - "надо ещё". Тогда мозг включай и начни писать сам.
Дайте водички попить, а то так есть хочется, что переночевать негде )))
дискуссия - великолепный пример наглости халявщика.
Всю душу вынет, лишь бы самому и пальцем не пошевелить...
Давайте карточки куда деньги переводить.
Так?
не, скорость на порту надо ставить максимально возможную
Вроде заработало.
С ригола дал 100гц длительность импульса 1,5мс. Показания сходятся.
Но тут 70 кHz и не пахнет, 50 Hz.
Сенкью вери мач друзья!
с тех пор, как появились денежные знаки, слово "спасибо" утратило своё первоначальное значение !