Последовательность чисел

kriss
Offline
Зарегистрирован: 24.01.2014

Прошу помочь старому новичку.     Мне нужно получить    периодически повторяющуюся последовательность чисел на   пине.   Я сделал так:

    for (int i=0;i<256;i++) {

  f= byte(127+(127*sin(PI*i*0.007843)));       Serial.println(f ); 

и получил  гармонический ряд чисел от 0 до 256, однако мне нужна  только их часть  в пределах  150-256-150-256, а  не 0-256-0-256 .

Пытался изменить направление счета при достижении 150 - никак..Весь вечер  и с 5 утра промудрил, но...никак не соображу. Выручайте советом.

 

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

Уточните для начала - какой характер у последовательности ожидается (форма графика)? Синус в формуле случайно или нет?

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

И расшифруйте пожалуйста, что значит "число на пине". ШИМ?

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

byte(203+(53*sin(PI*i*0.007843)));

Так? 

kriss
Offline
Зарегистрирован: 24.01.2014

sadman41 пишет:

Уточните для начала - какой характер у последовательности ожидается (форма графика)? Синус в формуле случайно или нет?

   Синусоида на экране  осиллографа -очень плавная линия.  И   мне хочется  получить   возрастающую и уменьшающуюся частоту колебаний, подобно девиациии.   Другой плавной зависимости не знаю.   шаг изменения  мне некритичен- главное чтобы ардуино  уно смогла это обрабатывать.  Мне еще нужно будет  иметь возможность регулировать период.  Эту последовательность я потом преобразую в  звуковые колебания   c  tone(pin,f);

kriss
Offline
Зарегистрирован: 24.01.2014

nik182 пишет:

byte(203+(53*sin(PI*i*0.007843)));

Так? 

  Нет, все остается от 1 до 250

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

Ну как же? В скобках перед синусом минимум - 53. 203 - 53 =150. Откуда единица? 

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

kriss, а что за число у Вас в функции: 0.007843?

Rostislav_lv
Offline
Зарегистрирован: 12.02.2019

 

Общая формула синусоиды:

Y=a+b*SIN(c*X)

Синусоида стартует со значением 127 (для ЦАП) и заканчивается этим значением. Для этого, вводим значение смещения по оси У а=127. a характеризует сдвиг графика по оси У. Чем больше a, тем выше поднимается график.

Значение синуса может меняться от -1 до 1 . Чтобы растянуть график по вертикали, вводим второе значение b, характеризующее растяжение графика по оси У. Чем больше увеличивается b, тем сильнее возрастает амплитуда колебаний; Ну, тут тоже понятно, что при максимальном значении в (254-127) b=127 характеризует растяжение графика по оси X.

Длина периода =2*Pi. Мы условились, что этот период мы делим на 255 «шагов». Т.е., 255-ый шаг должен иметь значение 2*Pi. Для нашего случая С=2*Pi*(1/255) или 2*Pi*0.0392 или Pi*0.007843

Окончательно получаем следующую формулу расчета: Y=127+127*SIN(Pi*X*0.007843).

kriss
Offline
Зарегистрирован: 24.01.2014

nik182 пишет:

Ну как же? В скобках перед синусом минимум - 53. 203 - 53 =150. Откуда единица? 

Виноват,  поспешил перед выходом, загрузил не тот  вариант. ( много было окон)  Спасибо, все ок!

kriss
Offline
Зарегистрирован: 24.01.2014

Еще раз спасибо всем, кто откликнулся!

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

Я понимаю, что Вам нужен такой график. Тогда так:

Y=127+127*SIN(2*Pi*X/256)

0-360 --> 0-256, а не 255

2/255 = 0,007843

2/256 = 0,0078125

Проверяйте такие формулы в EXCEL. 

kriss
Offline
Зарегистрирован: 24.01.2014

AlexanderNO пишет:

Я понимаю, что Вам нужен такой график. Тогда так:

Y=127+127*SIN(2*Pi*X/256)

0-360 --> 0-256, а не 255

2/255 = 0,007843

2/256 = 0,0078125

Проверяйте такие формулы в EXCEL. 

Спасибо.   мне  ведь нужны    пределы   150-250,  а точность шага неважна -вариант   nik182  как раз подошел.  буду дальше мудрить.

 

kriss
Offline
Зарегистрирован: 24.01.2014

nik182              Не могли бы Вы пояснить как вычислили этот результат. Я пользовался "тыком" и у меня  не получалось плавности счета

203+53=256, 203-53=150? 

 

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

kriss, Вы запутали своим первым постом, где одновременно 127 и 150-256.

Берем максимальное и минимальное значения, складываем и делим пополам - это перенос оси. Вычитаем и делим пополам - это амплитуда. В Вашем случае (где 150-256) будет так:

(256+150)/2=203 - это перенос оси

(256-150)/2=53 - это амплитуда

Или я уже не знаю что же Вам нужно.

 

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

Совершенно согласен с предыдущим оратором. Именно так и вычислял коэффициенты формулы. 

kriss
Offline
Зарегистрирован: 24.01.2014

       просто у меня нет  экселя (раньше  был весь офис),  чтобы визуализировать  результы графиком, поэтому "тыкал " произвольно.  А  формулу взял стандартную.  при этом мой примитивный  осциллограф  плохо  работает в динамике. Контролировал на слух, введя к-т умножения. Поэтому запутался сам  и попросил помощи. Спасибо еще раз!

 

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

kriss пишет:

Прошу помочь старому новичку.     Мне нужно получить    периодически повторяющуюся последовательность чисел на   пине.   Я сделал так:

    for (int i=0;i<256;i++) {

  f= byte(127+(127*sin(PI*i*0.007843)));       Serial.println(f ); 

и получил  гармонический ряд чисел от 0 до 256, однако мне нужна  только их часть  в пределах  150-256-150-256, а  не 0-256-0-256 .

Пытался изменить направление счета при достижении 150 - никак..Весь вечер  и с 5 утра промудрил, но...никак не соображу. Выручайте советом.

 

Уважаемый, если Вам реально надо получить синусоиду, то лучше сами разложите ее в ряд Тейлора с достаточной для Вас точностью ( несложно). Синус си достаточно неадекватная функция - не фортран все-таки...