Add NTP ppm calibration
This commit is contained in:
parent
58adc4a97e
commit
e608ff8936
3 changed files with 48 additions and 9 deletions
|
@ -23,6 +23,7 @@ void SimpleTest(uint64_t Freq)
|
|||
clk.print_clock_tree();
|
||||
clk.SetPllNumber(clk_plld,1);
|
||||
clk.SetAdvancedPllMode(true);
|
||||
//clk.Setppm(+7.7);
|
||||
clk.SetCenterFrequency(Freq,1000);
|
||||
double freqresolution=clk.GetFrequencyResolution();
|
||||
double RealFreq=clk.GetRealFrequency(0);
|
||||
|
@ -30,6 +31,7 @@ void SimpleTest(uint64_t Freq)
|
|||
int Deviation=0;
|
||||
clk.SetFrequency(000);
|
||||
clk.enableclk(4);
|
||||
|
||||
while(running)
|
||||
{
|
||||
clk.SetFrequency(000);
|
||||
|
@ -37,9 +39,10 @@ void SimpleTest(uint64_t Freq)
|
|||
clk.SetFrequency(freqresolution);
|
||||
sleep(5);
|
||||
}
|
||||
/*for(int i=0;i<100000;i+=1)
|
||||
/*
|
||||
for(int i=0;i<100000;i+=1)
|
||||
{
|
||||
clk.SetFrequency(i);
|
||||
clk.SetFrequency(0);
|
||||
usleep(1000);
|
||||
}*/
|
||||
clk.disableclk(4);
|
||||
|
@ -342,13 +345,13 @@ int main(int argc, char* argv[])
|
|||
sigaction(i, &sa, NULL);
|
||||
}
|
||||
|
||||
//SimpleTest(Freq);
|
||||
SimpleTest(Freq);
|
||||
//SimpleTestbpsk(Freq);
|
||||
//SimpleTestFileIQ(Freq);
|
||||
//SimpleTestDMA(Freq);
|
||||
//SimpleTestAm(Freq);
|
||||
//SimpleTestOOK(Freq);
|
||||
SimpleTestBurstFsk(Freq);
|
||||
//SimpleTestBurstFsk(Freq);
|
||||
|
||||
}
|
||||
|
||||
|
|
41
src/gpio.cpp
41
src/gpio.cpp
|
@ -24,6 +24,8 @@ extern "C"
|
|||
#include "raspberry_pi_revision.h"
|
||||
#include "stdio.h"
|
||||
#include <unistd.h>
|
||||
#include <sys/timex.h>
|
||||
#include <math.h>
|
||||
|
||||
gpio::gpio(uint32_t base, uint32_t len)
|
||||
{
|
||||
|
@ -62,7 +64,7 @@ dmagpio::dmagpio():gpio(GetPeripheralBase()+DMA_BASE,DMA_LEN)
|
|||
// ***************** CLK Registers *****************************************
|
||||
clkgpio::clkgpio():gpio(GetPeripheralBase()+CLK_BASE,CLK_LEN)
|
||||
{
|
||||
|
||||
SetppmFromNTP();
|
||||
}
|
||||
|
||||
clkgpio::~clkgpio()
|
||||
|
@ -123,7 +125,7 @@ int clkgpio::SetClkDivFrac(uint32_t Div,uint32_t Frac)
|
|||
int clkgpio::SetMasterMultFrac(uint32_t Mult,uint32_t Frac)
|
||||
{
|
||||
|
||||
fprintf(stderr,"Master Mult %d Frac %d\n",Mult,Frac);
|
||||
//fprintf(stderr,"Master Mult %d Frac %d\n",Mult,Frac);
|
||||
gpioreg[PLLA_CTRL] = (0x5a<<24) | (0x21<<12) | Mult;
|
||||
usleep(100);
|
||||
gpioreg[PLLA_FRAC]= 0x5A000000 | Frac ;
|
||||
|
@ -136,7 +138,7 @@ int clkgpio::SetFrequency(double Frequency)
|
|||
{
|
||||
if(ModulateFromMasterPLL)
|
||||
{
|
||||
double FloatMult=((double)(CentralFrequency+Frequency)*PllFixDivider)/(double)(XOSC_FREQUENCY);
|
||||
double FloatMult=((double)(CentralFrequency+Frequency)*PllFixDivider)/((double)(XOSC_FREQUENCY)*(1-clk_ppm*1e-6)); // -ppm : compensate ppm
|
||||
uint32_t freqctl = FloatMult*((double)(1<<20)) ;
|
||||
int IntMultiply= freqctl>>20; // Need to be calculated to have a center frequency
|
||||
freqctl&=0xFFFFF; // Fractionnal is 20bits
|
||||
|
@ -165,7 +167,7 @@ uint32_t clkgpio::GetMasterFrac(double Frequency)
|
|||
{
|
||||
if(ModulateFromMasterPLL)
|
||||
{
|
||||
double FloatMult=((double)(CentralFrequency+Frequency)*PllFixDivider)/(double)(XOSC_FREQUENCY);
|
||||
double FloatMult=((double)(CentralFrequency+Frequency)*PllFixDivider)/((double)(XOSC_FREQUENCY)*(1-clk_ppm*1e-6));
|
||||
uint32_t freqctl = FloatMult*((double)(1<<20)) ;
|
||||
int IntMultiply= freqctl>>20; // Need to be calculated to have a center frequency
|
||||
freqctl&=0xFFFFF; // Fractionnal is 20bits
|
||||
|
@ -457,6 +459,37 @@ void clkgpio::disableclk(int gpio)
|
|||
|
||||
}
|
||||
|
||||
void clkgpio::Setppm(double ppm)
|
||||
{
|
||||
clk_ppm=ppm-2.0; // -2 is empiric : FixMe
|
||||
}
|
||||
|
||||
void clkgpio::SetppmFromNTP()
|
||||
{
|
||||
struct timex ntx;
|
||||
int status;
|
||||
//Calibrate Clock system (surely depends also on PLL PPM
|
||||
// =====================================================
|
||||
|
||||
ntx.modes = 0; /* only read */
|
||||
status = ntp_adjtime(&ntx);
|
||||
double ntp_ppm;
|
||||
|
||||
if (status != TIME_OK)
|
||||
{
|
||||
fprintf(stderr,"Warning: NTP calibrate failed\n");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
ntp_ppm = (double)ntx.freq/(double)(1 << 16);
|
||||
fprintf(stderr,"Info:NTP find ppm=%f\n",ntp_ppm);
|
||||
if(fabs(ntp_ppm)<200)
|
||||
Setppm(ntp_ppm);
|
||||
}
|
||||
}
|
||||
|
||||
// ************************************** GENERAL GPIO *****************************************************
|
||||
|
||||
generalgpio::generalgpio():gpio(GetPeripheralBase()+GENERAL_BASE,GENERAL_LEN)
|
||||
|
|
|
@ -148,6 +148,7 @@ class clkgpio:public gpio
|
|||
bool ModulateFromMasterPLL=false;
|
||||
uint64_t CentralFrequency=0;
|
||||
generalgpio gengpio;
|
||||
double clk_ppm=0;
|
||||
public:
|
||||
int PllFixDivider=8; //Fix divider from the master clock in advanced mode
|
||||
|
||||
|
@ -168,6 +169,8 @@ class clkgpio:public gpio
|
|||
uint32_t GetMasterFrac(double Frequency);
|
||||
void enableclk(int gpio);
|
||||
void disableclk(int gpio);
|
||||
void Setppm(double ppm);
|
||||
void SetppmFromNTP();
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue