Перейти к содержанию

POlSS0N

Members
  • Постов

    51
  • Зарегистрирован

  • Посещение

Весь контент POlSS0N

  1. POlSS0N

    Оптимизация кода

    Есть вот такой участок: temp += value; curval = (temp >> 14); temp <<= 10; temp >>= 10; CCPR1L=(curval >> 2); pwmt=(curval << 14) >> 10; CCP1CON=12+pwmt; TMR2IF=0; Это кусок процедуры прерывания по срабатыванию таймера TMR2 который управляет ШИМом. Собственно задача этого куска - сделать из 10-битного ШИМа псевдо 24-битный. Для этого существует 24-битное (short long) число-значение value и 24-битный текущий счетчик temp. По задумке каждый вызов таймера temp увеличивается на величину значения value и его старшие 10 бит загружаются в ШИМ и очищаются, а младшие разряды тем самым служат для возможности плавного псевдо24-битного регулирования, периодически увеличивая загружаемое значение. Однако несмотря на то, что тут использованы только сдвиги и сложения, по осциллографу видно, что за один прогон таймера эта процедура выполниться не успевает. Фактически она занимает три прогона, то есть порядка 3000 циклов. На мой взгляд тут максимум всё это дело тянет на 300-400 циклов. Можно ли как нибудь данную процедуру оптимизировать? Контроллер 16HV616@8MHZ компилятор hi-tech-picc v9.80
  2. Нашел даташиты на отдельные чип-диоды. Вобщем у всех цветастых диодов световая эффективность значительно ниже чем у белых диодов. У зеленых сравнимая, а у остальных - в 2-3-5 и даже 10 раз ниже в зависимость от цвета. Так что мой путь - теплый белый + синие для ухолоднения.
  3. Белый понятие растяжимое. С синим оттенком называется холодный белый, с желтым - теплый белый. Чему равен идеальный белый никто не знает) Ходят слухи что белый - это который соответствует спектру АЧТ с температурой 6500 кельвин, но я сколько не видел ламп с заявленной ЦТ 6500 они все синие почти как моя аватарка) RGB не хотелось только потому, что придется по три канала на каждую ленту контролировать, думал обойтись двумя, скомбинировав синий и желтый, но видать, не судьба. Остается вопрос - как найти нормальную по эффективности RGB? Даташитов на ленты где бы указывались световые характеристики нет вообще.
  4. Короче на моей ленте на три желтых диода идет 3 резистора по 33 ома. Итого 6 вольт падает на диодах и 6 на резисторах. У лучших белых диодов эффективность порядка 100 Лм/Вт. У моих "желтых" скорее всего порядка 30-50 Лм/Вт и делим пополам ибо пол мощности едят резисторы - получаем лента 15-25 Лм/Вт. Как раз в районе ламп накаливания и получается)
  5. Купил желтую диодную ленту. Оказалась оранжевой. Как найти настоящую желтую, чтобы при включении вместе с синей она давала белый, а не сиреневый, как у меня вышло) Купил две ленты по 36 ватт. В результате 72 ватта диодноленточного света светят раза в 2 слабее чем одна 12-ваттная диодная лампочка. Итого, таки я был прав эффективность там порядка ламп накаливания.
  6. Придумали интересную идею. Народ сдает на мыло задачки, администраторы группы их постят, на следующий день пишут правильный ответ. Но как оказалось, первый блин комом. Первый же "правильный ответ" оказался неправильным, ибо авторы задачи плохо читали даташит, схему из которой выложили. Но тут хотя бы автор задачи признал свою ошибку. Теперь же полный абзац) Итак, автор второй задачки утверждает (и администратор с ним согласен), что данная схема работает в автоколебательном режиме, и за счет магических переходных процессов позволяет крутить электродвигатель быстрее и с меньшими потерями!=) Сама схема собственно, вот она: Доказать автору, что данная схема не может работать потому что не может работать вообще мне не удалось) На наводящие вопросы он отвечает что там есть магические переходные процессы, в частности с момент пуска индуктивность(!) подает плюс питания на базу)) и вообще он собирал и всё "работает как часы как электронный предохранитель". Соответственно вопрос: как бы набрать в администрацию этой группы экспертный редакционный совет, чтобы хотя бы в настолько элементарные лужи не садиться на глазах у достопочтенной публики? Я лично готов участвовать в редакции за так)
  7. Вероятно я плохо объяснил проблему, либо все читали только 1 строчку. =) Я знаю какие по цвету диоды в принципе нужно иметь, чтобы это сделать. И схему тоже знаю, и контроллеры программировать умею. У меня проблема - из каких именно диодных продуктов это собрать. Если брать обычную диодную ленту с токоограничительными резисторами, у меня получится освещение по энергоэффективности не сильно выше ламп накаливания, ибо 90% мощности будут съедать эти самые резисторы. Соответственно вопрос в том, где может быть кто видел, можно найти ленты БЕЗ этих резисторов, просто ленты последовательно соединенных диодов, в которых нужно драйвером стабилизировать ток. Или может где можно заказать диодные сборки на радиаторе без драйвера? Ща например написал в оптоган, может они продадут светильники без драйвера под мою задачу))
  8. Хочу сделать освещение, чтобы я мог регулировать не только яркость, но и цветовую температуру. Соответственно мне нужны светодиодные ленты, либо модули уже собранные на радиаторе, но БЕЗ своих источников питания и без токоограничительных резисторов. В продаже же есть либо ленты с резисторами, либо светильники с встроенными драйверами, либо диодные модули без радиатора. А отдельные яркие диоды если ими набрать нужную мощность, выходят крайне дорого. что делать? Неужели придется покупать светильник и выковыривать родной драйвер, вымерять при каком токе работает там диодная сборка и прочее?
  9. Кстати, разобрал промышленный софт-стартер, и там именно так понижается стартовая мощность. При пуске он дает 1 волну из 3-х, затем в течении 0,5с увеличивает подачу до 100% и далее шунтирует симистор релешкой.
  10. Время одного преобразования - 4 мкс. Обработка результата преобразования - два int сложения и if с неравенством - около 20 инструкций по 0,5 мкс каждая. Итого дискретный шаг слежения - в районе 15 мкс. Скорость нарастания напряжения - 2*pi*50*sqrt(2)*220*cos(0)=~100 КВ/с. Умножаем - получаем неточность открытия вызванная дискретностью - 1.5 вольта, то есть порядка падения напряжения на самом симисторе. Так что попадание довольно точное. Проводил моделирование, никаких причин для беспокойства не заметил. В целом пуск через симисторы таким способом получается гораздо мягче чем через пускатель. Естественно постоянная работа в режиме пропуска волн не рекомендуется, но если нужно чтобы насос плавно подал давление, то секунда-две в таком режиме движку не повредит.
  11. Доселе невидел Спасибо за ликбез Не, я конечно, догадывался, что нечто подобное существует, однако оно по-видимому мало распространено. По меньшей мере все симисторные регуляторы, что я видел в продаже - фазные. Устройства плавного пуска. Такое простое снижение мощности требуется когда двигатель раскручивает систему с большой инерцией. Так-же полезно в мощных насосах, чтобы избежать ударов в трубах от запуска. Если имеется в виду блуждание частоты сети, то устойчива. Она же переход через ноль непосредственно контролирует.
  12. Обычный диммер, являющийся простейшим устройством регулировки переменного тока является фазным симисторным регулятором и представляет собой схему, открывающую напряжение в нагрузку в определенной фазе. Недостатком фазного управления является сильный скачок напряжения в момент включения нагрузки и требует подавление помех с помощью дросселей. Я же хочу представить идею синхронного регулирования. В этом типе регулирования нагрузка включается всегда при переходе напряжения через ноль, а регулирование осуществляется соотношением числа волн которые были поданы в нагрузку и числа пропущенных волн. Преимуществом его является практически полное отсутствие высокочастотных помех. С другой стороны недостатком является "моргание", то есть изменение средней мощности в нагрузке с низкими частотами, так что диммировать этим способом лампы освещения крайне не рекомендуется. Зато он отлично подходит для управления мощными нагрузками вроде обогревателей, и в особенности, двигателями вентиляторов, насосов, так как на них крайне неблагоприятно воздействуют те самые броски напряжения, что выдает схема фазного регулятора при включении. Простой аналоговой схемы которая бы отслеживала переход через ноль, и включала целое число волн с нужными соотношениями не существует, поэтому я пошел путем контроллера. В качестве такового подойдет почти любой простейший контроллер, имеющий два входа АЦП и по крайней мере еще один цифровой выход. Я же использовал PIC16HV616. Он имеет собственный регулятор питания, встроенный источник тактового сигнала, так что схема получилась с минимумом обвязки. Итак, прежде всего сетевое напряжение попадает через резистор на оптотранзистор. Диод VD1 защищает его светодиод от обратного включения. На вторичной части питание контроллера через резистор подается на фототранзистор и - вход АЦП контроллера AN7. Резисторы R2 и R3 нужно подобрать так, чтобы волна имела полную амплитуду от 0 до 5 вольт. На вход AN6 подается аналоговый сигнал который отвечает за регулировку мощности. Далее вывод RC5 через резистор R4 открывает оптосимистор MOC3022, который уже открывает силовой симистор BTA-41. Корпус ВТА-41 изолирован от внутренностей, так что он смазывается термопастой и сажается прямо на радиатор, который для защиты пользователя от удара током в случае повреждения симистора, заземляется. Программа контроллера должна быть устроена следующим образом: Выводы AN6, AN7 выбираются аналоговыми, остальные - цифровыми. Выводы, соответствующие AN6 и AN7 делаются входами, остальные - выходами. Настраивается прерывание по завершению преобразования. Первое преобразование запускается из main. Прерывание строится следующим образом. Работа устройства делится на 2 цикла: отслеживание напряжения и чтение аналога регулировки. Отслеживание напряжения делится на 2 фазы - фаза включения и фаза выключения. Фаза включения начинается когда значение аналога превысит около 900-1000 (из 1023). При достижении этого значения увеличиваем переменную состояния на значение мощности. Если она переполняется (после увеличения стала больше чем была), значит выставляем RC5 единицей (открываем симистор). Далее предсказываем следующее её увеличение. Если после следующего увеличения она не переполнится, значит перед следующей волной нужно выключить симистор, соответственно выставляем флаг нужно или не нужно будет его выключить. Устанавливаем флаг что фаза включения обработана. Фаза выключения начинается когда значение аналога станет ниже ~500. Читаем флаг потребности выключить симистор и если он установлен, устанавливаем RC5=0. Далее выставляем флаг ожидания фазы включения, меняем адрес читаемого аналогового входа на чтение из RC6, и выставляем флаг цикла чтения аналога регулировки. В цикле регулировки переводим прочитанный аналог в значение мощности типа int следующим образом power=analog << 6; power+= analog >> 4; таким образом изменению значения аналога 0..1023 будет соответствовать изменение значения переменной мощности от 0 до 65535. И наконец, меняем адрес читаемого аналогового входа на чтение из RC7 и выставляем флаг цикла отслеживания напряжения. Значение аналога когда нужно открывать симистор выбирается с помощью осциллографа. Если у вас нет осциллографа, приемлемое значение можно установить на слух. Когда включение нагрузки происходит при существенном напряжении, происходит характерный щелчек. Его хорошо слышно от паяльника, чайника и других приборов. Если вы нашли нужное значение, включение нагрузки при открытии симистора будет беззвучным. Управляться данная схема может как с помощью переменного резистора вручную, так и с помощью различных приборов и автоматики. Например можно легко приспособить к ней термосопротивление, согласовав его с аналоговым входом контроллера с помощью операционного усилителя, получив тем самым терморегулятор. Из автоматики идеальной будет та, что способна выдавать аналоговый выход, либо цифровой высокочастотный. Вы сможете легко согласовать такие устройства с данной схемой, избежав тем самым использования щелкающего реле. Для использования в регулировке трехфазной нагрузкой рекомендуется включать каждую из фаз при переходе через ноль (для схемы "звезда"), тем самым здорово снизив коммутационные токи двигателей. Для этого потребуется отслеживать напряжение в каждой из фаз и задействовать 3 аналоговых входа и 3 цифровых выхода. Оставшиеся 3 входа можно использовать например, для отслеживания токов по каждой фазе для защиты двигателей при обрыве фаз и прочих неприятностях.
  13. Предположим у меня есть контроллер с железной поддержкой эθернэта. пока еще нету, но планируется. Покурил даташит и там по теме того, как им пользоваться написано совершенно недостаточно. Гугл на тему Ethernet сами понимаете, что выдает. Соответственно нужен совет, где почитать: 1) физическая среда передачи совместимая с современным сетевым оборудованием. Вроде нужны специальные балансировочные трансформаторы, а может и что-то еще?. А может есть готовые модули на плату с разъемом 8P8C с одной стороны и подключением к контроллеру с другой? 2) туториал по протоколу IP - как его минимально реализовать. Чтобы не сразу закапываться в спецификацию. 3) тоже по протоколу TCP.
  14. Учебники по электронике на... Греческом языке http://kkalivas.tucsonclub.gr/index.php/2012-11-24-17-52-10
  15. Сдуру купил 5 штук, как обычно собрал на макетку, подоткнул пикит2, а он пишет - несовместимая деталь (id=0020). Посмотрел - "цешек" нет в списках поддерживаемых пикитами приборов ни второго ни третьего, а программирует его нечто PM3 стоимостью с две моих зарплаты. Вопрос - что нибудь вообще можно с ним сделать или сразу пойти подарить комунить?=) Может его можно через другой контроллер зашить?
  16. На ЧД в свойствах эмальпровода ПЭТВ-2 указано "минимальное пробивное напряжение - 5000 вольт". Тем не менее в мануалах по намотке трансов указано не допускать между соседними витками напряжение выше 100 вольт. В светильниках например, где стоит резонансная схема зажигания, дроссель намотан вообще проводом в толстой тефлоновой изоляции и между рядами витков проложена трансформаторная изолента, хотя там всего 5 киловольт на выходе. Соответственно вопрос - что же это за такое минимальное пробивное напряжение? Или реально ПЭТВ пробивает только 5 КВ?
  17. Совершенно мимо. Радиация - это в переводе с английского, буквально, излучение. Любое излучение. Знаете, в чем измеряют свет для роста растений? В единицах ФАР = физиологически активная радиация. И имеется тут обычная солнечная световая радиация. То чем вас пугают по телевизору показывая атомные станции называется ионизирующая радиация. К ней относится: альфа-излучение - поток ядер гелия на высокой скорости, бета-излучение - поток электронов на высокой скорости и гамма-излучение - поток фотонов высокой энергии. При этом само по себе альфа и бета излучение практически безвредно, ибо оно поглощается верхним эпителием, то есть слоем отмерших клеток кожи. Основной вред для здоровья возникает при вдыхании или употреблении внутрь так называемой зараженной материи, то есть воздух, воду и еду, содержащую радио-активную пыль, то есть пыль, содержащую нестабильные ядра, которые излучают эти самые частицы. Эта пыль попав в организм излучает эти самые частицы непосредственно изнутри и оно-то и наносит основной вред и именно это вызывает рак и всё всё прочее что бывает "от радиации". Таким образом, возвращаясь к теме, нет никаких причин бояться разрядов статического электричества ибо оно не имеет ничего общего с вышеописанным. Однако, должен предупредить, что в высоковольтных игрушках зачастую присутствует высокочастотное переменное электрическое поле большой интенсивности, которое хоть и не имеет никакого отношения к ионизирующей радиации, вредно само по себе и так-же может быть причиной рака. Так что включать свою "теслу" следует пореже, лучше предварительно ознакомившись с допустимыми уровнями воздействия электрических полей на человека и измерив их вблизи вашего прибора. Электроны в радиолампе не представляют никакой опасности. Вообще, миф о вреде телевизоров с кинескопом возник из-за серии советских телевизоров, использующих для стабилизации высокого напряжения высоковольтную лампу ГП-5, которая являлась очень хорошим источником рентгеновского излучения. С тех пор прошло много лет и поколений телевизоров с обратноходовыми безопасными генераторами, но все бабушки до сих пор считают, что от телевизоров да и вообще от всей электроники идет "радиация", о чем не забывают регулярно рассказывать своим внукам.
  18. А, все, дошло. Там оказывается есть две, нет, три частоты. частота семплирования fs, системная тактовая частота, которая должна быть строго в 256, 384 или 512 раз выше fs, и битовая частота передачи данных которая может плавать от 48 до 64 fs, причем в принципе можно ниже 48, но тогда не все данные будут считаны.
  19. Мой вариант. Прибор - PIC16f877a Кнопки подключены к RA2, RA3, RA5, RA6. Чтобы кнопки работали конкретно на порту А кроме описанного необходимо еще и перевести эти выводы, принадлежащие модулю АЦП, в режим цифровых входов, написав PCFG1 = 1;PCFG2 = 1;PCFG3 = 1; Итак, алгоритм на мой взгляд очень простой, читабельный и легко расширяемый. Я на нем целую систему меню построил без особого труда. 1)В заголовочном файле создаем переменные типа unsigned char status, содержащую различные флаги, и inputwait, которая обеспечивает защиту от дребезга контактов 2) В заголовочном же файле для красоты и удобства определяем следующие макросы: #define ISPUSH (status & 0b00000010)//проверяет, была ли нажата кнопка #define SETPUSH (status |= 0b00000010)//устанавливает флаг, что кнопка была нажата #define GETPUSH (status &= 0b11111101)//снимает флаг #define IENABLED (status & 0b00000100)//проверяет, разрешена ли обработка событий кнопки #define IENABLE (status |= 0b00000100)//разрешает #define IDISABLE (status &= 0b11111011)//запрещает 3) Включаем прерывания таймера и настраиваем его на срабатывание каждые 65536 программных циклов. int main(int argc, char** argv) { ... GIE = 1; PEIE = 1; TMR0IE = 1; TMR0IF = 0; PS0 = 1; PS1 = 0; PS2 = 1; PSA = 0; T0CS = 0; ... while (1) maincycle(); return (EXIT_SUCCESS); } 4) в главном цикле - добавляем процесс отслеживания событий кнопок void maincycle() { ... if (IENABLED) push(); ... } 5) прерывание interrupt void isr() { if (TMR0IF) { inputwait--; if (inputwait == 0) IENABLE;//разрешаем обработку событий кнопок TMR0IF = 0; } //тут могут быть обработчики других прерываний } 6) сам процесс обработки нажатий-отпусканий void push() { if (ISPUSH) {//если кнопка была нажата if (PORTA == 0) {//а теперь отпущена GETPUSH;//фиксируем отпускание inputwait = 20; IDISABLE;//отключаем обработку событий нажатия на 20 тиков } } else { switch (PORTA) { case 2: //тут наши действия по нажатию кнопки вверх release(); break; case 4: //тут наши действия по нажатию кнопки вниз release(); break; ...//и так далее } } } 7) вспомогательная функция release фиксирующая нажатие и отключающая обработку событий кнопки на 10 тиков void release() { inputwait = 10; IDISABLE; SETPUSH; //тут выполняем действия которые должны быть выполнены после любого нажатия на кнопку, например обновление данных на дисплее } Вот собственно и всё. Уверен, нечто подобное будет актуально и для других контроллеров. Несколько иной алгоритм разве что следует сделать для многокнопочных панелей, опрашивая разные ряды по очереди.
  20. Конкретно PCM1808PW. Даташит. В моем приборе SPI может тактироваться 4, 1 MHz и 250 kHz. В первом режиме в принципе влезаю в допустимый диапазон частот 2,048-49,152 MHz. По меньшей мере даташит прямо не обязывает придерживаться стандартного набора скоростей, хотя там что-то есть про антиалайзинговые фильтры, которые вне диапазона стандартных скоростей могут и не работать как положено.
  21. Вот-вот. И я так сначала думал) А оказалось, что есть I2C, а есть - I2S и это совсем разные вещи, причем I2S похож на SPI. И у моей микрухи оказалась таки S.
  22. Случайно ошибся одной буквой (не заметил разницу между C и S) и купил аудио-АЦПху с интерфейсом I2S) Сперва подумал все пропало, но заметил, что у I2S очень похожий способ передачи данных с SPI - сплошная передача по тактовым импульсам. Стоит заморачиваться прочитать поток через SPI? Вроде для полного счастья будет достаточно вовремя выставлять фреймовую сигхронизацию. В инете ответы противоречивые.
  23. Ок, тогда так и сделаю. Ну как же? Любой сеанс связи начинается отправкой байта типа (адрес<<1)+чтение. Далее должен прийти ACK, Если устройство с таким адресом есть. Вот так перебором различных адресов можно автоматически установить факт подключения нового устройства.
  24. Хочу сделать, чтобы контроллер опознавал самостоятельно факт подключения к линии i2c внешних устройств. Предполагаю периодически рассылать запросы на запись по каждому адресу и записывать, пришло ли подтверждение или нет, после чего сразу прерывать работу стоп-битом. Возникает вопрос - как поведет себя другой контроллер, если он подтвердит готовность принять некие данные а в результате вместо тактов он получит стоп-бит? Может, в стандарте i2c есть общепринятый метод опроса адресов?
  25. Решение основных проблем многозадачности - использование прерываний таймера. у меня в 16f877a нулевой таймер вызывает прерывание каждые 65536 циклов, и в прерывании происходит смена сегмента и установка в него очередного символа. Коды символов сегментов хранятся в глобальном массиве типа char [4], так что их не нужно вычислять каждый раз при смене сегмента. А все фоновые задачи выполняются в главном цикле, так что их выполнение не мешает индикации, ибо прерывание собственно, прерывает выполнение всех прочих задач. Но нужно быть с этим аккуратным и не насиловать прерывание за зря. В нем нужно исполнять только наиболее высокоприоритетные задачи которые должны выполняться в реальном времени. У меня это кроме задачи смены сегментов только установка флагов активности подзадач.
×
×
  • Создать...