Как перевести содержимое переменной "float frequency 3" в частоту ТТL.

Сергей-2
Offline
Зарегистрирован: 30.03.2019

[code]
int TTL = 5;
int Htime; // целочисленная переменная для хранения времени высокого логического уровня
int Ltime; // целочисленная переменная для хранения времени низкого логического уровня
float Ttime; // переменная для хранения общей длительности периода
float frequency1; // переменная для хранения частоты 1
float frequency2; // переменная для хранения частоты 2
float frequency3; // переменная для хранения частоты 3

void setup()
{
Serial.begin(9600); // Установка последовательного соединения
pinMode ( 8, INPUT); // Вход № 8 на ввод частоты
digitalWrite(8, HIGH); // Включение подтягивающего резистора к +5 В
pinMode ( TTL, OUTPUT); // Выход № 5 выход частоты 51200 Гц
}
void loop()
{
Htime = pulseIn(8, HIGH); // прочитать время высокого логического уровня
Ltime = pulseIn(8, LOW); // прочитать время низкого логического уровня
Ttime = Htime + Ltime;

frequency1 = 1000000 / Ttime; // получение частоты из Ttime в микросекундах
Serial.println(frequency1);
frequency2 = 51200 - frequency1; //разница частот 51200 Гц и замеренной
Serial.println(frequency2);
frequency3 = frequency2 + frequency1;
Serial.println(frequency3);
delay(1000);
}

bwn
Offline
Зарегистрирован: 25.08.2014

Уважаемый, загляните в начало головной темы и вставьте код нормально.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И, заодно, объясните в чём Ваша проблема, а то хрустальные шары здесь запрещены.

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

Судя по программе у TTL нет частоты. Совсем нет. Как переводить в то чего нет? 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Во первых - перевести время в unsigned long, а во вторых - рассказать, а чего Вы хотите. Должно быть и третье, но хватит и этого.

А - вспомнил, помой руки и вставь программу правильно!

Сергей-2
Offline
Зарегистрирован: 30.03.2019

Частоту которая получена как сумма двух частот нужна для работы остальной части схемы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сергей-2 пишет:

Частоту которая получена как сумма двух частот нужна для работы остальной части схемы.

Или Вы

1) вставляете код как положено
2) толково и понятно объясняете чего, Вам нужно.

Или никакой помощи Вы здесь не получите.

Никто не понимает какая именно помощь Вам нужна, а неправильно вставленный код никто читать не будет.

Сергей-2
Offline
Зарегистрирован: 30.03.2019

Частоту которая получена как сумма двух частот нужна для работы остальной части схемы.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Яснее не стало. 

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

мой хрустальный шар говорит, что Серёжа пытается впихнуть не впихуемое, float  в int знаковое, а вообще скетч безсмысленный, в третьей переменной всегда будет 51200 )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно. Ну, тогда, извините.

Сергей-2
Offline
Зарегистрирован: 30.03.2019

http://forum.cxem.net/index.php?/profile/54570-mahno/content/&type=forums_topic_post&page=408                          Это принципиальная схема радиочасов "VITEK-3511" с LED индикатором на микросхеме LM 8580. Кварцевый резонатор в часах  51200 Гц очень нестабилен по частоте взависимости от температуры. При повышении температуры на 10 гр С часы "спешат" на 30-35 секунд в сутки, при понижении "отстают" на столько же.     Замена резонатора не привела к увеличению точности хода часов.                                                                     В наличии имеются часы реального времени DS 3231 с точностью хода 5 секунд в год.                                         В наличии Arduino PRO Mini 5V 16 MHz. Есть схема и программа с корректировкой часов по GPS, c библиотеками которая компилируется и загружается в МК.                                                                                                           Пока идёт из Китая заказанная по этой схеме электронная комплектация:                   https://mysku.ru/blog/diy/58750.html  решил термокомпенсированные RTC с выходом 32768 Гц через МК Arduino подключить на место КР =51200 Гц.

 То,что купил в Китае и нашёл Интернете работает, а дальше моя лабораторная работа приобрела форму вопросов и ответов на форуме, так как все мои знакомые не сильны, так же как ия, в С++.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Сергей-2 пишет:

Частоту которая получена как сумма двух частот нужна для работы остальной части схемы.

Ну так это просто:

fсум = f1 + f2

Надеюсь, что удовлетворил Вашу тягу к знаниям.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Сергей-2 пишет:
... а дальше моя лабораторная работа приобрела форму вопросов и ответов на форуме, так как все мои знакомые не сильны, так же как ия, в С++.

Лабораторная - это правильно.

А еще правильнее будет - начинать не с С++, а с русского: попытайтесь сформулировать свои мысли так, чтобы они были понятны хотя бы одному человеку кроме Вас.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

andriano пишет:
попытайтесь сформулировать свои мысли ...
И код, наконец, вставить нормально.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ворота пишет:

andriano пишет:
попытайтесь сформулировать свои мысли ...
И код, наконец, вставить нормально.

IMHO пока мыслей нет, код вставлять преждевременно.

Сергей-2
Offline
Зарегистрирован: 30.03.2019

Вы правы, но RTC всётаки имеет температурную компенсацию, а МК этой компенсации не имеет т.е. зачем тогда весь этот огород если не вырастет точность отсчёта времени?

Сергей-2
Offline
Зарегистрирован: 30.03.2019

Золотые слова!!

Сергей-2
Offline
Зарегистрирован: 30.03.2019
 
/*Попытка увеличения точности отсчёта времени электронных часов с кварцевой стабилизацией за счёт применения 
 * термостабилизированных часов реального времени (RTS) DS 3231.
 * Получение частоты 51200Гц, равной частоте кварцевого резонатора (КР),  програмным методом, не приведёт к 
 * увеличению точности: так как КГ = 16000 МГц на микроконтроллере Arduino не термостабилен.
 */
#include <LiquidCrystal.h>
int TTL = 5;                            //выход термостабильной частоты f = 51200 Гц для последующго подключения вместо КР
int Htime;                              // целочисленная переменная для хранения времени высокого логического уровня
int Ltime;                              // целочисленная переменная для хранения времени низкого логического уровня
float Ttime;                            // переменная для хранения общей длительности периода
float frequency1;                       // переменная для хранения частоты 1
float frequency2;                       // переменная для хранения частоты 2
float frequency3;                        // переменная для хранения частоты 3
 
void setup()
{
  Serial.begin(9600);                   // Установка последовательного соединения
  pinMode ( 8, INPUT);                  // Вход № 8 на ввод частоты 
   digitalWrite(8, HIGH);                // Включение подтягивающего резистора к +5 В
   pinMode ( TTL, OUTPUT);               // Выход № 5  выход частоты 51200 Гц
}
void loop()
{
  Htime = pulseIn(8, HIGH);                // прочитать время высокого логического уровня
  Ltime = pulseIn(8, LOW);                // прочитать время низкого логического уровня
  Ttime = Htime + Ltime;
 
  frequency1 = 1000000 / Ttime; // получение частоты из Ttime в микросекундах
  Serial.println(frequency1);
  frequency2 = 51200 - frequency1; //разница частот 51200 Гц и замеренной
  Serial.println(frequency2);
  frequency3 = frequency2 + frequency1;
  Serial.println(frequency3);
  delay(1000);
}
 
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Сергей-2 пишет:

 
/*Попытка увеличения точности отсчёта времени электронных часов с кварцевой стабилизацией за счёт применения 
 * термостабилизированных часов реального времени (RTS) DS 3231.
 * Получение частоты 51200Гц, равной частоте кварцевого резонатора (КР),  програмным методом, не приведёт к 
 * увеличению точности: так как КГ = 16000 МГц на микроконтроллере Arduino не термостабилен.
 */
#include <LiquidCrystal.h>
int TTL = 5;                            //выход термостабильной частоты f = 51200 Гц для последующго подключения вместо КР
int Htime;                              // целочисленная переменная для хранения времени высокого логического уровня
int Ltime;                              // целочисленная переменная для хранения времени низкого логического уровня
float Ttime;                            // переменная для хранения общей длительности периода
float frequency1;                       // переменная для хранения частоты 1
float frequency2;                       // переменная для хранения частоты 2
float frequency3;                        // переменная для хранения частоты 3
 
void setup()
{
  Serial.begin(9600);                   // Установка последовательного соединения
  pinMode ( 8, INPUT);                  // Вход № 8 на ввод частоты 
   digitalWrite(8, HIGH);                // Включение подтягивающего резистора к +5 В
   pinMode ( TTL, OUTPUT);               // Выход № 5  выход частоты 51200 Гц
}
void loop()
{
  Htime = pulseIn(8, HIGH);                // прочитать время высокого логического уровня
  Ltime = pulseIn(8, LOW);                // прочитать время низкого логического уровня
  Ttime = Htime + Ltime;
 
  frequency1 = 1000000 / Ttime; // получение частоты из Ttime в микросекундах
  Serial.println(frequency1);
  frequency2 = 51200 - frequency1; //разница частот 51200 Гц и замеренной
  Serial.println(frequency2);
  frequency3 = frequency2 + frequency1;
  Serial.println(frequency3);
  delay(1000);
}
 

Сергей, бросайте институт и идите в грузчики - ну не Ваше это... Вы даже программу со 2 раза правильно вставить не можете.

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

mykaida пишет:

Сергей, бросайте институт и идите в грузчики - ну не Ваше это... Вы даже программу со 2 раза правильно вставить не можете.

по стилю изложения даже на бурсу не тянет, а Вы институт...

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

Я утром еще не имею сил  на глум и издевательства, поэтому просто приведу несколько фактов:

>>> 1000000.0/51200
19.53125
это мкс на период
>>> 1000000/20
50000
измеряет ардуина с точностью 4 мкс то есть пулсин даст 16 или 20
скорее 16, как 8 хай и 8 лоу ;))

>>> 1000000.0/51200/0.0625
312.5   тиков таймера
это если измерять таймером 16МГц, там т=62,5 нс
>>> 1000000.0/312/0.0625
51282.05128205128
такую частоту получим от ардуино
>>> 1000000.0/313/0.0625
51118.21086261981
или такую
>>> 51200-1000000.0/313/0.0625
81.78913738019037
>>> 51200-1000000.0/312/0.0625
-82.0512820512813
>>> 
>>> "Ок, примерно 80 Гц разницы, сколько же это секунд за сутки?"
>>> 86400*80.0/51200
135.0
>>> Примерно две минуты

ВСЁ, МЛЯ, ЯСНО???????

 

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

Results for frequency: 51200.00Hz
Prescaler: 1; MaxValue: 155; Frequency: 51282.05Hz; Diff: 82.05Hz
Prescaler: 8; MaxValue: 19; Frequency: 50000.00Hz; Diff: 1200.00Hz
Prescaler: 64; MaxValue: 1; Frequency: 62500.00Hz; Diff: 11300.00Hz
Prescaler: 256; MaxValue: 0; Frequency: 31250.00Hz; Diff: 19950.00Hz
Prescaler: 1024 - Not possible
 

Datak
Offline
Зарегистрирован: 09.10.2014
Сергей-2,
я бы, для начала, попробовал всё упростить до предела. Заработает - можно радоваться, ну а если уж нет - тогда только начинать думать.
 
Задача ведь простая - на каждые 32768 образцовых входных импульсов выдать ответные 51200 выходных. То есть, посчитать импульсы, и всё. Никаких точных измерений и сложных вычислений.
 
Чтобы не запутаться в больших цифрах, можно их подсократить - получится 25 выходных импульсов на каждые 16 входных.
 
Ну и примерно такой скетч:
uint16_t CntIn  = 0;
uint16_t CntOut = 0;

int PrevInput  = 0;
int PrevOutput = 0;

void setup( )
{
  // Здесь настроить пины, как обычно
  // .........
  // .........
}

void loop( )
{
  // Посчитать входные импульсы... 
  // 
  if( digitalRead( INPUT_PIN ) != PrevInput )
  {
    PrevInput = !PrevInput;

    if( ++CntIn == 16 )
    {
      CntIn = 0;

      CntOut += 25;
    }
  }

  // ...и выдать выходные
  //
  if( CntOut != 0 )
  {
    PrevOutput = !PrevOutput;

    digitalWrite( OUTPUT_PIN, PrevOutput );

    CntOut--;
  }
}

Скетч, конечно, только для чтения и понимания. Работать скорей всего не будет - digitalRead и digitalWrite для таких частот всё-таки слишком медленные.

Но если заменить их на прямое чтение/запись портов, вполне может получиться. Ничего не обещаю, но может.

Сергей-2
Offline
Зарегистрирован: 30.03.2019

Спасибо, вечером попробую.