Последовательность чисел
- Войдите на сайт для отправки комментариев
Ср, 20/03/2019 - 08:45
Прошу помочь старому новичку. Мне нужно получить периодически повторяющуюся последовательность чисел на пине. Я сделал так:
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 утра промудрил, но...никак не соображу. Выручайте советом.
Уточните для начала - какой характер у последовательности ожидается (форма графика)? Синус в формуле случайно или нет?
И расшифруйте пожалуйста, что значит "число на пине". ШИМ?
byte(203+(53*sin(PI*i*0.007843)));
Так?
Уточните для начала - какой характер у последовательности ожидается (форма графика)? Синус в формуле случайно или нет?
byte(203+(53*sin(PI*i*0.007843)));
Так?
Ну как же? В скобках перед синусом минимум - 53. 203 - 53 =150. Откуда единица?
kriss, а что за число у Вас в функции: 0.007843?
Общая формула синусоиды:
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).
Ну как же? В скобках перед синусом минимум - 53. 203 - 53 =150. Откуда единица?
Еще раз спасибо всем, кто откликнулся!
Я понимаю, что Вам нужен такой график. Тогда так:
Y=127+127*SIN(2*Pi*X/256)
0-360 --> 0-256, а не 255
2/255 = 0,007843
2/256 = 0,0078125
Проверяйте такие формулы в EXCEL.
Я понимаю, что Вам нужен такой график. Тогда так:
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 как раз подошел. буду дальше мудрить.
nik182 Не могли бы Вы пояснить как вычислили этот результат. Я пользовался "тыком" и у меня не получалось плавности счета
203+53=256, 203-53=150?
kriss, Вы запутали своим первым постом, где одновременно 127 и 150-256.
Берем максимальное и минимальное значения, складываем и делим пополам - это перенос оси. Вычитаем и делим пополам - это амплитуда. В Вашем случае (где 150-256) будет так:
(256+150)/2=203 - это перенос оси
(256-150)/2=53 - это амплитуда
Или я уже не знаю что же Вам нужно.
Совершенно согласен с предыдущим оратором. Именно так и вычислял коэффициенты формулы.
просто у меня нет экселя (раньше был весь офис), чтобы визуализировать результы графиком, поэтому "тыкал " произвольно. А формулу взял стандартную. при этом мой примитивный осциллограф плохо работает в динамике. Контролировал на слух, введя к-т умножения. Поэтому запутался сам и попросил помощи. Спасибо еще раз!
Прошу помочь старому новичку. Мне нужно получить периодически повторяющуюся последовательность чисел на пине. Я сделал так:
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 утра промудрил, но...никак не соображу. Выручайте советом.
Уважаемый, если Вам реально надо получить синусоиду, то лучше сами разложите ее в ряд Тейлора с достаточной для Вас точностью ( несложно). Синус си достаточно неадекватная функция - не фортран все-таки...