Часто, для управления мощностью нагрузки используется широтно-импульсная модуляция. То есть энергия поступает в нагрузку периодами и потребляемая мощность зависит от соотношения периодов включения и выключения.
Описание BAM.
Как видно из описания, периоды включения распределены неравномерно. Попробуем это исправить. Я попробовал поменять местами старшие и младшие биты адреса.
Javascript:
Описание BAM.
Как видно из описания, периоды включения распределены неравномерно. Попробуем это исправить. Я попробовал поменять местами старшие и младшие биты адреса.
Javascript:
// Bit Angle Modulation
// Альтернатива ШИМ
var out = [];
var inp = 208;
var maxBit = 7;
for(var i=0; i<256; i++)
{
for(var bit=maxBit, mask, mask2; bit >=0; --bit)
{
mask = 1 << bit;
mask2 = 1 << (maxBit - bit);
if(i & mask2)
{
out.push(+(!!(inp & mask)))
break;
}
}
}
console.log(out);
На выходе получил такую последовательность:
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, ...
Неплохо, но видно что последовательность неоднородна.
Решил попробовать использовать алгоритм Брезенхема, код на C:
/*
Программный эмулятор распределенной Bit Angle модуляции базируется на алгоритме Брезенхема
Равномерно распределяет нули и единицы на протяжении периода
*/
#include <stdio.h>
// длительность импульса (максимальное значение)
#define LENGTH 255
unsigned char brezen(unsigned char value){
static unsigned char out[LENGTH];
unsigned char oldVal = LENGTH/2;
unsigned char newVal;
unsigned char i=0;
for(; i<LENGTH; ++i)
{
if(value >= LENGTH)
{
out[i] = 1;
}
else
{
newVal = (oldVal + value) % LENGTH;
out[i] = newVal < oldVal ? 1 : 0;
oldVal = newVal;
}
printf("%d", out[i]);
}
printf("\n");
return out;
}
int main()
{
brezen(0);
brezen(5);
brezen(25);
brezen(254);
brezen(255);
return 0;
}
Получается последовательность с равномерно распределенными нулями и единицами.
Но, есть БОЛЬШОЕ "но" - эти алгоритмы реализованы программно и отнимают процессорное время. Алгоритмы можно реализовать в "железе"
Этот комментарий был удален автором.
ОтветитьУдалитьСмысл этого метода в том, чтобы уменьшить затраты ресурсов Мк в пользу увеличения полезных функций, а вы предложили обратно свести на нет все преимущества.
ОтветитьУдалитьЯ честно говоря не понял как вы собираетесь самый большой бит делить опять городить кипу прерываний?
И еще я не понял из вашего кода как будет выглядеть алгоритм управления множеством нагрузок.
Целью этого алгоритма является уменьшение низкочастотной составляющей спектра для упрощения фильтрации. Я реализовал подобный алгоритм для МК PIC16 http://vitaliy-rudik.blogspot.com/2012/05/blog-post.html. Данный алгоритм генерирует последовательности в основном цикле. Предполагается что микроконтроллер используется только для генерации последовательности в качестве сопроцессора, а по прерыванию в него записываются новые значения выходных уровней. Да, так искажаются формы выходных импульсов, но я думаю несущественно. Если генерацию импульсов посадить на прерывание по таймеру, то частота будет значительно ниже, так как требуются дополнительные такты для сохранения и восстановления рабочего регистра и программного счетчика.
УдалитьПочему не:
ОтветитьУдалить...
var offset = 0;
var next = 0;
var del = 255/inp;
for( var offset=0; offset<256; offset++)
{
if (offset >= next)
{
next = (int) next + del;
out.push(1);
}
else
{
out.push(0);
}
}
???