Алгоритм Брезенхема - это алгоритм применяющийся в графике, для определения точек сближения между двумя заданными опорными точками максимально коротким путем. Разработан был в компании IBM Джеком Элтоном Брезенхемом в 1962 году. Спросите, как может он найти применение в электронике? Может. Один из примеров это регулирование мощности. В настоящее время базовые и распространенные регуляторы построены по принципу ШИМ. Сигнал управления подается в определенное время определенной длинны, будь то фазовое управление или классический ШИМ. Все эти методы просты в реализации но у них есть и один большой минус, они сильно "шумят" в сеть. Иногда от этих помех зависают и сбоят устройства, что не есть хорошо. Как альтернатива таким регуляторам, регулятор с применением алгоритма Брезенхема. Он также хорошо регулирует но не создает помех в сеть , так как все переключения происходят в момент перехода фазы через нуль. Но и у него есть свои, если так можно сказать минусы. Его невозможно применить в устройствах где необходима большая скорость регулировки.
Если применять к бытовой сети то точность и дискретизация будет зависит от периода, если к примеру взять период 1 секунду, то будем иметь точность в 1% так как у нас 100 полупериодов сети и соответственно шагов регулирования. Если нам нужно регулировать что-то быстрее, скажем каждые 200 мс то и дискретность получаем в 20 шагов равную 5% мощности на шаг. Если берем больше период то и разрешение становится больше. Алгоритм хорошо применять в устройствах с большой инерцией переходного процесса. Он также распределяет нагрузку на оба периода сети стараясь нагрузить равномерно. Ниже приведен пример реализации этого метода в Bascom AVR. При симуляции в порт терминала выводятся управляющие сигналы на заданный период.
Dim size as byte
Dim value as byte
Dim error as integer
Dim stepNumber as byte
Dim result as byte
Declare sub bresenham_setValue(byval v as byte)
Declare sub bresenham_getNext()
Size = 100 ' размер периода call bresenham_setValue(2) ' задаем значение исходя из длинны периода
Do
call bresenham_getNext()
print result;
Loop until stepNumber = 0 End
Sub bresenham_setValue(v as byte) ' устанавливаем новое значение stepNumber = 0
value = v
error = size / 2 End sub
Sub bresenham_getNext() ' расчет очередного шага error = error - value
If error < 0 then
error = error + size
result = 1
else
result = 0
End if
incr stepNumber
If stepNumber >= size then
stepNumber = 0
error = size / 2
End if End sub
| |