Показать сообщение отдельно
Старый 29.03.2015, 09:28   #37
LordN
Senior Member
 
Регистрация: Dec 2007
Адрес: Томск
Сообщения: 4 157
Благодарил(а): 240 раз(а)
Поблагодарили: 165 раз(а) в 157 сообщениях
По умолчанию Ответ: Обмениваемся своими макросами

Цитата:
Сообщение от tvf Посмотреть сообщение
ШИМ-модулятор.

Традиционные ШИМ-модуляторы имеют ряд врожденных особенностей:
1. Разрешающая способность ШИМ пропорциональна периоду ШИМ. При характерном времени цикла контроллера 0,1 с и разрешающей способности ШИМ 0,1% период ШИМ будет 100 с.
2. Реально в процессе модуляции участвует только одно значение переменной за весь период ШИМ. При разрешающей способности ШИМ 0,1% в процессе модуляции участвует 1 значение переменной из 1000.

Все это накладывает некоторые ограничения на область применения ШИМ: переменная не должна значительно меняться в течении периода ШИМ. Если ограничить изменение переменной в течении периода ШИМ 1%, то при разрешающей способности ШИМ 0,1% и характерном времени цикла контроллера 0,1 с характерное время процесса составит 10000 с или 2 ч 46 мин.
Попытка применить ШИМ для более быстротекущих процессов требует уменьшить разрешающую способность ШИМ или работать по среднему значению переменной за предыдущий период ШИМ. Первый вариант снижает точность регулирования, второй вносит задержку на период ШИМ. Но кардинально ни тот ни другой вариант ни чего не меняет.

Существует специальный вид ШИМ модуляторов, быстродействие которых ограничено только циклом работы контроллера. Это так называемый ШИМ Бразенхейма. В процессе модуляции участвуют все значения переменной. Минимальное характерное время процесса более 10-15 тиков контроллера. Пример такого модулятора во вложении. Входной сигнал 0-1000, разрешение - 8 бит или около 0,4%.
Код:
	#ifdef BrezenhemEnable
	//****************	BEGIN тест Брезенхема	***************
	#define	CARRY_BIT 0b01000000 // выбор разрядности метода
			bitPeriod = !bitPeriod;
			if(bitPeriod)
			{
				static	unsigned char	accum;	//, tmp;
				accum += speedFan; // вход той же разрядности
				if(accum & CARRY_BIT)
					bitTriacEnable = 1;
				else
					bitTriacEnable = 0;
				accum &= ~CARRY_BIT;
				ccpVal = MaxCCP_Val;
			}
	//****************	END тест Брезенхема	***************
	#endif
		//		эта конструкция работает!!!!!!!!


__________________
C уважением, LordN
LordN сейчас на форуме   Ответить с цитированием