Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
FUZZY_
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ

Сообщение FUZZY_ »

Необходимо сделать шим ЦАП 16 бит быстродействие роли не играет

Как применяется этот алгоритм на практике ? ( Есть грубая подстройка и точная об этом поподробнее )
Реклама
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ

Сообщение ibiza11 »

Алгоритм Брезенхема на Си

Код: Выделить всё

#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 бит ЦАП ШИМ

Сообщение Леонид Иванович »

Алгоритм Брезенхема применительно к ЦАП - это дельта-сигма модулятор первого порядка. На Си выглядит так:

Код: Выделить всё

    //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;
  }
Если интересует ШИМ-ЦАП с разбиением на грубую и точную часть, то могу привести код на AHDL:

Код: Выделить всё

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;
В примере 10 квантов грубой и 10 квантов точной части, эквивалентная разрядность около 7 бит. Но можно сделать разрядность любой. Более подробно описывал здесь: http://leoniv.livejournal.com/87824.html
FUZZY_
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ

Сообщение FUZZY_ »

Огромное спасибо!
Реклама
Эиком - электронные компоненты и радиодетали
FUZZY_
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ

Сообщение FUZZY_ »

С альтерой не знаком если можно коментарии к последнему листингу
Реклама
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Алгоритм Брезенхема для реализации 16 бит ЦАП ШИМ

Сообщение Леонид Иванович »

По ссылке принцип описан.
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»