Цитата(kash @ 26.12.2008, 9:52)

Skif, Дрожания можно убрать если менять скважность в конце цикла счетчика. Смена шим происходит только по прерыванию кагда переполняется счетчик. Если дрожания связаны с регулировкой то нужно смотреть регулировку. Последнее время использую ПИД регулирование , но там тоже нужно настраивать коэф......На счет СИ . Любая вещь имеет хорошие и плохие стороны. Ассемблер тоже. Мы почему то не ценим своего времени. У меня на СИ получается быстрее.
Не совсем понял про скважность...Это если знать насколько менять, а если эта величина постоянно меняется? Тут проблема в другом. И задача тоже. Попытаюсь объяснить (может перед этим неудачно объяснил).
сделано на Atmega8
Проблема такая. И она будет у всех, кто формирует импульсы прерываниями.
При возникновении прерывания, проц должен перейти на подпрограмму его обработки. Но он не в состоянии это сделать, не завершив текущей команды. Так вот неизвестно, где застанет его прерывание. На какой команде. И сколько тактов понадобится для завершения команды - тоже неизвестно. Именно эти неизвестные такты и вызывают колебания длительности.
Человек с серьезным стажем программирования и работающий в серъезной компании, посоветовал использовать выходы ОС1А и ОС1В, которые мгновенно при прерывании по совпадению, переходят в нужное состояние. К сожалению еще не разобрался как их конфигурировать, был бы благодарен за помощь (английский знаю плохо, даташит не совсем понятен).
А это - может кому пригодится.
Принцип формирования импульсов у меня состоит в следующем:
Таймер Т1 имеет на борту два регистра сравнения.
При работе подпрограммы генерирования ШИМ, в первый регистр сравнения А - записывается число обозначающее период колебаний (то есть формирующий частоту), а в регистр В записывается длительность импульса. Эти значения берутся в входа АЦП и формируются переменными резисторами
Работает так:
1. Формируется мертвое время (1.625 мкс-с запасиком - причем формируется без прерываний, а посему чрезвычайно стабильно - 1,625мкс)
2. Включается импульс на выход
3. Спустя период В, он отключается прерыванием, вызванным совпадением с регистром счета Т1
4. Далее при возникновение прерывания по совпадению счетчика с регистром А, происходит контрольное отключение импульса(вдруг А больше чем В? - то есть полное заполнение), сброс счетного регистра и смена выхода(их то два)
Почему так все сложно? Потому что, то, что подходит на силу с жесткой коммутацией, не пойдет на резонансник. Его нужно настраивать в резонанс изменяя частоту.
А вот с резонансника подойдет и на мост и на полумост. То есть прошивка на ШИМ созданная для резонансника выйдет универсальной для всех топологий.
Си просто довольно хорошо снижает быстродействие. Он прекрасен для очень сложных задач и не требующих быстрой реакции контроллера. Ну а вообще согласен полностью с Андреем
Цитата
Skif, я уже понял, что каждый будет пользоваться тем чем ему удобней, а дискуссии по поводу что лучше Си или Асм или еще что-то, думаю ни к чему не приведут
по поводу языков. Больше думаю этот вопрос поднимать не будем на форуме. Как говорил RV3BJ, лучше тот язык, который знаешь.
Тогда остается придумывать методы решения тех или иных задач, а программу каждый напишет на том, что по душе. Рано или поздно, у нас сформируются подпрограммы для решения тех или иных задач в инверторе. Из них всегда можно выбрать те укого получился наиболее эффективный код.