Binary (Bit) Angle Modulation (BAM) довольно интересная альтернатива ШИМ. А в случаях, когда каналов много и они используются для управления светодиодами - просто незаменимая вещь!
			
 sshot-2.png [ 14.75 КБ | Просмотров: 24599 ]
			sshot-2.png [ 14.75 КБ | Просмотров: 24599 ]
		
		
	Не буду описывать суть метода (это тема для целой статьи) просто нужно знать, что BAM позволяет более "правильно" для человеческого глаза засвечивать светодиоды и при этом на его реализацию расходуется намного меньше процессорного времени.
- Для каждого канала уровень BAM задается в переменной Bri* (где * - номер канала).
- Все действия производятся в прерываниях таймера0 (или другого по выбору). Для основной программы работа программного BAM незаметна. Менять уровень канала можно в любое время, в любом месте программы.
- Обработка одного канала занимает 7 слов памяти и 8 тактов процессорного времени (для обеспечения частоты BAM в 120Гц необходимо каналы обрабатывать 120*8=960 раз в секунду).
- Теоретически (при частоте задающего генератора 20МГц) можно организовать до 3000 таких каналов!
			
Комментарий к файлу: Организация произвольного количества BAM каналов.
		
			
				 BAM-test.zip [21.15 КБ]
			
			Скачиваний: 1172
 
				BAM-test.zip [21.15 КБ]
			
			Скачиваний: 1172
		
		
	- Зачастую при реализации BAM забывают о том, что при переходе значений от 127 к 128 и наоборот возникают артефакты в виде заметного моргания. Такое получается из за того, что при смене вышеуказанных значений соседние периоды ВАМ образуют облась с одним уровнем (в зависимости от напрвления перехода 0 или 1) с периодом равным целому периоду ВАМ. 
127 --> 128 #b0{1111111 --> #b1}0000000 
Для того, чтобы этого избежать, в этой реализации, в каждый следующий период работы ВАМ меняется направление обработки. 
Т.е.: 1 период = b7, b6 ... b1 b0; 2 период = b0, b1 ... b6 b7; 3 период = b7, b6 ... b1 b0; и т.д.
Такой способ работы еще называют зеркальным BAM (MiBAM) Mirror Imaged Bit Angle Modulation/