Datasheet

TMC429 DATASHEET (v. 1.07 / 2012-AUG-01) 60
Copyright © 2010-2012, TRINAMIC Motion Control GmbH & Co. KG
21 Example for Calculation of p_mul and p_div for the TMC429
/* PROGRAM EXAMPLE pmulpdiv.c : How to Calculate p_mul & p_div for the TMC429 */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void CalcPMulPDiv(int a_max, int ramp_div, int pulse_div, float p_reduction,
int *p_mul, int *p_div, double *PIdeal, double *PBest, double *PRedu )
{
int pdiv, pmul, pm, pd ;
double p_ideal, p_best, p, p_reduced;
pm=-1; pd=-1; // -1 indicates : no valid pair found
p_ideal = a_max / (pow(2, ramp_div-pulse_div)*128.0);
p = a_max / ( 128.0 * pow(2, ramp_div-pulse_div) );
p_reduced = p * ( 1.0 p_reduction );
for (pdiv=0; pdiv<=13; pdiv++)
{
pmul = (int)(p_reduced * 8.0 * pow(2, pdiv)) 128;
if ( (0 <= pmul) && (pmul <= 127) )
{
pm = pmul + 128;
pd = pdiv;
}
}
*p_mul = pm;
*p_div = pd;
p_best = ((double)(pm)) / ((double)pow(2,pd+3));
*PIdeal = p_ideal;
*PBest = p_best;
*PRedu = p_reduced;
}
int main(int argc, char **argv)
{
int a_max=0, ramp_div=0, pulse_div=0, p_mul, p_div,
a_max_lower_limit=0, a_max_upper_limit=0;
double pideal, pbest, predu;
float p_reduction=0.0;
char **argp;
if (argc>1)
{
while (argv++, argc--)
{
argp = argv + 1; if (*argp==NULL) break;
if ( (!strcmp(*argv,-a)) ) sscanf(*argp,%d,&a_max);
else if ( (!strcmp(*argv,-r)) ) sscanf(*argp,%d,&ramp_div);
else if ( (!strcmp(*argv,-p)) ) sscanf(*argp,%d,&pulse_div);
else if ( (!strcmp(*argv,-pr))) sscanf(*argp,%f,&p_reduction);
}
}
else
{
fprintf(stderr,\n USAGE : pmulpdiv a <a_max> -r <ramp_div> -p <pulse_div> -pr <0.00 .. 0.10>\n
EXAMPLE : pmulpdiv a 10 r 3 p 3 pr 0.05\n);
return 1;
}
printf(\n\n a_max=%d\tramp_div=%d\tpulse_div=%d\tp_reduction=%f\n\n,
a_max, ramp_div, pulse_div, p_reduction);
CalcPMulPDiv(a_max, ramp_div, pulse_div, p_reduction, &p_mul, &p_div, &pideal, &pbest, &predu );
printf( p_mul = %3.3d\n p_div = %3d\n\n p_ideal = %f\n p_best = %f\n p_redu = %f\n\n,
p_mul, p_div, pideal, pbest, predu);
a_max_lower_limit = (int)pow(2,(ramp_div-pulse_div-1));
printf(\n a_max_lower_limit = %d,a_max_lower_limit);
if (a_max < a_max_lower_limit) printf( [WARNING: a_max < a_max_lower_limit]);
a_max_upper_limit = ((int)pow(2,(12+(ramp_div-pulse_div)))) -1;
printf(\n a_max_upper_limit = %d,a_max_upper_limit);
if (a_max > a_max_upper_limit) printf( [WARNING: a_max > a_max_upper_limit]);
printf(\n\n);
return 0;
}
/* -------------------------------------------------------------------------- */