Regülasyon algoritması. DAC with ADC feedback

Başlatan SpeedyX, 16 Şubat 2013, 12:30:59

SpeedyX

Merhabalar,

ADC geri beslemeli DAC mekanizmam var. Bir de ADC girişim var, şimdilik giriş = çıkış yapmak istiyorum. DAC = girişADC yaparsam çıkış katındaki tolerans farklarından dolayı tam eşit olmuyor, belli bir offset ve çarpan hatası oluşuyor. Ben de çıkış DAC ını başka bir ADC ile ölçüp geri besleme elde ediyorum.
VÇıkış = VGiriş işlemi için aşağıdaki gibi basit bir algoritma düşündüm.
Kısaca çıkış hatasını çıkışa ekliyorum, böylece giriş = çıkış oluyor.

SignalOutputA -- DAC çıkışındaki ADC değeri
SignalInputA -- girişteki ADC ye uygulanan değer

Bu mantık problemsiz çalışıyor fakat daha hızlı ve daha optimize öneriler bekliyorum.

Bundan iyisi nasıl olur?

Selamlar.

void Regulate()
{
	uint16_t diff;

	if((SignalOutputA < SignalInputA) && (DACA != 0x0FFF))
	{
		diff = SignalInputA - SignalOutputA;
		if(DACA + diff <= 0x0FFF)
			DACA += diff;
		else
			DACA++;
	}
	else if((SignalInputA < SignalOutputA) && (DACA != 0x0000))
	{
		diff = SignalOutputA - SignalInputA;
		if(DACA >= diff)
			DACA -= diff;
		else
			DACA--;
	}
}

Klein

sadece farkı eklemek yeterli ise
hiç büyük küçük karşılaştırmasına gerek yok.  diff  değişkenin işaretli olsun . DACA değişkeni ile direk topla. eğer fark negatifse çıkaracak ,pozitifse toplayacaktır.

diff = SignalInputA - SignalOutputA;
DACA += diff;

Burada limtler sorun olacaktır. Ona da optimize bir çözüm bulunabilir.



SpeedyX

#2
Aslında limitler sorun olduğundan bu kod böyle. Yalnız DACA değişkeni işaretli sayı değil.

mesaj birleştirme:: 16 Şubat 2013, 16:36:37

void Regulate2()
{
	int16_t diff;

	diff = SignalInputA - SignalOutputA;
	if((diff < 0)  && (DACA != 0x0000))
	{
		if(DACA >= (uint16_t)diff)
			DACA -= (uint16_t)diff;
		else
			DACA--;
	}
	else if((diff > 0) && (DACA != 0x0FFF))
	{
		if(DACA + (uint16_t)diff <= 0x0FFF)
			DACA += (uint16_t)diff;
		else
			DACA++;
	}

Klein

{
   int output = (int) DACA;
   int error;
   
   error= SignalInputA - SignalOutputA;
   output += error;

   if (output > 0x0FFF) output = 0xFFFF;
   if(output< 0) output=0;
  DACA = (unsigned int) output; 
}