#include #include #include #define AMIN 1 //Minimum desired amplitude #define AMAX 5 //Maximum desired amplitude #define NBBITS 20 //Number of bits of the DAC void convertTime(float * time, char unit); void convertSignal(float * signal, int * signalConv, int nbPoints); typedef struct { float period; //Period fo the signal float * times; //Rise or Fall times, etc ... int nbTimes; //Number of times int precision; //Number of points per rising/falling time or exponential branch float * signalVal; //Values of the signal int * signalConv; //Numerical values of the signal int nbPoints; //Number of point for the signal }signal; int main (void) { char choiceSignal; signal signal; int i; char unit; printf("Select among three categories of signal :\n1.Trapeze or Triangle\n2.Square or Rectangle\n3.Exponential Branches\n"); scanf("%d",&choiceSignal); if(choiceSignal == 1) { signal.nbTimes = 4; signal.times = malloc(4 * sizeof(float)); signal.period = 0; printf("Type the 4 times for this signal :\n1.Low \n2.Rise\n3.High\n4.Fall\n"); for(i = 0; i < 4; i++) { printf("%d.",i+1); scanf("%f %c",signal.times + i, &unit); convertTime(signal.times + i, unit); signal.period += *(signal.times + i); } printf("Type how many points you desire per Rising/Falling period (without accounting for peak values)\n"); scanf("%d",&signal.precision); signal.nbPoints = (signal.precision * 2) + 3; signal.signalVal = malloc(signal.nbPoints * sizeof(float)); *signal.signalVal = AMIN; *(signal.signalVal + signal.nbPoints - 1) = AMIN; for(i = 1; i <= signal.nbPoints - 2; i++) { if(i <= ((signal.nbPoints - 3) / 2) + 1) { *(signal.signalVal + i) = ((AMAX - AMIN) / ( ((float)signal.nbPoints - 1) /2) ) * i + AMIN; } else { *(signal.signalVal + i) = ((AMAX - AMIN) / ( ((float)signal.nbPoints - 1) /2) ) * (((float)signal.nbPoints - 1) - i) + AMIN; } } } if(choiceSignal == 2) { signal.nbTimes = 2; signal.times = malloc(2 * sizeof(float)); signal.period = 0; printf("Type the 4 times for this signal :\n1.Low\n2.High\n"); for(i = 0; i < 2; i++) { printf("%d.",i+1); scanf("%f %c",signal.times + i, &unit); convertTime(signal.times + i, unit); signal.period += *(signal.times + i); } signal.nbPoints = 2; signal.signalVal = malloc(signal.nbPoints * sizeof(float)); *signal.signalVal = AMIN; *(signal.signalVal + 1) = AMAX; } if(choiceSignal == 3) { float a; printf("Type the period of the signal\n"); scanf("%f %c",&signal.period, &unit); convertTime(&signal.period, unit); printf("Type how many points you desire per period\n"); scanf("%d",&signal.nbPoints); signal.signalVal = malloc(signal.nbPoints * sizeof(float)); a = (1.0/(signal.nbPoints - 1))*log(AMAX/AMIN); printf("%f\n",a); for(i = 0; i < signal.nbPoints; i++) { *(signal.signalVal + i) = AMIN * exp(a*i); } for(i = 0; i < signal.nbPoints; i++) { printf("%f\n",*(signal.signalVal + i)); } } if(choiceSignal >= 1 && choiceSignal <= 3) convertSignal(signal.signalVal, signal.signalConv, signal.nbPoints); else printf("Bad signal choice\n"); system("pause"); return 0; } void convertTime(float * time, char unit) { switch(unit) { case 'h' : *time *= 3600; break; case 'M' : *time *= 60; break; case 's' : break; case 'm' : *time /= pow(10,3); break; case 'u' : *time /= pow(10,6); break; case 'n' : *time /= pow(10,9); break; default : printf("Unit not recognised, time left as is\n"); } printf("%.12f\n",*time); } void convertSignal(float * signal, int * signalConv, int nbPoints) { signalConv = malloc(nbPoints * sizeof(int)); int i; int j; for(i = 0; i < nbPoints; i++) { *(signalConv + i) = ( ((float)(pow(2,NBBITS) - 1)/(float)(AMAX - AMIN)) * *(signal + i) ) + (-AMIN * ((float)(pow(2,NBBITS) - 1)/(float)(AMAX - AMIN))); printf("%d\n", *(signalConv + i)); for(j = 0; j < NBBITS; j++) { if(*(signalConv + i) & (1 << (NBBITS - j - 1))) printf("1 "); else printf("0 "); } printf("\n"); } }