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

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

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

Вы наверо держите постоянным величину приращения а не число приращений.
Krik99
Тогда в этой строчки for(i=0; i<N; i++){PWM += delta; delay();} на сколько я понял переменная PWM должна тоже быть float, так как у меня char... но у меня массив на 8 float думаю что в Тини2313 не влезет...
Krik99
Есть вопрос, почему этот кусок кода не работает, когда я в условие бесконечного цикла пишу условие через ИЛИ. Вот код:
Код
do  {
                 i = (rand() & 0xFF);
                }
                while (i<10 || i>100);
                pwm_n[ch]=i;

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

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

По стандарту на язые Си это не нужно. (i>100) || (i<10) и i>100 || i<10 - одно и то же. Дело не в этом (если CVAVR в этой части соответствует стандарту).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.