Add auto calibration - Fixe a timing in sstv

This commit is contained in:
F5OEO 2017-05-15 16:08:47 +00:00
parent f9022c0ed8
commit d1c4aae346
4 changed files with 244 additions and 223 deletions

View File

@ -91,7 +91,7 @@ float DelayStep=157;
float DelayMini=1200;
int PWMF_MARGIN = 2496;//1120; //A Margin for now at 1us with PCM ->OK
int globalppmpll=0;
double globalppmpll=0;
uint32_t *Shuffle[PWM_STEP_MAXI];
@ -351,7 +351,15 @@ int SetupGpioClock(uint32_t SymbolRate,double TuningFrequency)
for (samplecnt = 0; samplecnt < NUM_SAMPLES ; samplecnt++)
{
//At Same Time Init Samples
if(UsePCMClk==0)
{
ctl->sample[samplecnt].Amplitude2=0x0;
}
else
ctl->sample[samplecnt].Amplitude2=(Originfsel & ~(7 << 12)) | (0 << 12); //Pin is in
ctl->sample[samplecnt].Amplitude1=0x5a000000 + (0&0x7) + (1<<4) + (0<<3);
//@0
//Set Amplitude by writing to PWM_SERIAL via PADS
@ -577,13 +585,13 @@ inline uint32_t FrequencyAmplitudeToRegister2(double TuneFrequency,uint32_t Ampl
uint32_t RegisterF1;
uint32_t RegisterF2;
int NbF1DMA,NbF2DMA;
int NbF1DMA;
if(NbF2>DelayMiniStep)//NbF2 is the upper frequency which will be play longer due to delay
{
RegisterF1=0x5A000000 | (FreqDividerf1<<12) | (FreqFractionnalf1);
RegisterF2=0x5A000000 | (FreqDividerf2<<12) | (FreqFractionnalf2);
NbF1DMA=NbF1;
NbF2DMA=NbF2-DelayMiniStep;
//NbF2DMA=NbF2-DelayMiniStep;
}
else // F1 and F2 Swap : NbF1 is now the lowest frequency which will play longer due to delay
@ -591,7 +599,7 @@ inline uint32_t FrequencyAmplitudeToRegister2(double TuneFrequency,uint32_t Ampl
RegisterF1=0x5A000000 | (FreqDividerf2<<12) | (FreqFractionnalf2);
RegisterF2=0x5A000000 | (FreqDividerf1<<12) | (FreqFractionnalf1);
NbF1DMA=NbF2;;
NbF2DMA=NbF1-DelayMiniStep;
//NbF2DMA=NbF1-DelayMiniStep;
}
//printf("Ftune %f NbStepPWM=%d NbF1=%d NbF2=%d DelayMini=%d DelayStep=%d DelayMiniStep%d\n",FTunePercentage,NbStepPWM,NbF1,NbF2,DelayMini,DelayStep,DelayMiniStep);
@ -1015,6 +1023,9 @@ int GetDMADelay(int Step)
dma_reg[DMA_CONBLK_AD+DMA_CHANNEL*0x40]=mem_virt_to_phys((void*)cur_cb);
//usleep(100);
int samplecnt;
for (samplecnt = 0; samplecnt < NUM_SAMPLES ; samplecnt++)
{
@ -1027,7 +1038,8 @@ int GetDMADelay(int Step)
//usleep(500); //Wait to be sure DMA is running stable
int i;
int SumDelay=0;
for(i=0;i<10;i++)
int NbLoopToAverage=1;
for(i=0;i<NbLoopToAverage;i++)
{
@ -1052,7 +1064,7 @@ int GetDMADelay(int Step)
clock_gettime(CLOCK_REALTIME, &gettime_now);
}
while(free_slots<=NUM_SAMPLES*0.6);
while(free_slots<=NUM_SAMPLES*0.4);
@ -1072,10 +1084,10 @@ int GetDMADelay(int Step)
dma_reg[DMA_CS+DMA_CHANNEL*0x40] |= DMA_CS_RESET; //BCM2708_DMA_ABORT|BCM2708_DMA_RESET;
udelay(100);
return SumDelay/10;
return SumDelay/NbLoopToAverage;
}
int CalibrateSystem(int *ppm,int *BaseDelayDMA,float *StepDelayDMA)
int CalibrateSystem(double *ppm,int *BaseDelayDMA,float *StepDelayDMA)
{
struct timex ntx;
int status;
@ -1085,7 +1097,7 @@ int CalibrateSystem(int *ppm,int *BaseDelayDMA,float *StepDelayDMA)
ntx.modes = 0; /* only read */
status = ntp_adjtime(&ntx);
double clockppm;
switch(info.model)
{
@ -1119,20 +1131,22 @@ int CalibrateSystem(int *ppm,int *BaseDelayDMA,float *StepDelayDMA)
REAL x[PWM_STEP_MAXI];
REAL y[PWM_STEP_MAXI];
/*
int hFileCsv;
hFileCsv=open("calib.csv",O_CREAT | O_WRONLY);
printf("Performs calibration ");
for(i=1;i<PWM_STEP_MAXI;i+=1)
{
int Delay=GetDMADelay(i);
printf("Step %d :%d \n",i,Delay);//,(GetDMADelay(i)-BaseDelay)/i);
//printf("Step %d :%d \n",i,Delay);//,(GetDMADelay(i)-BaseDelay)/i);
sprintf(csvline,"CalibrationTab[%d]=%d;\n",i,Delay);
CalibrationTab[i]=Delay;
write(hFileCsv,csvline,strlen(csvline));
}*/
if((i%10)==0)printf(".");fflush(stdout);
}
printf("\n");
REAL m,b,r;
for(i=1;i<PWM_STEP_MAXI;i++)
@ -1158,7 +1172,7 @@ int CalibrateSystem(int *ppm,int *BaseDelayDMA,float *StepDelayDMA)
DelayStep=Sum[0]/NumberToAverage;
DelayMini=Sum[1]/NumberToAverage;
printf("DMA Delay Step =%f Delay =%f\n",DelayStep,DelayMini);
//printf("DMA Delay Step =%f Delay =%f\n",DelayStep,DelayMini);
return 1;
}
@ -1186,13 +1200,13 @@ int pitx_init(int SampleRate, double TuningFrequency, int* skipSignals,int SetDm
InitGpio();
InitDma(terminate, skipSignals);
if(SetDma) DMA_CHANNEL=SetDma;
printf("---------------- Init %f\n",TuningFrequency);
SetupGpioClock(SampleRate,TuningFrequency);
InitShuffle();
//int FREQ_MINI_TIMING=157;
//int PWMF_MARGIN = 1120; //A Margin for now at 1us with PCM ->OK
if(CalibrateSystem(&globalppmpll,&PWMF_MARGIN,&FREQ_MINI_TIMING)) printf("Calibrate : ppm=%d DMA %fns:%fns\n",globalppmpll,DelayStep,DelayMini);
if(CalibrateSystem(&globalppmpll,&PWMF_MARGIN,&FREQ_MINI_TIMING)) printf("Calibrate : ppm=%f DMA %fns:%fns\n",globalppmpll,DelayStep,DelayMini);
//printf("Timing : 1 cyle=%dns 1sample=%dns\n",NBSAMPLES_PWM_FREQ_MAX*400*3,(int)(1e9/(float)SampleRate));
return 1;
}
@ -1462,7 +1476,7 @@ int pitx_run(
pitx_init(SampleRate, GlobalTuningFrequency/HarmonicNumber, skipSignals,SetDma);
//Correct PLL Frequency
if(ppmpll==0) ppmpll=(float)-globalppmpll; // Use calibrate only if not setting by user
if(ppmpll==0) ppmpll=-globalppmpll; // Use calibrate only if not setting by user
PllUsed+=(PllUsed * ppmpll) / 1000000.0;
//printf("PLL ppm=%f -> PllUsed %u\n",ppmpll,PllUsed);
@ -1774,13 +1788,14 @@ int pitx_run(
//printf("TimeRemaining %d WaitSample %d\n",TimeRemaining,WaitSample);
if(Mode==MODE_RF)
{
/*if(SampleRf.Frequency==0.0)
//Need to fix : in FM need a constant carrier, in SSTV need sometimes to pause
if(SampleRf.Frequency==0.0)
{
amp=0;
SampleRf.Frequency=00.0;// TODO change that ugly frequency
}
else*/
else
amp=32767;
FrequencyAmplitudeToRegister2((SampleRf.Frequency/HarmonicNumber+GlobalTuningFrequency)/HarmonicNumber,amp,last_sample++,WaitSample,0,NoUsePwmFrequency,debug);
}
@ -1809,7 +1824,7 @@ int pitx_run(
{
CompteSample++;
if(CompteSample==327670) Up=0;
// if(CompteSample==327670) Up=0;
}
else
{
@ -1819,7 +1834,7 @@ int pitx_run(
debug=1;//(debug+1)%2;
//OutputPower=((CompteSample/50)%2)*32767;
uint32_t RealWait=FrequencyAmplitudeToRegister2(GlobalTuningFrequency/HarmonicNumber+(CompteSample*0.05),OutputPower,last_sample++,20000,0,NoUsePwmFrequency,debug);
uint32_t RealWait=FrequencyAmplitudeToRegister2(GlobalTuningFrequency/HarmonicNumber+(CompteSample*0.00),OutputPower,last_sample++,10000,0,NoUsePwmFrequency,debug);
//printf("RealWait %d\n",(CompteSample/100)%15000+5000);
free_slots--;
//printf("%f \n",GlobalTuningFrequency+(((CompteSample/10)*1)%50000));

View File

@ -1,202 +1,202 @@
void InitCalibrationTabPi3(void)
{
CalibrationTab[1]=1280;
CalibrationTab[2]=1533;
CalibrationTab[3]=1786;
CalibrationTab[4]=2028;
CalibrationTab[5]=2289;
CalibrationTab[6]=2527;
CalibrationTab[7]=2739;
CalibrationTab[8]=2957;
CalibrationTab[9]=3158;
CalibrationTab[10]=3367;
CalibrationTab[11]=3556;
CalibrationTab[12]=3772;
CalibrationTab[13]=3941;
CalibrationTab[14]=4160;
CalibrationTab[15]=4348;
CalibrationTab[16]=4556;
CalibrationTab[17]=4760;
CalibrationTab[18]=4927;
CalibrationTab[19]=5097;
CalibrationTab[20]=5272;
CalibrationTab[21]=5391;
CalibrationTab[22]=5567;
CalibrationTab[23]=5752;
CalibrationTab[24]=5871;
CalibrationTab[25]=6039;
CalibrationTab[26]=6201;
CalibrationTab[27]=6340;
CalibrationTab[28]=6495;
CalibrationTab[29]=6672;
CalibrationTab[30]=6835;
CalibrationTab[31]=7029;
CalibrationTab[32]=7117;
CalibrationTab[33]=7298;
CalibrationTab[34]=7462;
CalibrationTab[35]=7638;
CalibrationTab[36]=7798;
CalibrationTab[37]=7914;
CalibrationTab[38]=8038;
CalibrationTab[39]=8227;
CalibrationTab[40]=8399;
CalibrationTab[41]=8550;
CalibrationTab[42]=8721;
CalibrationTab[43]=8894;
CalibrationTab[44]=9050;
CalibrationTab[45]=9162;
CalibrationTab[46]=9331;
CalibrationTab[47]=9504;
CalibrationTab[48]=9663;
CalibrationTab[49]=9812;
CalibrationTab[50]=9976;
CalibrationTab[51]=10135;
CalibrationTab[52]=10307;
CalibrationTab[53]=10538;
CalibrationTab[54]=10576;
CalibrationTab[55]=10737;
CalibrationTab[56]=10914;
CalibrationTab[57]=11077;
CalibrationTab[58]=11237;
CalibrationTab[59]=11412;
CalibrationTab[60]=11544;
CalibrationTab[61]=11697;
CalibrationTab[62]=11859;
CalibrationTab[63]=12008;
CalibrationTab[64]=12183;
CalibrationTab[65]=12347;
CalibrationTab[66]=12534;
CalibrationTab[67]=12670;
CalibrationTab[68]=12762;
CalibrationTab[69]=12949;
CalibrationTab[70]=13116;
CalibrationTab[71]=13277;
CalibrationTab[72]=13444;
CalibrationTab[73]=13592;
CalibrationTab[74]=13757;
CalibrationTab[75]=13929;
CalibrationTab[76]=14084;
CalibrationTab[77]=14196;
CalibrationTab[78]=14381;
CalibrationTab[79]=14558;
CalibrationTab[80]=14682;
CalibrationTab[81]=14862;
CalibrationTab[82]=15009;
CalibrationTab[83]=15188;
CalibrationTab[84]=15344;
CalibrationTab[85]=15537;
CalibrationTab[86]=15722;
CalibrationTab[87]=15831;
CalibrationTab[88]=15875;
CalibrationTab[89]=16074;
CalibrationTab[90]=16248;
CalibrationTab[91]=16427;
CalibrationTab[92]=16575;
CalibrationTab[93]=16751;
CalibrationTab[94]=16908;
CalibrationTab[95]=17068;
CalibrationTab[96]=17234;
CalibrationTab[97]=17351;
CalibrationTab[98]=17523;
CalibrationTab[99]=17700;
CalibrationTab[100]=17863;
CalibrationTab[101]=18061;
CalibrationTab[102]=18130;
CalibrationTab[103]=18308;
CalibrationTab[104]=18486;
CalibrationTab[105]=18646;
CalibrationTab[106]=18800;
CalibrationTab[107]=18998;
CalibrationTab[108]=19093;
CalibrationTab[109]=19265;
CalibrationTab[110]=19454;
CalibrationTab[111]=19557;
CalibrationTab[112]=19719;
CalibrationTab[113]=19895;
CalibrationTab[114]=20049;
CalibrationTab[115]=20217;
CalibrationTab[116]=20374;
CalibrationTab[117]=20540;
CalibrationTab[118]=20718;
CalibrationTab[119]=20926;
CalibrationTab[120]=21103;
CalibrationTab[121]=21150;
CalibrationTab[122]=21212;
CalibrationTab[123]=21447;
CalibrationTab[124]=21614;
CalibrationTab[125]=21776;
CalibrationTab[126]=21939;
CalibrationTab[127]=22096;
CalibrationTab[128]=22260;
CalibrationTab[129]=22418;
CalibrationTab[130]=22586;
CalibrationTab[131]=22737;
CalibrationTab[132]=22908;
CalibrationTab[133]=23056;
CalibrationTab[134]=23206;
CalibrationTab[135]=23361;
CalibrationTab[136]=23522;
CalibrationTab[137]=23725;
CalibrationTab[138]=23792;
CalibrationTab[139]=23973;
CalibrationTab[140]=24146;
CalibrationTab[141]=24311;
CalibrationTab[142]=24449;
CalibrationTab[143]=24616;
CalibrationTab[144]=24782;
CalibrationTab[145]=24942;
CalibrationTab[146]=25115;
CalibrationTab[147]=25330;
CalibrationTab[148]=25383;
CalibrationTab[149]=25526;
CalibrationTab[150]=25712;
CalibrationTab[151]=25881;
CalibrationTab[152]=26043;
CalibrationTab[153]=26201;
CalibrationTab[154]=26375;
CalibrationTab[155]=26496;
CalibrationTab[156]=26672;
CalibrationTab[157]=26842;
CalibrationTab[158]=27017;
CalibrationTab[159]=27165;
CalibrationTab[160]=27287;
CalibrationTab[161]=27433;
CalibrationTab[162]=27597;
CalibrationTab[163]=27764;
CalibrationTab[164]=27939;
CalibrationTab[165]=28094;
CalibrationTab[166]=28212;
CalibrationTab[167]=28385;
CalibrationTab[168]=28560;
CalibrationTab[169]=28717;
CalibrationTab[170]=28856;
CalibrationTab[171]=29027;
CalibrationTab[172]=29213;
CalibrationTab[173]=29322;
CalibrationTab[174]=29509;
CalibrationTab[175]=29651;
CalibrationTab[176]=29834;
CalibrationTab[177]=29963;
CalibrationTab[178]=30142;
CalibrationTab[179]=30297;
CalibrationTab[180]=30470;
CalibrationTab[181]=30609;
CalibrationTab[182]=30792;
CalibrationTab[183]=30953;
CalibrationTab[184]=31129;
CalibrationTab[185]=31322;
CalibrationTab[186]=31598;
CalibrationTab[187]=31656;
CalibrationTab[188]=31707;
CalibrationTab[189]=31777;
CalibrationTab[190]=31917;
CalibrationTab[191]=32145;
CalibrationTab[192]=32335;
CalibrationTab[193]=32465;
CalibrationTab[194]=32648;
CalibrationTab[195]=32803;
CalibrationTab[196]=32980;
CalibrationTab[197]=33105;
CalibrationTab[198]=33288;
CalibrationTab[199]=33439;}
CalibrationTab[1]=1260;
CalibrationTab[2]=1509;
CalibrationTab[3]=1761;
CalibrationTab[4]=1998;
CalibrationTab[5]=2255;
CalibrationTab[6]=2490;
CalibrationTab[7]=2702;
CalibrationTab[8]=2919;
CalibrationTab[9]=3111;
CalibrationTab[10]=3319;
CalibrationTab[11]=3515;
CalibrationTab[12]=3732;
CalibrationTab[13]=3900;
CalibrationTab[14]=4100;
CalibrationTab[15]=4295;
CalibrationTab[16]=4510;
CalibrationTab[17]=4699;
CalibrationTab[18]=4881;
CalibrationTab[19]=5033;
CalibrationTab[20]=5191;
CalibrationTab[21]=5344;
CalibrationTab[22]=5501;
CalibrationTab[23]=5658;
CalibrationTab[24]=5849;
CalibrationTab[25]=5974;
CalibrationTab[26]=6121;
CalibrationTab[27]=6288;
CalibrationTab[28]=6443;
CalibrationTab[29]=6599;
CalibrationTab[30]=6757;
CalibrationTab[31]=6911;
CalibrationTab[32]=7072;
CalibrationTab[33]=7231;
CalibrationTab[34]=7386;
CalibrationTab[35]=7547;
CalibrationTab[36]=7715;
CalibrationTab[37]=7811;
CalibrationTab[38]=7989;
CalibrationTab[39]=8149;
CalibrationTab[40]=8311;
CalibrationTab[41]=8470;
CalibrationTab[42]=8630;
CalibrationTab[43]=8785;
CalibrationTab[44]=8940;
CalibrationTab[45]=9100;
CalibrationTab[46]=9254;
CalibrationTab[47]=9407;
CalibrationTab[48]=9566;
CalibrationTab[49]=9751;
CalibrationTab[50]=9881;
CalibrationTab[51]=10029;
CalibrationTab[52]=10192;
CalibrationTab[53]=10350;
CalibrationTab[54]=10504;
CalibrationTab[55]=10661;
CalibrationTab[56]=10816;
CalibrationTab[57]=10977;
CalibrationTab[58]=11136;
CalibrationTab[59]=11293;
CalibrationTab[60]=11448;
CalibrationTab[61]=11617;
CalibrationTab[62]=11716;
CalibrationTab[63]=11895;
CalibrationTab[64]=12056;
CalibrationTab[65]=12214;
CalibrationTab[66]=12374;
CalibrationTab[67]=12534;
CalibrationTab[68]=12691;
CalibrationTab[69]=12848;
CalibrationTab[70]=13007;
CalibrationTab[71]=13162;
CalibrationTab[72]=13314;
CalibrationTab[73]=13473;
CalibrationTab[74]=13651;
CalibrationTab[75]=13788;
CalibrationTab[76]=13936;
CalibrationTab[77]=14099;
CalibrationTab[78]=14257;
CalibrationTab[79]=14409;
CalibrationTab[80]=14568;
CalibrationTab[81]=14724;
CalibrationTab[82]=14885;
CalibrationTab[83]=15041;
CalibrationTab[84]=15200;
CalibrationTab[85]=15357;
CalibrationTab[86]=15522;
CalibrationTab[87]=15624;
CalibrationTab[88]=15803;
CalibrationTab[89]=15962;
CalibrationTab[90]=16117;
CalibrationTab[91]=16276;
CalibrationTab[92]=16438;
CalibrationTab[93]=16596;
CalibrationTab[94]=16755;
CalibrationTab[95]=16918;
CalibrationTab[96]=17070;
CalibrationTab[97]=17220;
CalibrationTab[98]=17378;
CalibrationTab[99]=17553;
CalibrationTab[100]=17695;
CalibrationTab[101]=17843;
CalibrationTab[102]=18005;
CalibrationTab[103]=18161;
CalibrationTab[104]=18313;
CalibrationTab[105]=18478;
CalibrationTab[106]=18630;
CalibrationTab[107]=18792;
CalibrationTab[108]=18945;
CalibrationTab[109]=19104;
CalibrationTab[110]=19266;
CalibrationTab[111]=19436;
CalibrationTab[112]=19534;
CalibrationTab[113]=19711;
CalibrationTab[114]=19870;
CalibrationTab[115]=20024;
CalibrationTab[116]=20183;
CalibrationTab[117]=20342;
CalibrationTab[118]=20501;
CalibrationTab[119]=20661;
CalibrationTab[120]=20819;
CalibrationTab[121]=20977;
CalibrationTab[122]=21131;
CalibrationTab[123]=21282;
CalibrationTab[124]=21454;
CalibrationTab[125]=21599;
CalibrationTab[126]=21751;
CalibrationTab[127]=21912;
CalibrationTab[128]=22068;
CalibrationTab[129]=22220;
CalibrationTab[130]=22380;
CalibrationTab[131]=22540;
CalibrationTab[132]=22695;
CalibrationTab[133]=22854;
CalibrationTab[134]=23008;
CalibrationTab[135]=23174;
CalibrationTab[136]=23347;
CalibrationTab[137]=23440;
CalibrationTab[138]=23618;
CalibrationTab[139]=23776;
CalibrationTab[140]=23932;
CalibrationTab[141]=24091;
CalibrationTab[142]=24251;
CalibrationTab[143]=24403;
CalibrationTab[144]=24563;
CalibrationTab[145]=24722;
CalibrationTab[146]=24883;
CalibrationTab[147]=25035;
CalibrationTab[148]=25188;
CalibrationTab[149]=25361;
CalibrationTab[150]=25506;
CalibrationTab[151]=25656;
CalibrationTab[152]=25818;
CalibrationTab[153]=25977;
CalibrationTab[154]=26130;
CalibrationTab[155]=26287;
CalibrationTab[156]=26447;
CalibrationTab[157]=26597;
CalibrationTab[158]=26764;
CalibrationTab[159]=26915;
CalibrationTab[160]=27082;
CalibrationTab[161]=27262;
CalibrationTab[162]=27343;
CalibrationTab[163]=27520;
CalibrationTab[164]=27683;
CalibrationTab[165]=27839;
CalibrationTab[166]=28000;
CalibrationTab[167]=28158;
CalibrationTab[168]=28308;
CalibrationTab[169]=28469;
CalibrationTab[170]=28629;
CalibrationTab[171]=28786;
CalibrationTab[172]=28945;
CalibrationTab[173]=29095;
CalibrationTab[174]=29261;
CalibrationTab[175]=29413;
CalibrationTab[176]=29563;
CalibrationTab[177]=29726;
CalibrationTab[178]=29883;
CalibrationTab[179]=30037;
CalibrationTab[180]=30196;
CalibrationTab[181]=30353;
CalibrationTab[182]=30499;
CalibrationTab[183]=30668;
CalibrationTab[184]=30822;
CalibrationTab[185]=30987;
CalibrationTab[186]=31164;
CalibrationTab[187]=31247;
CalibrationTab[188]=31427;
CalibrationTab[189]=31589;
CalibrationTab[190]=31750;
CalibrationTab[191]=31906;
CalibrationTab[192]=32063;
CalibrationTab[193]=32215;
CalibrationTab[194]=32378;
CalibrationTab[195]=32533;
CalibrationTab[196]=32690;
CalibrationTab[197]=32848;
CalibrationTab[198]=33004;
CalibrationTab[199]=33164;}

View File

@ -93,7 +93,7 @@ void addvistrailer ()
void ProcessMartin1()
{
static uint32_t FrequencyMartin1[3]={1200,1500,1500};
static uint32_t TimingMartin1[3]={48720,5720,4576};
static uint32_t TimingMartin1[3]={48620,5720,4576};
int EndOfPicture=0;
int NbRead=0;
@ -156,6 +156,12 @@ int main(int argc, char **argv)
}
ProcessMartin1();
/*int i;
for(i=0;i<320*240;i++)
{
playtone(1200,5720);
playtone(0,5720);
}*/
close(FilePicture);
close(FileFreqTiming);
return 0;

BIN
testcard.rgb Normal file

Binary file not shown.