Тема: Цветомузыка

Ответить в теме
Показано с 1 по 11 из 11
  1. Вверх #1
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одеса
    Возраст
    46
    Сообщений
    32,165
    Репутация
    14490

    По умолчанию Цветомузыка

    Делаю цветомузыку как описано тут - http://www.microsyl.com/index.php/2010/03/29/mood-light/
    Только шо-то я никак понять не могу как оно работает. С аналоговой частью понятно - это просто фильтры, а также отдельный детектор уровня сигнала дабы быть независимым от громкости. Но вот шо в цифре потом происходит я понять не могу:
    Код:
    if (AGC < 85)
    	{
    		CapBass =   (int)(Bass + (9 * CapBass)) / 10;
    		CapMiddle = (int)(Middle + (9 * CapMiddle)) / 10;
    		CapTreble = (int)(Treble + (9 * CapTreble)) / 10;
    
    		if (Bass > (CapBass + 10)) RealRed = 255;
    		else RealRed =  0;
    
    		if (Middle > (CapMiddle + 10)) RealGreen = 255;
    		else RealGreen =  0;
    
    		if (Treble > (CapTreble + 10)) RealBlue = 255;
    		else RealBlue =  0;
    	}
    
    	else
    	{
    		RealRed =  0;
    		RealGreen =  0;
    		RealBlue =  0;
    	}
    Если на классическую цветомузыку подать например сигнал частотой 200 Гц, то будет гореть красная лампочка с яркостью пропорциональной уровню сигнала. Тут же лампочка либо горит, либо не горит, причем при высоком уровне AGC они просто тухнут. Если же на эту схему подать сигнал определенной частоты, то к примеру красная лампочка включится и погаснет, если сигнал будет продолжаться. Кто-то может объяснить идею как оно работает? Насколько я понял, оно мигает не на уровень сигнала а на его изменение, но почему при высоком уровне AGC лампочки тухнут?


  2. Вверх #2
    Новичок Аватар для DiMomite
    Пол
    Мужской
    Сообщений
    61
    Репутация
    18
    CapBass = (int)(Bass + (9 * CapBass)) / 10;
    Это фильтрация от быстрых скачков значений. Надо переписать на период 8 или 16, тогда можно будет уйти от деления на 10.
    Я просмотрел код, судя по всему плавная регулировка есть только в режиме Manual и Random. Тут только 0 или 255.

    Кроме того заметил немало недостатков в коде:
    - программный ШИМ тоже написан очень ресурсоемко, для МК используют совсем другое решение.
    - не заметил фильтрации дребезга в обработчике клавиатуры
    - нет фильтрации значений, который приходят с АЦП. В схеме есть реостаты, которые обладают пренеприятнейшим свойством "отваливания" ползунка при его перемещении. Что в данной схеме будет подвешивать входной пин на воздух. А значит в процессе перемещения ползунка контроллер будет ловить шум.
    - применяется тип int. Его размер строго не определен стандартом. Для встраеваемых систем его применение - признак очень дурного тона
    - переменные, отвечающие за каналы ШИМ - ushort Red, Green, Blue; должны изменяться атомарно. То есть по всему коду их нужно обрамить "мютексом" в виде пары cli()-sei()

    Мое мнение - код очень грязный. Если у тебя нет цели повторить проект, а хочешь получить цветомузыку - перепиши, выкинув все ненужное.

  3. Вверх #3
    User banned
    Пол
    Мужской
    Сообщений
    238
    Репутация
    179
    Цитата Сообщение от DiMomite Посмотреть сообщение
    Это фильтрация от быстрых скачков значений.
    мне тоже подумалось об этом.. в аналогоой части нет компрессора, но так как я в прграмной части ламер то нестал предпологать..)

  4. Вверх #4
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одеса
    Возраст
    46
    Сообщений
    32,165
    Репутация
    14490
    Цитата Сообщение от DiMomite Посмотреть сообщение
    Если у тебя нет цели повторить проект, а хочешь получить цветомузыку - перепиши, выкинув все ненужное.
    Ну собственно пока только метод colororgan я и портировал на другой проц. Даже работает Остальное может допишу, а может и нет.
    Что касается ресурсоемкого шима - мк всеавно нечем заниматься, а аппаратных тупо не хватит.

  5. Вверх #5
    Новичок Аватар для DiMomite
    Пол
    Мужской
    Сообщений
    61
    Репутация
    18
    Цитата Сообщение от maxx™ Посмотреть сообщение
    Ну собственно пока только метод colororgan я и портировал на другой проц. Даже работает Остальное может допишу, а может и нет.
    Что касается ресурсоемкого шима - мк всеавно нечем заниматься, а аппаратных тупо не хватит.
    Для правильного ШИМ нужно обработать всего 8 прерываний (для 8-ми битного ШИМ, естественно). Против 256 "в лоб" - хороший выигрыш. Кроме того, там в системе другие прерывания бегают. Они будут мешать друг-другу и смещать время обработки прерывания ШИМ. Если другие прерывания считают работают очень долго, то можно даже потерять несколько периодов. А у правильного есть один очень длинный интервал, который равен 128 циклам обычного ШИМ. В него можно перенести все ресурсоемкие операции. Не настаиваю, просто FYI.

  6. Вверх #6
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одеса
    Возраст
    46
    Сообщений
    32,165
    Репутация
    14490
    Цитата Сообщение от DiMomite Посмотреть сообщение
    Для правильного ШИМ нужно обработать всего 8 прерываний (для 8-ми битного ШИМ, естественно).
    Объясни или покажи готовый пример, что-то я не понял.

  7. Вверх #7
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одеса
    Возраст
    46
    Сообщений
    32,165
    Репутация
    14490
    Если кому интересно, работает оно как-то так - https://www.facebook.com/video.php?v=751646991587446&l=3899539424405317502

  8. Вверх #8
    Новичок Аватар для DiMomite
    Пол
    Мужской
    Сообщений
    61
    Репутация
    18
    Цитата Сообщение от maxx™ Посмотреть сообщение
    Объясни или покажи готовый пример, что-то я не понял.
    Пусть для простоты у нас будет период ШИМ 1мс 8 бит
    При простом подходе мы будем обрабатывать 256 прерываний на период ШИМ. Каждый раз инкрементировать счетчик и сравнивать новое значение с пороговыми для каждого канала.
    При более эффективном период ШИМ делается переменным с кратностью 2: 1мс, 1мс, 2мс, 4мс, 8мс, 16мс, 32 мс, 64мс, 128мс. В сумме 256мс.
    В прерывании меняется не счетчик, а битовая маска (как то так mask <<= 1;) и пороговые значения по каналам не сравниваются, а на них накладывается маска. Примерно так:
    if (valueA & mask) {
    setChannelA();
    } else {
    clearChannelA();
    }


    Также этот подход дает небольшое "отбеливание" сигнала ШИМ, потому что активные состояние идут не с самого начала периода и до порога, а немного распределяются во времени. К сожалению, он не применим в случаях, когда нужно получить цельный импульс, например, для управления сервомашинками. Но для светодиодов это отбеливание даже "плюс".

    Можно сделать еще одну оптимизацию: маски для всех каналов просчитать заранее, а в прерываниях только их накладывать. Только надо 2 набора масок: на выключение и на включение (одна на порт применять по И, вторую по ИЛИ).

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

  9. Вверх #9
    Посетитель Аватар для kiri4
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    37
    Сообщений
    242
    Репутация
    153
    Цитата Сообщение от DiMomite Посмотреть сообщение
    При более эффективном период ШИМ делается переменным с кратностью 2: 1мс, 1мс, 2мс, 4мс, 8мс, 16мс, 32 мс, 64мс, 128мс. В сумме 256мс.
    этот метод называется BAM, хорошо описан в сети...
    а время ну как минимум надо делить на 10~100
    оооОООоооОООоооОООоооОООооо

  10. Вверх #10
    Новичок Аватар для DiMomite
    Пол
    Мужской
    Сообщений
    61
    Репутация
    18
    Цитата Сообщение от kiri4 Посмотреть сообщение
    этот метод называется BAM, хорошо описан в сети...
    а время ну как минимум надо делить на 10~100
    Спасибо за название, не знал.
    Ну понятно, что на 4 Гц никто ШИМ не делает для светодиодов. Поэтому и написал, что "Пусть для простоты", чтобы цифры попроще были.

  11. Вверх #11
    Посетитель Аватар для kiri4
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    37
    Сообщений
    242
    Репутация
    153
    Цитата Сообщение от DiMomite Посмотреть сообщение
    Спасибо за название, не знал.
    Незачто, но мне кажется он имеет смысл при большом количестве каналов. А вообще способ хороший и интересный)
    оооОООоооОООоооОООоооОООооо


Ответить в теме

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения