реклама на сайте
подробности

 
 
> Случайные числа и плавный переход
Krik99
сообщение Feb 9 2013, 19:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-05-08
Из: Украина
Пользователь №: 37 411



Здравствуйте. Помогите с алгоритмом... собственно есть программный 8-ми канальный ШИМ, необходимо случайным образом вносить изменения в значения каждого из ШИМ каналов одновременно, но значения каждого канала полностью случайны, и к тому же нужно плавно переходить от предыдущего значения к новому. Пишу под CVAVR, помогите хотябы на пальцах с алгоритмом, а то нечего не приходит в голову( С одним каналом все норм, а вот когда их 8.... За ранние спасибо!


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
ARV
сообщение Feb 9 2013, 19:37
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



когда я делал свою лампу настроения, то для плавного перехода между цветами использовал алгоритм Брезенхама. думал, что компактней не придумешь - в тини13 влезло. однако, оказалось, что обычные целочисленные вычисления над long-ами тоже вмещается в тини13... в общем, алгоритм прост до безобразия, привожу в "неэкономном" варианте...
дано: U - текущий уровень канала (скважность ШИМа), u - уровень, к которому ШИМ-канал должен прийти "плавно".
решение:
1. вводим дополнительное условие: любые переходы между цветами должны делаться за N элементарных шагов.
2. вычисляем приращение уровня float delta = (u - U)/(float)N;
3. реализуем тупой цикл плавного перехода for(i=0; i<N; i++){PWM += delta; delay();}
если каналов несколько - храним соответствующие значения в массиве и в цикле планых переходов обрабатываем весь массив для всех каналов

как-то так вот...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Krik99
сообщение Feb 9 2013, 19:53
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-05-08
Из: Украина
Пользователь №: 37 411



Цитата
1. вводим дополнительное условие: любые переходы между цветами должны делаться за N элементарных шагов.
2. вычисляем приращение уровня float delta = (u - U)/(float)N;
3. реализуем тупой цикл плавного перехода for(i=0; i<N; i++){PWM += delta; delay();}
если каналов несколько - храним соответствующие значения в массиве и в цикле планых переходов обрабатываем весь массив для всех каналов

Я примерно так и делал, только вот проблема то в том что например один канал достигнет нового значения за 10 повторений цикла, а другой за 5, а третий и вовсе за 30... с этим у меня и возникла проблема( А мне то нужно чтобы они примерно одновременно изменяли значения... или Вы предлагаете реализовать подобные циклы для каждого канала?


--------------------
Go to the top of the page
 
+Quote Post
DVF
сообщение Feb 9 2013, 23:10
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 26-07-06
Из: Саратов
Пользователь №: 19 097



Тут как раз расчитывается приращение от N числа шагов. У Вас просто не может быть 10, 5, 30 и т.д.
Go to the top of the page
 
+Quote Post
vgo1
сообщение Feb 10 2013, 10:34
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 28-05-12
Пользователь №: 72 050



Цитата(Krik99 @ Feb 9 2013, 23:53) *
Я примерно так и делал, только вот проблема то в том что например один канал достигнет нового значения за 10 повторений цикла, а другой за 5, а третий и вовсе за 30... с этим у меня и возникла проблема( А мне то нужно чтобы они примерно одновременно изменяли значения... или Вы предлагаете реализовать подобные циклы для каждого канала?

Вы наверо держите постоянным величину приращения а не число приращений.
Go to the top of the page
 
+Quote Post
Krik99
сообщение Feb 10 2013, 19:53
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-05-08
Из: Украина
Пользователь №: 37 411



Тогда в этой строчки for(i=0; i<N; i++){PWM += delta; delay();} на сколько я понял переменная PWM должна тоже быть float, так как у меня char... но у меня массив на 8 float думаю что в Тини2313 не влезет...

Сообщение отредактировал Krik99 - Feb 10 2013, 22:18


--------------------
Go to the top of the page
 
+Quote Post
Krik99
сообщение Feb 17 2013, 20:23
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-05-08
Из: Украина
Пользователь №: 37 411



Есть вопрос, почему этот кусок кода не работает, когда я в условие бесконечного цикла пишу условие через ИЛИ. Вот код:
Код
do  {
                 i = (rand() & 0xFF);
                }
                while (i<10 || i>100);
                pwm_n[ch]=i;

В общем я хочу ограничить значения в приделах через цикл.. и когда пишу (i>100) то все норм, но как только добавляю i<10 все перестает работать.. Пишу в CVAVR. В чем проблема?


--------------------
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 18 2013, 11:34
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



я вам дал намеки, как сделать, чтобы "влезло" - потрудитесь посмотреть вторую ссылку, там есть код - в тини13 влезает. повторю: я шел другим путем и использовал алгоритм Брезенхама - оба подхода имеют цель уйти от float-ов


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Feb 23 2013, 20:18
Сообщение #9


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Krik99 @ Feb 17 2013, 20:23) *
В общем я хочу ограничить значения в приделах через цикл.. и когда пишу (i>100) то все норм, но как только добавляю i<10 все перестает работать.. Пишу в CVAVR. В чем проблема?

Операнды (i>100) и (i<10) возьмите в скобки, чтобы обеспечить надлежащие приоритеты.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
maksimp
сообщение Feb 24 2013, 16:47
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(=GM= @ Feb 23 2013, 23:18) *
Операнды (i>100) и (i<10) возьмите в скобки, чтобы обеспечить надлежащие приоритеты.

По стандарту на язые Си это не нужно. (i>100) || (i<10) и i>100 || i<10 - одно и то же. Дело не в этом (если CVAVR в этой части соответствует стандарту).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016