Allora ragazzi ... ci siamo bloccati ?
Prendendo come riferimento il documento che avevo precedentemente allegato,
Vi dò allora qualche dritta su come realizzare questo benedetto controllore fuzzy che potremo utilizzare per controllare la velocità di un motore in cc con accoppiato un encoder relativo. L'interrupt di un timer e una funzione di lettura passi encoder ci restituirà due informazioni : Errore assoluto ed Errore differenziale.
L'algoritmo Fuzzy si compone di tre fasi:
1. Fuzzificazione
2. Inferenza Fuzzy
3. Defuzzificazione1. Fuzzificazione
La fuzzificazione è il processo che determina il grado di appartenenza dei valori di input per definire i fuzzy-sets (variabili linguistiche). Nel caso della rotazione di un motore i valori di input sono due:
1) Errore assoluto nella velocità di rotazione dato da: Error = SetSpeed - CurrentSpeed
2) Errore Differenziale è ottenuto sottraendo l'errore precedente (l'ultimo) al valore corrente:
dError = Error - LastError
Per controllare la velocità di un motore definiamo 5 fuzzy-sets per i valori di input Error e dError:
NM. 1 negative medium
NS. 2 negative small
ZE. 3 zero
PS. 4 positive small
PM. 5 positive mediumAmmettiamo di voler realizzare un controllo di velocità di un motore in CC a cui è accoppiato un encoder relativo che genera una ventina di impulsi per ogni giro del motore.
Le funzioni di appartenenza ( Figura 1) sono di forma triangolare e il massimo valore scalato è 400h invece di uno che di norma si trova in altri documenti che descrivono la teoria fuzzy.
Questa via riduce di molto la complessità del calcolo matematico perché le operazioni di moltiplicazione vengono effettuate usando soltanto addizioni e sottrazioni.
Il risultato della fuzzificazione dei valori di ingresso è un vettore con cinque elementi detti fuzzy-set
e il valore di ogni elemento definisce il grado di appartenenza dei valori di input ad un particolare fuzzy-set (y-value). I vettori per gli errori assoluti e differenziali, che sono il risultato della fuzzificazione, sono elencati in X1[] e X2[].
Esempio:
Error = 30h, dError=10h In questo caso in accordo alle figure 2 e 3 i risultati della fuzzificazione saranno:
X1[]=[0h, 0h, 3D0h, 30h, 0h]
X2[]=[0h, 0h, 3F0h, 10h, 0h]Vediamo adesso come si ottengono questi due vettori attraverso uno pseudo codice C.
Alla procedura Fuzzification viene passato attraverso l’integer Value il valore Errore=30h e sequenzialmente il valore dError=10h che abbiamo precedentemente estrapolato dalla lettura di un encoder ad intervalli regolari determinati dall’interrupt del Timer del uControllore.
Per le figure e tabelle attenersi al documento allegato
- Code: Select all
//-----------------------------------------------------------------------------------
// La funzione converte i valori discreti in un vettore a 5 elementi Fuzzy Vector Data[]
//-----------------------------------------------------------------------------------
void Fuzzification(int Value, int *Data)
{
int i;
for (i = 0; i < 5; i++)
Data[i] = 0;
if (Value < -0x800)
Data[NM] = 0x400;
else if (Value < -0x400)
{
Data[NM] = 0x400 - (Value + 0x800);
Data[NS] = Value + 0x800;
}
else if (Value < 0)
{
Data[NS] = 0x400 - (Value + 0x400);
Data[ZE] = Value + 0x400;
}
else if (Value < 0x400)
{
Data[ZE] = 0x400 - Value;
Data[PS] = Value;
}
else if (Value < 0x800)
{
Data[PS] = 0x400 - (Value - 0x400);
Data[PM] = Value - 0x400;
}
else
Data[PM] = 0x400;
}
Alla fine di questo processo, che verrà eseguito per ognuno dei due errori, otterremo un vettore Data[i] che riassegneremo ai vettori X1[i] e X2[i] composti rispettivamente da 5 elementi:
X1[]=[0h, 0h, 3D0h, 30h, 0h]
X2[]=[0h, 0h, 3F0h, 10h, 0h]
Ci siamo fin qui ?