Необходимо сделать шим ЦАП 16 бит быстродействие роли не играет
Как применяется этот алгоритм на практике ? ( Есть грубая подстройка и точная об этом поподробнее )
Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ
- Реклама
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ
Алгоритм Брезенхема на Си
Этот код должен крутиться в цикле.
Про подстройку ни разу не слышал.
Код: Выделить всё
#define regMax (50)
/*максимальное значение счетчика. это значение задает разрядность ШИМ в неявном виде.
если взять логарифм по основанию два от этого числа плюс один - получим разрядность ШИМ */
signed short regError=regMax/2;
/*обязательное условие работы алгоритма, при изменении скважности ШИМ этому регистру (regError)
присвоить половину значения максимального значения счетчика */
unsigned short regValue=49; //собственно сама скважность ШИМ
regError=regError-regValue; //Алгоритм Брезенхема
if (regError<=0)
{
regError=regError+regMax;
LED=1; //для простоты - светодиод
}
else
LED=0;Про подстройку ни разу не слышал.
Ставим плюсы: )
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ
Алгоритм Брезенхема применительно к ЦАП - это дельта-сигма модулятор первого порядка. На Си выглядит так:
Если интересует ШИМ-ЦАП с разбиением на грубую и точную часть, то могу привести код на AHDL:
В примере 10 квантов грубой и 10 квантов точной части, эквивалентная разрядность около 7 бит. Но можно сделать разрядность любой. Более подробно описывал здесь: http://leoniv.livejournal.com/87824.html
Код: Выделить всё
//Value - входная величина (0..MAX_VALUE)
//Delta-Sigma модулятор:
static int Sigma = 0;
int Delta;
//квантование:
if(Sigma > MAX_VALUE)
{
Delta = -MAX_VALUE;
Out = 1;
}
else
{
Delta = 0;
Out = 0;
}
//суммирование:
Sigma = Sigma + Value + Delta;
}
Код: Выделить всё
CONSTANT PWM_TOP_F = 10; -- PWM TOP fine
CONSTANT PWM_TOP_C = 10; -- PWM TOP coarse
SUBDESIGN S2PWM
(
Clk : INPUT;
PwmFine[3..0] : INPUT;
PwmCoarse[3..0] : INPUT;
PWM : OUTPUT;
)
VARIABLE
CntC[3..0] : DFFE;
CntF[4..0] : DFFE;
PWMC, PWMF : NODE;
BEGIN
CntC[].(clk, ena) = (Clk, vcc);
CntF[].clk = Clk; PWMF = CntF[4];
IF CntC[] == PWM_TOP_C - 1
THEN CntC[] = 0; CntF[].ena = vcc;
ELSE CntC[] = CntC[] + 1; CntF[].ena = gnd;
END IF;
IF(PWMF)
THEN CntF[] = CntF[] + (0,PwmFine[]) - PWM_TOP_F;
PWMC = PwmCoarse[] + 1 > CntC[];
ELSE CntF[] = CntF[] + (0,PwmFine[]);
PWMC = PwmCoarse[] > CntC[];
END IF;
PWM = DFF(PWMC, Clk, , );
END;
Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ
Огромное спасибо!
Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ
С альтерой не знаком если можно коментарии к последнему листингу
- Реклама
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ
По ссылке принцип описан.


