Προς το περιεχόμενο

double 2 fixed-point arithmetic


OneDreamCloser

Προτεινόμενες αναρτήσεις

Δημοσ.

καλημερα παιδια,

 

θα ηθελα να κανω εναν PID controller που τωρα δουλευει με double αριθμους να δουλευει με ακεραιους, οποτε χρειαζεται καποιο scaling, μηπως θα μπορουσε κανεις να ριξει καμια ιδεα σχετικα με το επισυναπτομενο αρχειο ?

 

>#include <stdio.h>
#include <stdlib.h>

int main( void ) 
{
double orig_output = 0, emb_output = 0 ;
int eps, setpoint, measured, last_eps, lastlast_eps ;
double DT = 0.0005, prop = 10, reset = 0, deriv = 0.2 ;
double A, B, C ;
int AA, BB, CC ;

setpoint = 150 ;
measured = 180 ;
eps = (setpoint - measured) ;
last_eps = 10 ;
lastlast_eps = 20 ;

// original
orig_output += prop * ((eps - last_eps)/DT + reset * eps + deriv * (eps - 2 * last_eps + lastlast_eps)/(DT*DT)) * DT ;
A = (eps - last_eps)/DT ;
B = (eps - 2 * last_eps + lastlast_eps)/(DT*DT) ;
C = (A + reset * eps + deriv *  ;
orig_output += prop * C * DT ;

// embedded
AA = (((eps - last_eps) << 8)/DT) ;
BB = ((eps - 2 * last_eps + lastlast_eps) << 8)/(DT*DT) ;
CC = (AA + reset * eps + deriv * BB) ;
emb_output += prop * CC * DT ;

printf("(eps - last_eps)/DT = %f \t\t\t %d \n", A, AA) ;
printf("(eps - 2 * last_eps + lastlast_eps)/(DT*DT) = %f \t\t\t %d \n", B, BB) ;
printf("((eps - last_eps)/DT + reset * eps + deriv * (eps - 2 * last_eps + lastlast_eps)/(DT*DT)) = %f \t\t\t %d \n", C, CC) ;
printf("orig_output = %f \t\t\t %d", orig_output, emb_output) ;

lastlast_eps = last_eps ;
last_eps = eps ;

   return 0 ;
}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...