Commit 09ecc607dab6561abeb414705310f22a061517de
1 parent
dfa91a3bc3
Exists in
master
mise a jour avec la lib dans paulo bachir/lib
Showing 3 changed files with 1268 additions and 3 deletions Inline Diff
include/ad9915.h
/* | 1 | 1 | /* | |
dds initialisation et SPI | 2 | 2 | dds initialisation et SPI | |
*/ | 3 | 3 | */ | |
4 | 4 | |||
#include <stdint.h> | 5 | 5 | #include <stdint.h> | |
#include <unistd.h> | 6 | 6 | #include <unistd.h> | |
#include <stdio.h> | 7 | 7 | #include <stdio.h> | |
#include <stdlib.h> | 8 | 8 | #include <stdlib.h> | |
#include <getopt.h> | 9 | 9 | #include <getopt.h> | |
#include <fcntl.h> | 10 | 10 | #include <fcntl.h> | |
#include <sys/ioctl.h> | 11 | 11 | #include <sys/ioctl.h> | |
#include <linux/types.h> | 12 | 12 | #include <linux/types.h> | |
#include <linux/spi/spidev.h> | 13 | 13 | #include <linux/spi/spidev.h> | |
/* memory management */ | 14 | 14 | /* memory management */ | |
#include <sys/mman.h> | 15 | 15 | #include <sys/mman.h> | |
#include "spi.h" | 16 | 16 | #include "spi.h" | |
#include <string.h> | 17 | 17 | #include <string.h> | |
#include <math.h> | 18 | 18 | #include <math.h> | |
#include <time.h> | 19 | 19 | #include <time.h> | |
20 | 20 | |||
21 | 21 | |||
static const char CFRAddress[] = {0x00,0x01,0x02,0x03}; | 22 | 22 | static const char CFRAddress[] = {0x00,0x01,0x02,0x03}; | |
23 | 23 | |||
static const char CFR1Start[] ={0x00, 0x01, 0x00, 0x0a}; | 24 | 24 | static const char CFR1Start[] ={0x00, 0x01, 0x00, 0x0a}; | |
//static const char CFR1Start[] ={0x00, 0x01, 0x01, 0x08}; //with osk enable | 25 | 25 | //static const char CFR1Start[] ={0x00, 0x01, 0x01, 0x08}; //with osk enable | |
static const char CFR2Start[] ={0x00, 0x80, 0x09, 0x00}; //0x80 enable prof mode | 26 | 26 | static const char CFR2Start[] ={0x00, 0x80, 0x09, 0x00}; //0x80 enable prof mode | |
static const char CFR3Start[] = {0x00, 0x00, 0x19, 0x1C}; | 27 | 27 | static const char CFR3Start[] = {0x00, 0x00, 0x19, 0x1C}; | |
static const char CFR4Start[] = {0x00, 0x05, 0x21, 0x20}; | 28 | 28 | static const char CFR4Start[] = {0x00, 0x05, 0x21, 0x20}; | |
29 | //static const char CFR4Start[] = {0x20, 0x21, 0x05, 0x00}; | |||
29 | 30 | |||
31 | ||||
static const char USR0Address = 0x1B; | 30 | 32 | static const char USR0Address = 0x1B; | |
static const char FTW0Address = 0x0b; //profile 0 ftw | 31 | 33 | static const char FTW0Address = 0x0b; //profile 0 ftw | |
static const char PA0Address = 0x0c; //profile 0 | 32 | 34 | static const char PA0Address = 0x0c; //profile 0 | |
33 | 35 | |||
static const char DACCalEnable[] = {0x01, 0x05, 0x21, 0x20}; //Command to enable the DAC Cal, should be 0x01XXXXXX, where X is the last 6 digits of CFR4Start | 34 | 36 | static const char DACCalEnable[] = {0x01, 0x05, 0x21, 0x20}; //Command to enable the DAC Cal, should be 0x01XXXXXX, where X is the last 6 digits of CFR4Start | |
35 | 37 | |||
36 | 38 | |||
void Send_Reset(int f_dds); | 37 | 39 | void Send_Reset(int f_dds); | |
void Send_IO_Update (int f_dds); //Send the update to set the control registers | 38 | 40 | void Send_IO_Update (int f_dds); //Send the update to set the control registers | |
void write_register (int fd, unsigned char addr, unsigned char d3, unsigned char d2, unsigned char d1, unsigned char d0); | 39 | 41 | void write_register (int fd, unsigned char addr, unsigned char d3, unsigned char d2, unsigned char d1, unsigned char d0); | |
42 | void read_register (int fd, unsigned char addr, uint32_t *readword); | |||
43 | void read_register_ini (int fd,unsigned char addr); | |||
void Initialize_DDS (int fd, int f_dds); | 40 | 44 | void Initialize_DDS (int fd, int f_dds); | |
void Calibrate_DAC(int fd, int f_dds); | 41 | 45 | void Calibrate_DAC(int fd, int f_dds); | |
void basic_setup(int fd, int f_dds, uint16_t ampWord, uint16_t phaseWord); | 42 | 46 | void basic_setup(int fd, int f_dds, uint16_t ampWord, uint16_t phaseWord); | |
void modulus_setup(int fd, int f_dds); | 43 | 47 | void modulus_setup(int fd, int f_dds); | |
void setFreqMM(int fd, int f_dds, unsigned int ftw, unsigned int A, unsigned int B); | 44 | 48 | void setFreqMM(int fd, int f_dds, unsigned int ftw, unsigned int A, unsigned int B); | |
void setAmpPhaseWord(int fd, int f_dds,unsigned int phaseAmpWord); | 45 | 49 | void setAmpPhaseWord(int fd, int f_dds,unsigned int phaseAmpWord); | |
50 | void checkSize(void); | |||
int openAndSetDdsFreq( char * device, char * gpio_update, double f_clk, double f_out, uint16_t ampWord, uint16_t phaseWord); | 46 | 51 | int openAndSetDdsFreq( char * device, char * gpio_update, double f_clk, double f_out, uint16_t ampWord, uint16_t phaseWord); | |
int receiveParameterFromPythonServer(char * device, double f_clk, double f_out); | 47 | 52 | int receiveParameterFromPythonServer(char * device, double f_clk, double f_out); | |
int setDdsFreqFull ( int fd, int f_dds, double f_clk, double f_out, uint16_t ampWord, uint16_t phaseWord); | 48 | 53 | int setDdsFreqFull ( int fd, int f_dds, double f_clk, double f_out, uint16_t ampWord, uint16_t phaseWord); | |
54 | ||||
55 | //------------ DRCTL | |||
56 | ||||
57 | void Send_CTRL_UP(int fp); | |||
58 | void Send_CTRL_DOWN(int fp); | |||
59 | void Send_HOLD(int fp); | |||
60 | void Send_UNHOLD(int fp); | |||
61 | int testRampFreq(int fd, int f_dds, int fp); | |||
62 | ||||
63 | //-------Profile register mode | |||
64 | ||||
65 | int InitialisationProfile (int fd,int f_dds); | |||
66 | int PutFrequencyAmpPhaseWord(int fd, int f_dds, double fout, double fclk,double amp, double phase); | |||
67 | ||||
68 | ||||
69 | int PutFrequencyWord(int fd, int f_dds, double freq);//Attention uniquement valable pour fclk = 1 GHz | |||
70 | int PutPhaseWord(int fd, int f_dds, double phase); | |||
71 | int PutAmpWord(int fd, int f_dds, double amplitude); | |||
72 | ||||
73 | //fonctions rampes hardwres | |||
74 | ||||
75 | int FrequencySweep (int fd, int f_dds,double fclk,double dfUp, double dfDown, double FreqMax,double FreqMin, double DeltaTimeUp, double DeltaTimeDown); | |||
76 | int ContinueFrequencySweep (int fd, int f_dds,double fclk,double dfUp, double dfDown, double FreqMax,double FreqMin, double DeltaTimeUp, double DeltaTimeDown); | |||
77 | int AmplitudeSweep (int fd, int f_dds,double fclk,double dAUp, double dADown, double AMax,double AMin, double DeltaTimeUp, double DeltaTimeDown); | |||
78 | int ContinueAmplitudeSweep (int fd, int f_dds,double fclk,double dAUp, double dADown, double AMax,double AMin, double DeltaTimeUp, double DeltaTimeDown); | |||
79 | int PhaseSweep (int fd, int f_dds,double fclk,double dphiUp, double dphiDown, double PhiMax,double PhiMin, double DeltaTimeUp, double DeltaTimeDown); | |||
80 | int ContinuePhaseSweep (int fd, int f_dds,double fclk,double dphiUp, double dphiDown, double PhiMax,double PhiMin, double DeltaTimeUp, double DeltaTimeDown); | |||
81 | ||||
82 | //fin fonctions rampes hardwares | |||
83 | ||||
84 | // fonctions rampes softwares | |||
85 | ||||
86 | int RampAmpFromSoft(int fd, int f_dds,double DeltaTimeUp,double AIni, double AFin); |
src/ad9915.c
/* | 1 | 1 | /* | |
SPI : initialisation du dds et communication SPI | 2 | 2 | SPI : initialisation du dds et communication SPI | |
*/ | 3 | 3 | */ | |
#include"ad9915.h" | 4 | 4 | #include"ad9915.h" | |
#include "spi.h" | 5 | 5 | #include "spi.h" | |
#include "ddsFreq.h" | 6 | 6 | #include "ddsFreq.h" | |
7 | 7 | |||
#define debug | 8 | 8 | #define debug | |
//fonction reset | 9 | 9 | //fonction reset | |
void Send_Reset(int f_dds) | 10 | 10 | void Send_Reset(int f_dds) | |
{ | 11 | 11 | { | |
char reset='2'; | 12 | 12 | char reset='2'; | |
write(f_dds,&reset,sizeof(reset)); //reset | 13 | 13 | write(f_dds,&reset,sizeof(reset)); //reset | |
sleep(0.1); | 14 | 14 | sleep(0.1); | |
} | 15 | 15 | } | |
16 | 16 | |||
//fonction ioupdate | 17 | 17 | //fonction ioupdate | |
void Send_IO_Update(int f_dds) | 18 | 18 | void Send_IO_Update(int f_dds) | |
{ | 19 | 19 | { | |
char update='1'; | 20 | 20 | char update='1'; | |
write(f_dds,&update,sizeof(update)); //reset | 21 | 21 | write(f_dds,&update,sizeof(update)); //reset | |
sleep(0.1); | 22 | 22 | sleep(0.1); | |
} | 23 | 23 | } | |
24 | 24 | |||
//fonction write register | 25 | 25 | //fonction write register | |
void write_register (int fd, unsigned char addr, unsigned char d3, unsigned char d2, unsigned char d1, unsigned char d0) | 26 | 26 | void write_register (int fd, unsigned char addr, unsigned char d3, unsigned char d2, unsigned char d1, unsigned char d0) | |
{ | 27 | 27 | { | |
unsigned char tx[5]={0}; | 28 | 28 | unsigned char tx[5]={0}; | |
tx[0]=addr; | 29 | 29 | tx[0]=addr; | |
tx[1]=d3; | 30 | 30 | tx[1]=d3; | |
tx[2]=d2; | 31 | 31 | tx[2]=d2; | |
tx[3]=d1; | 32 | 32 | tx[3]=d1; | |
tx[4]=d0; | 33 | 33 | tx[4]=d0; | |
//spi_put_multiple envoie le vecteur dans cet ordre | 34 | 34 | //spi_put_multiple envoie le vecteur dans cet ordre | |
//[tx0]-[tx1]-[tx2] -> adresse->bit poids Fort->bit poids faible | 35 | 35 | //[tx0]-[tx1]-[tx2] -> adresse->bit poids Fort->bit poids faible | |
spi_put_multiple(fd,tx,5,NULL,0); | 36 | 36 | spi_put_multiple(fd,tx,5,NULL,0); | |
} | 37 | 37 | } | |
38 | 38 | |||
39 | //fonction read register | |||
40 | ||||
41 | void read_register (int fd,unsigned char addr, uint32_t *readword) | |||
42 | { | |||
43 | unsigned char tx[1] = {0}; | |||
44 | unsigned char rx[4] = {0}; | |||
45 | addr = addr|0x80;//instruction byte for the read : 1000 0000 | byte_adress | |||
46 | tx[0]=addr; | |||
47 | spi_put_multiple(fd,tx,1,rx,4); | |||
48 | //printf("TX:%x RX:%x %x %x %x\n",tx[0],rx[0],rx[1],rx[2],rx[3]); | |||
49 | *readword = 0x00000000; | |||
50 | *readword = *readword|(rx[0]<<24); | |||
51 | *readword = *readword|(rx[1]<<16); | |||
52 | *readword = *readword|(rx[2]<<8); | |||
53 | *readword = *readword|rx[3]; | |||
54 | } | |||
55 | ||||
56 | //fonction read register | |||
57 | void read_register_ini (int fd, unsigned char addr) | |||
58 | { | |||
59 | unsigned char tx[1] = {0}; | |||
60 | unsigned char rx[4] = {0}; | |||
61 | addr = addr|0x80; | |||
62 | tx[0]=addr; | |||
63 | spi_put_multiple(fd,tx,1,rx,4); | |||
64 | printf("TX:%x RX:%x %x %x %x\n",tx[0],rx[0],rx[1],rx[2],rx[3]); | |||
65 | // Send_IO_Update (f_dds); //Send the update to set the control registers | |||
66 | } | |||
67 | ||||
//initialisation du dds | 39 | 68 | //initialisation du dds | |
void Initialize_DDS (int fd, int f_dds) | 40 | 69 | void Initialize_DDS (int fd, int f_dds) | |
{ | 41 | 70 | { | |
Send_Reset(f_dds); | 42 | 71 | Send_Reset(f_dds); | |
write_register(fd,CFRAddress[0],CFR1Start[0], CFR1Start[1], CFR1Start[2], CFR1Start[3]); | 43 | 72 | write_register(fd,CFRAddress[0],CFR1Start[0], CFR1Start[1], CFR1Start[2], CFR1Start[3]); | |
Send_IO_Update (f_dds); //Send the update to set the control registers | 44 | 73 | Send_IO_Update (f_dds); //Send the update to set the control registers | |
write_register(fd,CFRAddress[1], CFR2Start[0], CFR2Start[1], CFR2Start[2], CFR2Start[3]); | 45 | 74 | write_register(fd,CFRAddress[1], CFR2Start[0], CFR2Start[1], CFR2Start[2], CFR2Start[3]); | |
Send_IO_Update (f_dds); | 46 | 75 | Send_IO_Update (f_dds); | |
write_register(fd,CFRAddress[2], CFR3Start[0], CFR3Start[1], CFR3Start[2], CFR3Start[3]); | 47 | 76 | write_register(fd,CFRAddress[2], CFR3Start[0], CFR3Start[1], CFR3Start[2], CFR3Start[3]); | |
Send_IO_Update (f_dds); | 48 | 77 | Send_IO_Update (f_dds); | |
write_register(fd,CFRAddress[3], CFR4Start[0], CFR4Start[1], CFR4Start[2], CFR4Start[3]); | 49 | 78 | write_register(fd,CFRAddress[3], CFR4Start[0], CFR4Start[1], CFR4Start[2], CFR4Start[3]); | |
Send_IO_Update (f_dds); | 50 | 79 | Send_IO_Update (f_dds); | |
write_register(fd,USR0Address, 0xA2, 0x00, 0x08, 0x00); | 51 | 80 | write_register(fd,USR0Address, 0xA2, 0x00, 0x08, 0x00); | |
Send_IO_Update (f_dds); | 52 | 81 | Send_IO_Update (f_dds); | |
} | 53 | 82 | } | |
54 | 83 | |||
//calibration du dac | 55 | 84 | //calibration du dac | |
void Calibrate_DAC (int fd, int f_dds) | 56 | 85 | void Calibrate_DAC (int fd, int f_dds) | |
{ | 57 | 86 | { | |
write_register(fd,CFRAddress[3], DACCalEnable[0], DACCalEnable[1], DACCalEnable[2], DACCalEnable[3]); | 58 | 87 | write_register(fd,CFRAddress[3], DACCalEnable[0], DACCalEnable[1], DACCalEnable[2], DACCalEnable[3]); | |
Send_IO_Update (f_dds); | 59 | 88 | Send_IO_Update (f_dds); | |
write_register(fd,CFRAddress[3], CFR4Start[0], CFR4Start[1], CFR4Start[2], CFR4Start[3]); | 60 | 89 | write_register(fd,CFRAddress[3], CFR4Start[0], CFR4Start[1], CFR4Start[2], CFR4Start[3]); | |
Send_IO_Update (f_dds); | 61 | 90 | Send_IO_Update (f_dds); | |
} | 62 | 91 | } | |
63 | 92 | |||
void modulus_setup(int fd, int f_dds) | 64 | 93 | void modulus_setup(int fd, int f_dds) | |
{ | 65 | 94 | { | |
write_register(fd,0x00,0x00, 0x01, 0x01, 0x08); //OSK enable | 66 | 95 | write_register(fd,0x00,0x00, 0x01, 0x01, 0x0a); //OSK enable //0x08 | |
96 | //write_register(fd,0x00,0x00, 0x01, 0x01, 0x08); //OSK enable de base | |||
Send_IO_Update (f_dds); | 67 | 97 | Send_IO_Update (f_dds); | |
write_register(fd,0x01,0x00, 0x89, 0x09, 0x00); //enable program modulus and digital ramp | 68 | 98 | write_register(fd,0x01,0x00, 0x89, 0x09, 0x00); //enable program modulus and digital ramp | |
Send_IO_Update (f_dds); | 69 | 99 | Send_IO_Update (f_dds); | |
} | 70 | 100 | } | |
71 | 101 | |||
void basic_setup(int fd, int f_dds,uint16_t ampWord, uint16_t phaseWord) | 72 | 102 | void basic_setup(int fd, int f_dds,uint16_t ampWord, uint16_t phaseWord) | |
{ | 73 | 103 | { | |
write_register(fd,0x00,0x00, 0x01, 0x01, 0x08); //OSK enable | 74 | 104 | write_register(fd,0x00,0x00, 0x01, 0x01, 0x08); //OSK enable | |
Send_IO_Update (f_dds); | 75 | 105 | Send_IO_Update (f_dds); | |
write_register(fd,0x01,0x00, 0x89, 0x09, 0x00); //enable program modulus and digital ramp | 76 | 106 | write_register(fd,0x01,0x00, 0x89, 0x09, 0x00); //enable program modulus and digital ramp | |
Send_IO_Update (f_dds); | 77 | 107 | Send_IO_Update (f_dds); | |
write_register(fd,0x04,0x19, 0x99, 0x99, 0x99); //ftw | 78 | 108 | write_register(fd,0x04,0x19, 0x99, 0x99, 0x99); //ftw | |
Send_IO_Update (f_dds); | 79 | 109 | Send_IO_Update (f_dds); | |
write_register(fd,0x05,0xC0, 0x00, 0x00, 0x00); //A | 80 | 110 | write_register(fd,0x05,0xC0, 0x00, 0x00, 0x00); //A | |
Send_IO_Update (f_dds); | 81 | 111 | Send_IO_Update (f_dds); | |
write_register(fd,0x06,0x00, 0x00, 0x00, 0x05); //B | 82 | 112 | write_register(fd,0x06,0x00, 0x00, 0x00, 0x05); //B | |
Send_IO_Update (f_dds); | 83 | 113 | Send_IO_Update (f_dds); | |
//write_register(fd,0x0c, 0x0F, 0xFF, 0x00, 0x00); // amp (12b) ph(16) | 84 | 114 | //write_register(fd,0x0c, 0x0F, 0xFF, 0x00, 0x00); // amp (12b) ph(16) | |
write_register(fd,0x0c, (uint8_t)((ampWord>>8) & 0x0F), (uint8_t)(ampWord & 0xFF), (uint8_t)((phaseWord>>8) & 0xFF), (uint8_t)(phaseWord & 0xFF)); // amp (12b) ph(16) | 85 | 115 | write_register(fd,0x0c, (uint8_t)((ampWord>>8) & 0x0F), (uint8_t)(ampWord & 0xFF), (uint8_t)((phaseWord>>8) & 0xFF), (uint8_t)(phaseWord & 0xFF)); // amp (12b) ph(16) | |
Send_IO_Update (f_dds); | 86 | 116 | Send_IO_Update (f_dds); | |
} | 87 | 117 | } | |
88 | 118 | |||
void setFreqMM(int fd, int f_dds, unsigned int ftw, unsigned int A, unsigned int B) | 89 | 119 | void setFreqMM(int fd, int f_dds, unsigned int ftw, unsigned int A, unsigned int B) | |
{ | 90 | 120 | { | |
//uint16_t phaseWord = 0x7400; | 91 | 121 | //uint16_t phaseWord = 0x7400; | |
//uint16_t ampWord = (uint16_t)strtol(argv[4],NULL,0) & 0x0FFF ; //masque en 2 | 92 | 122 | //uint16_t ampWord = (uint16_t)strtol(argv[4],NULL,0) & 0x0FFF ; //masque en 2 | |
//uint16_t ampWord = 0x00000FFF; | 93 | 123 | //uint16_t ampWord = 0x00000FFF; | |
//uint32_t phaseAmpWord = phaseWord | ampWord<<16; | 94 | 124 | //uint32_t phaseAmpWord = phaseWord | ampWord<<16; | |
95 | 125 | |||
//write_register(fd,0x00,0x00, 0x01, 0x01, 0x08); //OSK enable | 96 | 126 | //write_register(fd,0x00,0x00, 0x01, 0x01, 0x08); //OSK enable | |
//Send_IO_Update(f_dds); | 97 | 127 | //Send_IO_Update(f_dds); | |
//write_register(fd,0x01,0x00, 0x89, 0x09, 0x00); //enable program modulus and digital ramp | 98 | 128 | //write_register(fd,0x01,0x00, 0x89, 0x09, 0x00); //enable program modulus and digital ramp | |
//Send_IO_Update(f_dds); | 99 | 129 | //Send_IO_Update(f_dds); | |
write_register(fd,0x04,ftw>>24&0xFF, ftw>>16&0xFF, ftw>>8&0xFF, ftw&0xFF); //ftw | 100 | 130 | write_register(fd,0x04,ftw>>24&0xFF, ftw>>16&0xFF, ftw>>8&0xFF, ftw&0xFF); //ftw | |
Send_IO_Update(f_dds); | 101 | 131 | Send_IO_Update(f_dds); | |
write_register(fd,0x05,A>>24&0xFF,A>>16&0xFF, A>>8&0xFF, A&0xFF); //A | 102 | 132 | write_register(fd,0x05,A>>24&0xFF,A>>16&0xFF, A>>8&0xFF, A&0xFF); //A | |
Send_IO_Update(f_dds); | 103 | 133 | Send_IO_Update(f_dds); | |
write_register(fd,0x06,B>>24&0xFF,B>>16&0xFF, B>>8&0xFF, B&0xFF); //B | 104 | 134 | write_register(fd,0x06,B>>24&0xFF,B>>16&0xFF, B>>8&0xFF, B&0xFF); //B | |
Send_IO_Update(f_dds); | 105 | 135 | Send_IO_Update(f_dds); | |
// write_register(fd,0x0c, phaseAmpWord>>24&0xFF, phaseAmpWord>>16&0xFF,phaseAmpWord>>8&0xFF,phaseAmpWord&0xFF); // amp (12b) ph(16) | 106 | 136 | // write_register(fd,0x0c, phaseAmpWord>>24&0xFF, phaseAmpWord>>16&0xFF,phaseAmpWord>>8&0xFF,phaseAmpWord&0xFF); // amp (12b) ph(16) | |
//Send_IO_Update(f_dds); | 107 | 137 | //Send_IO_Update(f_dds); | |
} | 108 | 138 | } | |
109 | 139 | |||
void setAmpPhaseWord(int fd, int f_dds,unsigned int phaseAmpWord) | 110 | 140 | void setAmpPhaseWord(int fd, int f_dds,unsigned int phaseAmpWord) | |
{ | 111 | 141 | { | |
write_register(fd,0x0c, phaseAmpWord>>24&0xFF, phaseAmpWord>>16&0xFF,phaseAmpWord>>8&0xFF,phaseAmpWord&0xFF); // amp (12b) ph(16) | 112 | 142 | write_register(fd,0x0c, phaseAmpWord>>24&0xFF, phaseAmpWord>>16&0xFF,phaseAmpWord>>8&0xFF,phaseAmpWord&0xFF); // amp (12b) ph(16) | |
Send_IO_Update(f_dds); | 113 | 143 | Send_IO_Update(f_dds); | |
} | 114 | 144 | } | |
115 | 145 | |||
146 | /* | |||
147 | void getAmpPhaseWord(int fd) | |||
148 | { | |||
149 | // unsigned char rx[5]={0}; | |||
150 | unsigned char* pt; | |||
151 | read_register(fd,0x0c,rx); // amp (12b) ph(16) | |||
152 | rx[0]=*pt; | |||
153 | rx[1]=*(pt+1); | |||
154 | rx[2]=*(pt+2); | |||
155 | rx[3]=*(pt+3); | |||
156 | rx[4]=*(pt+4); | |||
157 | printf("%c %c %c %c %c", rx[0], rx[1], rx[2], rx[3], rx[4]); | |||
158 | } | |||
159 | */ | |||
160 | void checkSize(void) | |||
161 | { | |||
162 | printf("int : %d\n",sizeof(unsigned int)); | |||
163 | } | |||
116 | 164 | |||
int openAndSetDdsFreq( char * device, char * gpio_update, double f_clk, double f_out, uint16_t ampWord, uint16_t phaseWord) | 117 | 165 | int openAndSetDdsFreq( char * device, char * gpio_update, double f_clk, double f_out, uint16_t ampWord, uint16_t phaseWord) | |
{ | 118 | 166 | { | |
#ifdef debug | 119 | 167 | #ifdef debug | |
printf("device=%s\tgpio_update=%s\tf_clk=%e\tf_out=%e\tampWord=%d\tphaseWord=%d\n\n",device,gpio_update,f_clk,f_out,ampWord,phaseWord); | 120 | 168 | printf("device=%s\tgpio_update=%s\tf_clk=%e\tf_out=%e\tampWord=%d\tphaseWord=%d\n\n",device,gpio_update,f_clk,f_out,ampWord,phaseWord); | |
#else | 121 | 169 | #else | |
printf("device=%s\tgpio_update=%s\tf_clk=%e\tf_out=%e\tampWord=%d\tphaseWord=%d\n\n",device,gpio_update,f_clk,f_out,ampWord,phaseWord); | 122 | 170 | printf("device=%s\tgpio_update=%s\tf_clk=%e\tf_out=%e\tampWord=%d\tphaseWord=%d\n\n",device,gpio_update,f_clk,f_out,ampWord,phaseWord); | |
int fd=configureSpi(device); //ex #define FILENAME2 "/dev/spidev0.0" | 123 | 171 | int fd=configureSpi(device); //ex #define FILENAME2 "/dev/spidev0.0" | |
printf("fd(funct)=%d\n",fd); | 124 | 172 | printf("fd(funct)=%d\n",fd); | |
setMode(fd,SPI_MODE_0); | 125 | 173 | setMode(fd,SPI_MODE_0); | |
if (fd <= 0){ | 126 | 174 | if (fd <= 0){ | |
printf("ERREUR : ouverture périphérique SPI %s\n",device); | 127 | 175 | printf("ERREUR : ouverture périphérique SPI %s\n",device); | |
return EXIT_FAILURE; | 128 | 176 | return EXIT_FAILURE; | |
} | 129 | 177 | } | |
int f_dds=open(gpio_update,O_RDWR); //ex #define UPDATE2 "/sys/dds/gpio24/updateOn" | 130 | 178 | int f_dds=open(gpio_update,O_RDWR); //ex #define UPDATE2 "/sys/dds/gpio24/updateOn" | |
printf("f_dds(funct)=%d\n",f_dds); | 131 | 179 | printf("f_dds(funct)=%d\n",f_dds); | |
if (f_dds <= 0){ | 132 | 180 | if (f_dds <= 0){ | |
printf("ERREUR : ouverture ");printf(gpio_update);printf("\n"); | 133 | 181 | printf("ERREUR : ouverture ");printf(gpio_update);printf("\n"); | |
printf("Chargez le module ddsIOupdateX\n"); | 134 | 182 | printf("Chargez le module ddsIOupdateX\n"); | |
return EXIT_FAILURE; | 135 | 183 | return EXIT_FAILURE; | |
} | 136 | 184 | } | |
setddsFreq(fd,f_dds,f_out,f_clk); | 137 | 185 | setddsFreq(fd,f_dds,f_out,f_clk); | |
//debug | 138 | 186 | //debug | |
phaseWord = 0x0000; | 139 | 187 | phaseWord = 0x0000; | |
ampWord=0x0FFF; | 140 | 188 | ampWord=0x0FFF; | |
uint32_t phaseAmpWord = phaseWord | ampWord<<16; | 141 | 189 | uint32_t phaseAmpWord = phaseWord | ampWord<<16; | |
setAmpPhaseWord(fd, f_dds, phaseAmpWord); | 142 | 190 | setAmpPhaseWord(fd, f_dds, phaseAmpWord); | |
#endif | 143 | 191 | #endif | |
return EXIT_SUCCESS; | 144 | 192 | return EXIT_SUCCESS; | |
} | 145 | 193 | } | |
146 | 194 | |||
int setDdsFreqFull ( int fd, int f_dds, double f_clk, double f_out, uint16_t ampWord, uint16_t phaseWord) | 147 | 195 | int setDdsFreqFull ( int fd, int f_dds, double f_clk, double f_out, uint16_t ampWord, uint16_t phaseWord) | |
{ | 148 | 196 | { | |
setddsFreq(fd,f_dds,f_out,f_clk); | 149 | 197 | setddsFreq(fd,f_dds,f_out,f_clk); | |
#ifdef debug | 150 | 198 | #ifdef debug | |
phaseWord = 0x0000; | 151 | 199 | phaseWord = 0x0000; | |
ampWord=0x0FFF; | 152 | 200 | ampWord=0x0FFF; | |
#endif | 153 | 201 | #endif | |
uint32_t phaseAmpWord = phaseWord | ampWord<<16; | 154 | 202 | uint32_t phaseAmpWord = phaseWord | ampWord<<16; | |
setAmpPhaseWord(fd, f_dds, phaseAmpWord); | 155 | 203 | setAmpPhaseWord(fd, f_dds, phaseAmpWord); | |
156 | 204 | |||
return EXIT_SUCCESS; | 157 | 205 | return EXIT_SUCCESS; | |
} | 158 | 206 | } | |
207 | ||||
208 | void Send_CTRL_UP(int fp) | |||
209 | { | |||
210 | char DRCTLOn='0';//pente positive | |||
211 | write(fp,&DRCTLOn,sizeof(DRCTLOn)); // | |||
212 | sleep(0.1); | |||
213 | } | |||
214 | ||||
215 | void Send_CTRL_DOWN(int fp) | |||
216 | { | |||
217 | char DRCTLOn='2';//pente negative | |||
218 | write(fp,&DRCTLOn,sizeof(DRCTLOn)); //reset | |||
219 | sleep(0.1); | |||
220 | } | |||
221 | ||||
222 | void Send_HOLD(int fp) | |||
223 | { | |||
224 | char DRHOLDOn ='1';//rampe bloquée | |||
225 | write(fp,&DRHOLDOn,sizeof(DRHOLDOn)); //reset | |||
226 | sleep(0.1); | |||
227 | } | |||
228 | ||||
229 | void Send_UNHOLD(int fp) | |||
230 | { | |||
231 | char DRHOLDOn ='3';//rampe debloquée | |||
232 | write(fp,&DRHOLDOn,sizeof(DRHOLDOn)); //reset | |||
233 | sleep(0.1); | |||
234 | } | |||
235 | ||||
236 | ||||
237 | int testRampFreq(int fd, int f_dds, int fp) | |||
238 | { | |||
239 | ||||
240 | ||||
241 | //3-Rampe de pente positive + debloquage | |||
242 | Send_CTRL_DOWN(fp);//rampe up | |||
243 | Send_UNHOLD(fp); | |||
244 | ||||
245 | Send_Reset(f_dds); | |||
246 | //Initialize_DDS (fd, f_dds); | |||
247 | ||||
248 | //0- paramètre de bases | |||
249 | write_register(fd,0x00,0x00,0x01,0x01,0x0a);//OSKenable+Read&write | |||
250 | Send_IO_Update(f_dds); | |||
251 | read_register_ini(fd,0x00); | |||
252 | ||||
253 | write_register(fd,0x01,0x00, 0x00, 0x09, 0x00); // enable amp ramp | |||
254 | Send_IO_Update(f_dds); | |||
255 | read_register_ini(fd,0x00); | |||
256 | ||||
257 | //1- Donner une frequence f_dds de 1.1e7 Hz sachant que f_clk=1e9 Hz; | |||
258 | // => Le mot a donner est (p.19) : FTW=(f_dds/f_clk)*2³² | |||
259 | // FTW = 42949672.96 = 42 949 673. = 0x028f5c29 | |||
260 | // 1.1e7 =0x02d0e560 | |||
261 | ||||
262 | // 2d0e560 | |||
263 | ||||
264 | //Calibrate_DAC (fd,f_dds); | |||
265 | ||||
266 | ||||
267 | ||||
268 | write_register(fd,0x0b,0x02,0xd0,0xe5,0x60);//mot de frequence | |||
269 | Send_IO_Update(f_dds); | |||
270 | write_register(fd,0x0c,0x0F,0xFF,0x00,0x00); //mot de amp et de phase : amp max, phase nulle | |||
271 | Send_IO_Update(f_dds); | |||
272 | ||||
273 | printf("Les mots de frequences, d'amplitudes et de phases sont envoyes\n"); | |||
274 | printf("Lecture registre de frequence: 0x0b\n"); | |||
275 | read_register_ini(fd,0x0b); | |||
276 | printf("Lecture registre de amp et phase: 0x0c\n"); | |||
277 | read_register_ini(fd,0x0c); | |||
278 | ||||
279 | Calibrate_DAC (fd,f_dds); | |||
280 | printf("\n\n ----------------------- \n\n"); | |||
281 | ||||
282 | ||||
283 | /* | |||
284 | //2- Taille des dt | |||
285 | ||||
286 | write_register(fd,0x08,0xFF,0xFF,0xFF,0xFF); //+dt max, -dt max (+dt = -dt) | |||
287 | Send_IO_Update(f_dds); | |||
288 | ||||
289 | printf("Les mots de dt sont envoyes\n"); | |||
290 | printf("Lecture dans le registre 0x08 : taille dt\n"); | |||
291 | read_register_ini (fd,0x08); | |||
292 | ||||
293 | ||||
294 | ||||
295 | ||||
296 | printf("\n\n ----------------------- \n\n"); | |||
297 | ||||
298 | ||||
299 | //3- STEP SIZE :dphi | |||
300 | ||||
301 | // en theorie dphi =2.25e-28 degrees | |||
302 | write_register(fd,0x06,0x00,0x00,0x00,0x01); | |||
303 | Send_IO_Update(f_dds); | |||
304 | ||||
305 | write_register(fd,0x07,0x00,0x00,0x00,0x01); | |||
306 | Send_IO_Update(f_dds); | |||
307 | ||||
308 | //printf("\n\n ----------------------- \n\n"); | |||
309 | printf("Les mots de dphi sont envoyes\n"); | |||
310 | printf("Lecture dans les registres 0x06 et 0x07 : taille dt\n"); | |||
311 | read_register_ini (fd,0x06); | |||
312 | read_register_ini (fd,0x07); | |||
313 | ||||
314 | printf("\n\n ----------------------- \n\n"); | |||
315 | //4- Ecrire les extremums de la rampe | |||
316 | ||||
317 | write_register(fd,0x04,0x00,0x00,0x00,0x01);//0 rad | |||
318 | Send_IO_Update(f_dds); | |||
319 | write_register(fd,0x05,0xFF,0xFF,0xFF,0xFF);//2*pi rad | |||
320 | Send_IO_Update(f_dds); | |||
321 | ||||
322 | printf("Les mots des frontieres sont envoyes\n"); | |||
323 | printf("Lecture dans les registres 0x04 et 0x05 : taille dt\n"); | |||
324 | read_register_ini (fd,0x04); | |||
325 | read_register_ini (fd,0x05); | |||
326 | ||||
327 | ||||
328 | //3-Rampe de pente positive ou négative | |||
329 | // Send_CTRL_UP(fp);//rampe up | |||
330 | ||||
331 | ||||
332 | //4-ecriture dans le registre 0x01 | |||
333 | write_register(fd,0x01,0x00, 0xa8, 0x09, 0x00); // enable amp ramp | |||
334 | Send_IO_Update(f_dds); | |||
335 | ||||
336 | printf("Lecture dans le registre 0x01 : \n"); | |||
337 | read_register_ini (fd,0x01); | |||
338 | // printf("Les mots de dt sont envoyes\n"); | |||
339 | printf("Lecture dans le registre 0x08 : taille dt\n"); | |||
340 | read_register_ini (fd,0x08); | |||
341 | ||||
342 | ||||
343 | */ | |||
344 | return EXIT_SUCCESS; | |||
345 | } | |||
346 | ||||
347 | //---------------rajout 8/1 | |||
348 | ||||
349 | int PutAmpWord(int fd, int f_dds, double amplitude) | |||
350 | { | |||
351 | uint16_t PhaseWord = 0x0000; | |||
352 | uint16_t AmpWord = 0x0000; | |||
353 | uint32_t ReadPhaseAmpWord=0x00000000; | |||
354 | ||||
355 | AmpWord = rint(amplitude*(pow(2.0,12.0)-1)/100); | |||
356 | ||||
357 | read_register(fd,0x0c,&ReadPhaseAmpWord); | |||
358 | ||||
359 | PhaseWord = ReadPhaseAmpWord&0xFFFF; | |||
360 | ||||
361 | write_register(fd,0x0c,AmpWord>>8&0xFF,AmpWord&0xFF,PhaseWord>>8&0xFF,PhaseWord&0xFF); | |||
362 | Send_IO_Update(f_dds); | |||
363 | ||||
364 | return 0; | |||
365 | } | |||
366 | ||||
367 | ||||
368 | int PutPhaseWord(int fd, int f_dds, double phase) | |||
369 | { | |||
370 | uint16_t PhaseWord = 0x0000; | |||
371 | uint16_t AmpWord = 0x0000; | |||
372 | uint32_t ReadPhaseAmpWord=0x00000000; | |||
373 | ||||
374 | PhaseWord = rint(phase*(pow(2.0,16.0)-1)/360); | |||
375 | ||||
376 | read_register(fd,0x0c,&ReadPhaseAmpWord); | |||
377 | ||||
378 | AmpWord = ReadPhaseAmpWord>>16&0xFFFF; | |||
379 | ||||
380 | write_register(fd,0x0c,AmpWord>>8&0xFF,AmpWord&0xFF,PhaseWord>>8&0xFF,PhaseWord&0xFF); | |||
381 | Send_IO_Update(f_dds); | |||
382 | ||||
383 | return 0; | |||
384 | } | |||
385 | ||||
386 | int PutFrequencyWord(int fd, int f_dds, double fout)//Attention uniquement valable pour fclk = 1 GHz | |||
387 | { | |||
388 | ||||
389 | uint32_t FTWR = 0x00000000; | |||
390 | FTWR = rint((fout/1e9)*pow(2.0,32.0)); | |||
391 | write_register(fd,0x0b,FTWR>>24&0xFF,FTWR>>16&0xFF,FTWR>>8&0xFF,FTWR&0xFF);//mot de frequence | |||
392 | Send_IO_Update(f_dds); | |||
393 | ||||
394 | return 0; | |||
395 | } | |||
396 | ||||
397 | ||||
398 | int PutFrequencyAmpPhaseWord(int fd, int f_dds, double fout, double fclk,double amp, double phase)//n'existe pas dans le mode profile enable | |||
399 | { | |||
400 | ||||
401 | uint32_t FTWR = 0x00000000; | |||
402 | ||||
403 | FTWR = rint((fout/fclk)*pow(2.0,32.0)); | |||
404 | ||||
405 | write_register(fd,0x0b,FTWR>>24&0xFF,FTWR>>16&0xFF,FTWR>>8&0xFF,FTWR&0xFF);//mot de frequence | |||
406 | ||||
407 | Send_IO_Update(f_dds); | |||
408 | ||||
409 | // write_register(fd,0x0c,0x0F,0xFF,0x00,0x00); //mot de amp et de phase : amp max, phase nulle | |||
410 | // Send_IO_Update(f_dds); | |||
411 | ||||
412 | PutPhaseWord(fd,f_dds,phase); | |||
413 | PutAmpWord(fd,f_dds,amp); | |||
414 | ||||
415 | return 0; | |||
416 | } | |||
417 | ||||
418 | ||||
419 | int InitialisationProfile (int fd,int f_dds) | |||
420 | { | |||
421 | ||||
422 | Send_Reset(f_dds); //les registres sont maintenant par defaut | |||
423 | write_register(fd,0x00,0x00,0x01,0x01,0x0a); //OSK+SDIO input only//ok | |||
424 | Send_IO_Update(f_dds); | |||
425 | write_register(fd,0x01,0x00,0x80,0x09,0x00); // profile mode enable very important | |||
426 | Send_IO_Update(f_dds); | |||
427 | write_register(fd,0x02,0x00,0x00,0x19,0x1c); // default | |||
428 | Send_IO_Update(f_dds); | |||
429 | write_register(fd,0x03,0x01,0x05,0x21,0x20); // calibration 1/2 :enable | |||
430 | Send_IO_Update(f_dds); | |||
431 | write_register(fd,0x03,0x00,0x05,0x21,0x20); // calibration 2/2 :desenable | |||
432 | Send_IO_Update(f_dds); | |||
433 | ||||
434 | return 0; | |||
435 | } | |||
436 | ||||
437 | ||||
438 | ||||
439 | //------------------- FIN RAJOUT 8/1 | |||
440 | ||||
441 | ||||
442 | //-------------------------FONCTIONS RAMPES HARDWARE | |||
443 | ||||
444 | //1-rampe de frequence | |||
445 | ||||
446 | //rampe simple de fréquence | |||
447 | int FrequencySweep (int fd, int f_dds,double fclk,double dfUp, double dfDown, double FreqMax,double FreqMin, double DeltaTimeUp, double DeltaTimeDown) | |||
448 | { | |||
449 | //calcul de N => N=DeltaF/df = DeltaT/dt | |||
450 | ||||
451 | //1-fmax > fmin | |||
452 | double DeltaFreq = FreqMax-FreqMin; | |||
453 | if(FreqMax<FreqMin) | |||
454 | { | |||
455 | printf("FreqMax should be > FreqMin\n"); | |||
456 | printf("Can't Start the ramp\n"); | |||
457 | return -1; | |||
458 | } | |||
459 | ||||
460 | //2- Calcul du nombre de points de la rampe | |||
461 | int NumberPointsUp = DeltaFreq/dfUp; | |||
462 | int NumberPointsDown = DeltaFreq/dfDown; | |||
463 | ||||
464 | //3- En déduire la valeur de dtUp et dtDown | |||
465 | double dtUp = DeltaTimeUp/NumberPointsUp; | |||
466 | double dtDown = DeltaTimeDown/NumberPointsDown; | |||
467 | ||||
468 | double dtmin = 24/fclk; | |||
469 | double dtmax = dtmin*(pow(2.0,16.0)-1); | |||
470 | ||||
471 | //Check Up | |||
472 | if(dtUp<dtmin) | |||
473 | { | |||
474 | printf("During of ramp UP should be > %f s\n",dtmin*NumberPointsUp); | |||
475 | printf("Can't start the ramp\n"); | |||
476 | return -1; | |||
477 | } | |||
478 | ||||
479 | if(dtUp>dtmax) | |||
480 | { | |||
481 | printf("During of ramp UP should be < %f\n",dtmax*NumberPointsUp); | |||
482 | printf("Can't start the ramp\n"); | |||
483 | return -1; | |||
484 | } | |||
485 | ||||
486 | //Check Down | |||
487 | if(dtDown<dtmin) | |||
488 | { | |||
489 | printf("During of ramp DOWN should be > %f s\n",dtmin*NumberPointsDown); | |||
490 | printf("Can't start the ramp\n"); | |||
491 | return -1; | |||
492 | } | |||
493 | ||||
494 | if(dtDown>dtmax) | |||
495 | { | |||
496 | printf("During of ramp DOWN should be < %f\n",dtmax*NumberPointsDown); | |||
497 | printf("Can't start the ramp\n"); | |||
498 | return -1; | |||
499 | } | |||
500 | ||||
501 | ||||
502 | //4 - Put word in register | |||
503 | ||||
504 | ||||
505 | //4.1 Limit register | |||
506 | uint32_t FTWRmin = rint((FreqMin/fclk)*pow(2.0,32.0)); | |||
507 | write_register(fd,0x04,FTWRmin>>24&0xFF,FTWRmin>>16&0xFF,FTWRmin>>8&0xFF,FTWRmin&0xFF);//mot de frequence | |||
508 | Send_IO_Update(f_dds); | |||
509 | ||||
510 | uint32_t FTWRmax = rint((FreqMax/fclk)*pow(2.0,32.0)); | |||
511 | write_register(fd,0x05,FTWRmax>>24&0xFF,FTWRmax>>16&0xFF,FTWRmax>>8&0xFF,FTWRmax&0xFF);//mot de frequence | |||
512 | Send_IO_Update(f_dds); | |||
513 | ||||
514 | ||||
515 | //4.2 dfUP et dfDown | |||
516 | double df_up = DeltaFreq/NumberPointsUp; | |||
517 | double df_down = DeltaFreq/NumberPointsDown; | |||
518 | ||||
519 | uint32_t Word_df_up = rint(df_up*pow(2.0,32.0)/fclk); | |||
520 | uint32_t Word_df_down = rint(df_down*pow(2.0,32.0)/fclk); | |||
521 | ||||
522 | write_register(fd,0x06,Word_df_up>>24&0xFF,Word_df_up>>16&0xFF,Word_df_up>>8&0xFF,Word_df_up&0xFF); //df_up | |||
523 | Send_IO_Update(f_dds); | |||
524 | write_register(fd,0x07,Word_df_down>>24&0xFF,Word_df_down>>16&0xFF,Word_df_down>>8&0xFF,Word_df_down&0xFF);//df_down | |||
525 | Send_IO_Update(f_dds); | |||
526 | ||||
527 | ||||
528 | //4.3 dtUp et dtDown | |||
529 | ||||
530 | uint16_t Word_dt_up = 0x0000; | |||
531 | uint16_t Word_dt_down = 0x0000; | |||
532 | ||||
533 | Word_dt_up = rint(dtUp*fclk/24); | |||
534 | Word_dt_down = rint(dtDown*fclk/24); | |||
535 | ||||
536 | write_register(fd,0x08,Word_dt_down>>8&0xFF,Word_dt_down&0xFF,Word_dt_up>>8&0xFF,Word_dt_up&0xFF); // il y a 2 dt | |||
537 | Send_IO_Update(f_dds); | |||
538 | ||||
539 | //5 Start of the ramp | |||
540 | ||||
541 | write_register(fd,0x01,0x00,0x08,0x09,0x00); //rampe simple | |||
542 | Send_IO_Update(f_dds); | |||
543 | return 0; | |||
544 | ||||
545 | ||||
546 | ||||
547 | return EXIT_SUCCESS; | |||
548 | ||||
549 | } | |||
550 | ||||
551 | ||||
552 | //rampe continue de fréquence | |||
553 | int ContinueFrequencySweep (int fd, int f_dds,double fclk,double dfUp, double dfDown, double FreqMax,double FreqMin, double DeltaTimeUp, double DeltaTimeDown) | |||
554 | { | |||
555 | //calcul de N => N=DeltaF/df = DeltaT/dt | |||
556 | ||||
557 | //1-fmax > fmin | |||
558 | double DeltaFreq = FreqMax-FreqMin; | |||
559 | if(FreqMax<FreqMin) | |||
560 | { | |||
561 | printf("FreqMax should be > FreqMin\n"); | |||
562 | printf("Can't Start the ramp\n"); | |||
563 | return -1; | |||
564 | } | |||
565 | ||||
566 | //2- Calcul du nombre de points de la rampe | |||
567 | int NumberPointsUp = DeltaFreq/dfUp; | |||
568 | int NumberPointsDown = DeltaFreq/dfDown; | |||
569 | ||||
570 | //3- En déduire la valeur de dtUp et dtDown | |||
571 | double dtUp = DeltaTimeUp/NumberPointsUp; | |||
572 | double dtDown = DeltaTimeDown/NumberPointsDown; | |||
573 | ||||
574 | double dtmin = 24/fclk; | |||
575 | double dtmax = dtmin*(pow(2.0,16.0)-1); | |||
576 | ||||
577 | //Check Up | |||
578 | if(dtUp<dtmin) | |||
579 | { | |||
580 | printf("During of ramp UP should be > %f s\n",dtmin*NumberPointsUp); | |||
581 | printf("Can't start the ramp\n"); | |||
582 | return -1; | |||
583 | } | |||
584 | ||||
585 | if(dtUp>dtmax) | |||
586 | { | |||
587 | printf("During of ramp UP should be < %f\n",dtmax*NumberPointsUp); | |||
588 | printf("Can't start the ramp\n"); | |||
589 | return -1; | |||
590 | } | |||
591 | ||||
592 | //Check Down | |||
593 | if(dtDown<dtmin) | |||
594 | { | |||
595 | printf("During of ramp DOWN should be > %f s\n",dtmin*NumberPointsDown); | |||
596 | printf("Can't start the ramp\n"); | |||
597 | return -1; | |||
598 | } | |||
599 | ||||
600 | if(dtDown>dtmax) | |||
601 | { | |||
602 | printf("During of ramp DOWN should be < %f\n",dtmax*NumberPointsDown); | |||
603 | printf("Can't start the ramp\n"); | |||
604 | return -1; | |||
605 | } | |||
606 | ||||
607 | ||||
608 | //4 - Put word in register | |||
609 | ||||
610 | ||||
611 | //4.1 Limit register | |||
612 | uint32_t FTWRmin = rint((FreqMin/fclk)*pow(2.0,32.0)); | |||
613 | write_register(fd,0x04,FTWRmin>>24&0xFF,FTWRmin>>16&0xFF,FTWRmin>>8&0xFF,FTWRmin&0xFF);//mot de frequence | |||
614 | Send_IO_Update(f_dds); | |||
615 | ||||
616 | uint32_t FTWRmax = rint((FreqMax/fclk)*pow(2.0,32.0)); | |||
617 | write_register(fd,0x05,FTWRmax>>24&0xFF,FTWRmax>>16&0xFF,FTWRmax>>8&0xFF,FTWRmax&0xFF);//mot de frequence | |||
618 | Send_IO_Update(f_dds); | |||
619 | ||||
620 | ||||
621 | //4.2 dfUP et dfDown | |||
622 | double df_up = DeltaFreq/NumberPointsUp; | |||
623 | double df_down = DeltaFreq/NumberPointsDown; | |||
624 | ||||
625 | uint32_t Word_df_up = rint(df_up*pow(2.0,32.0)/fclk); | |||
626 | uint32_t Word_df_down = rint(df_down*pow(2.0,32.0)/fclk); | |||
627 | ||||
628 | write_register(fd,0x06,Word_df_up>>24&0xFF,Word_df_up>>16&0xFF,Word_df_up>>8&0xFF,Word_df_up&0xFF); //df_up | |||
629 | Send_IO_Update(f_dds); | |||
630 | write_register(fd,0x07,Word_df_down>>24&0xFF,Word_df_down>>16&0xFF,Word_df_down>>8&0xFF,Word_df_down&0xFF);//df_down | |||
631 | Send_IO_Update(f_dds); | |||
632 | ||||
633 | ||||
634 | //4.3 dtUp et dtDown | |||
635 | ||||
636 | uint16_t Word_dt_up = 0x0000; | |||
637 | uint16_t Word_dt_down = 0x0000; | |||
638 | ||||
639 | Word_dt_up = rint(dtUp*fclk/24); | |||
640 | Word_dt_down = rint(dtDown*fclk/24); | |||
641 | ||||
642 | write_register(fd,0x08,Word_dt_down>>8&0xFF,Word_dt_down&0xFF,Word_dt_up>>8&0xFF,Word_dt_up&0xFF); // il y a 2 dt | |||
643 | Send_IO_Update(f_dds); | |||
644 | ||||
645 | //5 Start of the ramp | |||
646 | ||||
647 | write_register(fd,0x01,0x00,0x8e,0x29,0x00); //rampe triangulaire | |||
648 | Send_IO_Update(f_dds); | |||
649 | return 0; | |||
650 | ||||
651 | ||||
652 | ||||
653 | return EXIT_SUCCESS; | |||
654 | ||||
655 | } | |||
656 | ||||
657 | //2-rampe d'amplitude | |||
658 | ||||
659 | int AmplitudeSweep (int fd, int f_dds,double fclk,double dAUp, double dADown, double AMax,double AMin, double DeltaTimeUp, double DeltaTimeDown) | |||
660 | { | |||
661 | ||||
662 | ||||
663 | //calcul de N => N=DeltaF/df = DeltaT/dt | |||
664 | ||||
665 | //1-Amax > Amin | |||
666 | double DeltaAmp = AMax-AMin; | |||
667 | if(AMax<AMin) | |||
668 | { | |||
669 | printf("AMax should be > AMin\n"); | |||
670 | printf("Can't Start the ramp\n"); | |||
671 | return -1; | |||
672 | } | |||
673 | ||||
674 | ||||
675 | //2- Calcul du nombre de points de la rampe | |||
676 | int NumberPointsUp = DeltaAmp/dAUp; | |||
677 | int NumberPointsDown = DeltaAmp/dADown; | |||
678 | ||||
679 | //3- En déduire la valeur de dtUp et dtDown | |||
680 | double dtUp = DeltaTimeUp/NumberPointsUp; | |||
681 | double dtDown = DeltaTimeDown/NumberPointsDown; | |||
682 | ||||
683 | double dtmin = 24/fclk; | |||
684 | double dtmax = dtmin*(pow(2.0,16.0)-1); | |||
685 | ||||
686 | //Check Up | |||
687 | if(dtUp<dtmin) | |||
688 | { | |||
689 | printf("During of ramp UP should be > %f s\n",dtmin*NumberPointsUp); | |||
690 | printf("Can't start the ramp\n"); | |||
691 | return -1; | |||
692 | } | |||
693 | ||||
694 | if(dtUp>dtmax) | |||
695 | { | |||
696 | printf("During of ramp UP should be < %f\n",dtmax*NumberPointsUp); | |||
697 | printf("Can't start the ramp\n"); | |||
698 | return -1; | |||
699 | } | |||
700 | ||||
701 | //Check Down | |||
702 | if(dtDown<dtmin) | |||
703 | { | |||
704 | printf("During of ramp DOWN should be > %f s\n",dtmin*NumberPointsDown); | |||
705 | printf("Can't start the ramp\n"); | |||
706 | return -1; | |||
707 | } | |||
708 | ||||
709 | if(dtDown>dtmax) | |||
710 | { | |||
711 | printf("During of ramp DOWN should be < %f\n",dtmax*NumberPointsDown); | |||
712 | printf("Can't start the ramp\n"); | |||
713 | return -1; | |||
714 | } | |||
715 | ||||
716 | ||||
717 | ||||
718 | //check if DeltaAmp is enouth | |||
719 | double enouthUP=0.5*NumberPointsUp*100/4095; | |||
720 | double enouthDOWN=0.5*NumberPointsDown*100/4095; | |||
721 | ||||
722 | int borneUP = rint(enouthUP); | |||
723 | int borneDown = rint(enouthDOWN); | |||
724 | ||||
725 | if(DeltaAmp<=enouthUP) | |||
726 | { | |||
727 | printf("The amplitude difference should be > %d\n, decrease Number Points for positive slope",borneUP); | |||
728 | //return -1; | |||
729 | } | |||
730 | ||||
731 | if(DeltaAmp<=enouthDOWN) | |||
732 | { | |||
733 | printf("The amplitude difference should be > %d\n, decrease Number Points for negative slope",borneDown); | |||
734 | //return -1; | |||
735 | } | |||
736 | ||||
737 | ||||
738 | //4 - Put word in register | |||
739 | ||||
740 | ||||
741 | //4.1 Limit register | |||
742 | uint32_t WordAmin = rint(AMin*4095/100); | |||
743 | uint32_t WordAmax= rint(AMax*4095/100); | |||
744 | ||||
745 | write_register(fd,0x04,WordAmin>>24&0xFF,WordAmin>>16&0xFF,WordAmin>>8&0xFF,WordAmin&0xFF); //min => lim-(Amp ) = 0x800 = Amax/2 | |||
746 | Send_IO_Update(f_dds); | |||
747 | write_register(fd,0x05,WordAmax>>24&0xFF,WordAmax>>16&0xFF,WordAmax>>8&0xFF,WordAmax&0xFF);//max => lim+(Amp) = 0xFFF= Amax0 | |||
748 | Send_IO_Update(f_dds); | |||
749 | ||||
750 | ||||
751 | //4.2 dAUP et dADown | |||
752 | ||||
753 | uint32_t Word_dA_up = rint(dAUp*4095/100); | |||
754 | uint32_t Word_dA_down = rint(dADown*4095/100); | |||
755 | ||||
756 | write_register(fd,0x06,Word_dA_up>>24&0xFF,Word_dA_up>>16&0xFF,Word_dA_up>>8&0xFF,Word_dA_up&0xFF); //dA_up | |||
757 | Send_IO_Update(f_dds); | |||
758 | write_register(fd,0x07,Word_dA_down>>24&0xFF,Word_dA_down>>16&0xFF,Word_dA_down>>8&0xFF,Word_dA_down&0xFF);//dA_down | |||
759 | Send_IO_Update(f_dds); | |||
760 | ||||
761 | ||||
762 | //4.3 dtUp et dtDown | |||
763 | ||||
764 | uint16_t Word_dt_up = rint(dtUp*fclk/24); | |||
765 | uint16_t Word_dt_down = rint(dtDown*fclk/24); | |||
766 | ||||
767 | write_register(fd,0x08,Word_dt_down>>8&0xFF,Word_dt_down&0xFF,Word_dt_up>>8&0xFF,Word_dt_up&0xFF); // il y a 2 dt | |||
768 | Send_IO_Update(f_dds); | |||
769 | ||||
770 | //5 Start of the ramp | |||
771 | ||||
772 | write_register(fd,0x01,0x00,0x28,0x09,0x00); //rampe simple montante | |||
773 | //write_register(fd,0x01,0x00,0xAE,0x29,0x00); //rampe continue | |||
774 | Send_IO_Update(f_dds); | |||
775 | ||||
776 | return EXIT_SUCCESS; | |||
777 | } | |||
778 | ||||
779 | int ContinueAmplitudeSweep (int fd, int f_dds,double fclk,double dAUp, double dADown, double AMax,double AMin, double DeltaTimeUp, double DeltaTimeDown) | |||
780 | { | |||
781 | ||||
782 | ||||
783 | //calcul de N => N=DeltaF/df = DeltaT/dt | |||
784 | ||||
785 | //1-Amax > Amin | |||
786 | double DeltaAmp = AMax-AMin; | |||
787 | if(AMax<AMin) | |||
788 | { | |||
789 | printf("AMax should be > AMin\n"); | |||
790 | printf("Can't Start the ramp\n"); | |||
791 | return -1; | |||
792 | } | |||
793 | ||||
794 | ||||
795 | //2- Calcul du nombre de points de la rampe | |||
796 | int NumberPointsUp = DeltaAmp/dAUp; | |||
797 | int NumberPointsDown = DeltaAmp/dADown; | |||
798 | ||||
799 | //3- En déduire la valeur de dtUp et dtDown | |||
800 | double dtUp = DeltaTimeUp/NumberPointsUp; | |||
801 | double dtDown = DeltaTimeDown/NumberPointsDown; | |||
802 | ||||
803 | double dtmin = 24/fclk; | |||
804 | double dtmax = dtmin*(pow(2.0,16.0)-1); | |||
805 | ||||
806 | //Check Up | |||
807 | if(dtUp<dtmin) | |||
808 | { | |||
809 | printf("During of ramp UP should be > %f s\n",dtmin*NumberPointsUp); | |||
810 | printf("Can't start the ramp\n"); | |||
811 | return -1; | |||
812 | } | |||
813 | ||||
814 | if(dtUp>dtmax) | |||
815 | { | |||
816 | printf("During of ramp UP should be < %f\n",dtmax*NumberPointsUp); | |||
817 | printf("Can't start the ramp\n"); | |||
818 | return -1; | |||
819 | } | |||
820 | ||||
821 | //Check Down | |||
822 | if(dtDown<dtmin) | |||
823 | { | |||
824 | printf("During of ramp DOWN should be > %f s\n",dtmin*NumberPointsDown); | |||
825 | printf("Can't start the ramp\n"); | |||
826 | return -1; | |||
827 | } | |||
828 | ||||
829 | if(dtDown>dtmax) | |||
830 | { | |||
831 | printf("During of ramp DOWN should be < %f\n",dtmax*NumberPointsDown); | |||
832 | printf("Can't start the ramp\n"); | |||
833 | return -1; | |||
834 | } | |||
835 | ||||
836 | ||||
837 | ||||
838 | //check if DeltaAmp is enouth | |||
839 | double enouthUP=0.5*NumberPointsUp*100/4095; | |||
840 | double enouthDOWN=0.5*NumberPointsDown*100/4095; | |||
841 | ||||
842 | int borneUP = rint(enouthUP); | |||
843 | int borneDown = rint(enouthDOWN); | |||
844 | ||||
845 | if(DeltaAmp<=enouthUP) | |||
846 | { | |||
847 | printf("The amplitude difference should be > %d\n, decrease Number Points for positive slope",borneUP); | |||
848 | //return -1; | |||
849 | } | |||
850 | ||||
851 | if(DeltaAmp<=enouthDOWN) | |||
852 | { | |||
853 | printf("The amplitude difference should be > %d\n, decrease Number Points for negative slope",borneDown); | |||
854 | //return -1; | |||
855 | } | |||
856 | ||||
857 | ||||
858 | //4 - Put word in register | |||
859 | ||||
860 | ||||
861 | //4.1 Limit register | |||
862 | uint32_t WordAmin = rint(AMin*4095/100); | |||
863 | uint32_t WordAmax= rint(AMax*4095/100); | |||
864 | ||||
865 | write_register(fd,0x04,WordAmin>>24&0xFF,WordAmin>>16&0xFF,WordAmin>>8&0xFF,WordAmin&0xFF); //min => lim-(Amp ) = 0x800 = Amax/2 | |||
866 | Send_IO_Update(f_dds); | |||
867 | write_register(fd,0x05,WordAmax>>24&0xFF,WordAmax>>16&0xFF,WordAmax>>8&0xFF,WordAmax&0xFF);//max => lim+(Amp) = 0xFFF= Amax0 | |||
868 | Send_IO_Update(f_dds); | |||
869 | ||||
870 | ||||
871 | //4.2 dAUP et dADown | |||
872 | ||||
873 | uint32_t Word_dA_up = rint(dAUp*4095/100); | |||
874 | uint32_t Word_dA_down = rint(dADown*4095/100); | |||
875 | ||||
876 | write_register(fd,0x06,Word_dA_up>>24&0xFF,Word_dA_up>>16&0xFF,Word_dA_up>>8&0xFF,Word_dA_up&0xFF); //dA_up | |||
877 | Send_IO_Update(f_dds); | |||
878 | write_register(fd,0x07,Word_dA_down>>24&0xFF,Word_dA_down>>16&0xFF,Word_dA_down>>8&0xFF,Word_dA_down&0xFF);//dA_down | |||
879 | Send_IO_Update(f_dds); | |||
880 | ||||
881 | ||||
882 | //4.3 dtUp et dtDown | |||
883 | ||||
884 | uint16_t Word_dt_up = rint(dtUp*fclk/24); | |||
885 | uint16_t Word_dt_down = rint(dtDown*fclk/24); | |||
886 | ||||
887 | write_register(fd,0x08,Word_dt_down>>8&0xFF,Word_dt_down&0xFF,Word_dt_up>>8&0xFF,Word_dt_up&0xFF); // il y a 2 dt | |||
888 | Send_IO_Update(f_dds); | |||
889 | ||||
890 | //5 Start of the ramp | |||
891 | ||||
892 | //write_register(fd,0x01,0x00,0x28,0x09,0x00); //rampe simple montante | |||
893 | write_register(fd,0x01,0x00,0xAE,0x29,0x00); //rampe continue | |||
894 | Send_IO_Update(f_dds); | |||
895 | ||||
896 | return EXIT_SUCCESS; | |||
897 | } | |||
898 | ||||
899 | ||||
900 | //3-rampe de ĥase | |||
901 | ||||
902 | int PhaseSweep (int fd, int f_dds,double fclk,double dphiUp, double dphiDown, double PhiMax,double PhiMin, double DeltaTimeUp, double DeltaTimeDown) | |||
903 | { | |||
904 | ||||
905 | ||||
906 | //calcul de N => N=Deltaphi/dphi = DeltaT/dt | |||
907 | ||||
908 | //1-phimax > phimin | |||
909 | double DeltaPhi = PhiMax-PhiMin; | |||
910 | if(PhiMax<PhiMin) | |||
911 | { | |||
912 | printf("PhiMax should be > PhiMin\n"); | |||
913 | printf("Can't Start the ramp\n"); | |||
914 | return -1; | |||
915 | } | |||
916 | ||||
917 | ||||
918 | //2- Calcul du nombre de points de la rampe | |||
919 | int NumberPointsUp = DeltaPhi/dphiUp; | |||
920 | int NumberPointsDown = DeltaPhi/dphiDown; | |||
921 | ||||
922 | printf("NumberPointsUp = %d\n",NumberPointsUp); | |||
923 | printf("NumberPointsDown = %d\n",NumberPointsDown); | |||
924 | ||||
925 | //3- En déduire la valeur de dtUp et dtDown | |||
926 | double dtUp = DeltaTimeUp/NumberPointsUp; | |||
927 | double dtDown = DeltaTimeDown/NumberPointsDown; | |||
928 | ||||
929 | double dtmin = 24/fclk; | |||
930 | double dtmax = dtmin*(pow(2.0,16.0)-1); | |||
931 | ||||
932 | //Check Up | |||
933 | if(dtUp<dtmin) | |||
934 | { | |||
935 | printf("During of ramp UP should be > %f s\n",dtmin*NumberPointsUp); | |||
936 | printf("Can't start the ramp\n"); | |||
937 | return -1; | |||
938 | } | |||
939 | ||||
940 | if(dtUp>dtmax) | |||
941 | { | |||
942 | printf("During of ramp UP should be < %f\n",dtmax*NumberPointsUp); | |||
943 | printf("Can't start the ramp\n"); | |||
944 | return -1; | |||
945 | } | |||
946 | ||||
947 | //Check Down | |||
948 | if(dtDown<dtmin) | |||
949 | { | |||
950 | printf("During of ramp DOWN should be > %f s\n",dtmin*NumberPointsDown); | |||
951 | printf("Can't start the ramp\n"); | |||
952 | return -1; | |||
953 | } | |||
954 | ||||
955 | if(dtDown>dtmax) | |||
956 | { | |||
957 | printf("During of ramp DOWN should be < %f\n",dtmax*NumberPointsDown); | |||
958 | printf("Can't start the ramp\n"); | |||
959 | return -1; | |||
960 | } | |||
961 | ||||
962 | ||||
963 | ||||
964 | //check if DeltaAmp is enouth | |||
965 | /* | |||
966 | double enouthUP=0.5*NumberPointsUp*100/4095; | |||
967 | double enouthDOWN=0.5*NumberPointsDown*100/4095; | |||
968 | ||||
969 | int borneUP = rint(enouthUP); | |||
970 | int borneDown = rint(enouthDOWN); | |||
971 | ||||
972 | if(DeltaAmp<=enouthUP) | |||
973 | { | |||
974 | printf("The amplitude difference should be > %d\n, decrease Number Points for positive slope",borneUP); | |||
975 | //return -1; | |||
976 | } | |||
977 | ||||
978 | if(DeltaAmp<=enouthDOWN) | |||
979 | { | |||
980 | printf("The amplitude difference should be > %d\n, decrease Number Points for negative slope",borneDown); | |||
981 | //return -1; | |||
982 | } | |||
983 | ||||
984 | */ | |||
985 | ||||
986 | //4 - Put word in register | |||
987 | ||||
988 | ||||
989 | //4.1 Limit register | |||
990 | uint32_t WordPhimin = rint(PhiMin*65535/360); | |||
991 | uint32_t WordPhimax= rint(PhiMax*65535/360); | |||
992 | ||||
993 | ||||
994 | printf("WordPhimin = %.32x\n",WordPhimin); | |||
995 | printf("WordPhimax = %.32x\n",WordPhimax); | |||
996 | ||||
997 | ||||
998 | write_register(fd,0x04,WordPhimin>>24&0xFF,WordPhimin>>16&0xFF,WordPhimin>>8&0xFF,WordPhimin&0xFF); //min => lim-(Amp ) = 0x800 = Amax/2 | |||
999 | Send_IO_Update(f_dds); | |||
1000 | write_register(fd,0x05,WordPhimax>>24&0xFF,WordPhimax>>16&0xFF,WordPhimax>>8&0xFF,WordPhimax&0xFF);//max => lim+(Amp) = 0xFFF= Amax0 | |||
1001 | Send_IO_Update(f_dds); | |||
1002 | ||||
1003 | ||||
1004 | //4.2 dphiUP et dphiDown | |||
1005 | ||||
1006 | // uint32_t Word_dphi_up = rint(dphiUp*(pow(2.0,29.0)-1)/45); | |||
1007 | // uint32_t Word_dphi_down = rint(dphiDown*(pow(2.0,29.0)-1)/45); | |||
1008 | uint32_t Word_dphi_up = rint(dphiUp*(65535/360)); | |||
1009 | uint32_t Word_dphi_down = rint(dphiDown*(65535/360)); | |||
1010 | ||||
1011 | printf("Word_dphi_up = %.32x\n",Word_dphi_up); | |||
1012 | printf("Word_dphi_down = %.32x\n",Word_dphi_down); | |||
1013 | ||||
1014 | /* | |||
1015 | write_register(fd,0x06,Word_dphi_up>>16&0xFF,Word_dphi_up>>8&0xFF,Word_dphi_up>>0&0xFF,Word_dphi_up&0xFF); //dphi_up | |||
1016 | Send_IO_Update(f_dds); | |||
1017 | write_register(fd,0x07,Word_dphi_down>>16&0xFF,Word_dphi_down>>8&0xFF,Word_dphi_down>>0&0xFF,Word_dphi_down&0xFF);//dphi_down | |||
1018 | Send_IO_Update(f_dds); | |||
1019 | ||||
1020 | */ | |||
1021 | ||||
1022 | ||||
1023 | write_register(fd,0x06,Word_dphi_up>>24&0xFF,Word_dphi_up>>16&0xFF,Word_dphi_up>>8&0xFF,Word_dphi_up&0xFF); //dA_up | |||
1024 | Send_IO_Update(f_dds); | |||
1025 | write_register(fd,0x07,Word_dphi_down>>24&0xFF,Word_dphi_down>>16&0xFF,Word_dphi_down>>8&0xFF,Word_dphi_down&0xFF);//dA_down | |||
1026 | Send_IO_Update(f_dds); | |||
1027 | ||||
1028 | ||||
1029 | //4.3 dtUp et dtDown | |||
1030 | ||||
1031 | uint16_t Word_dt_up = rint(dtUp*fclk/24); | |||
1032 | uint16_t Word_dt_down = rint(dtDown*fclk/24); | |||
1033 | ||||
1034 | write_register(fd,0x08,Word_dt_down>>8&0xFF,Word_dt_down&0xFF,Word_dt_up>>8&0xFF,Word_dt_up&0xFF); // il y a 2 dt | |||
1035 | Send_IO_Update(f_dds); | |||
1036 | ||||
1037 | //5 Start of the ramp | |||
1038 | ||||
1039 | write_register(fd,0x01,0x00,0x18,0x09,0x00); //rampe simple montante | |||
1040 | Send_IO_Update(f_dds); | |||
1041 | ||||
1042 | return EXIT_SUCCESS; | |||
1043 | } | |||
1044 | ||||
1045 | int ContinuePhaseSweep (int fd, int f_dds,double fclk,double dphiUp, double dphiDown, double PhiMax,double PhiMin, double DeltaTimeUp, double DeltaTimeDown) | |||
1046 | { | |||
1047 | ||||
1048 | ||||
1049 | //calcul de N => N=Deltaphi/dphi = DeltaT/dt | |||
1050 | ||||
1051 | //1-phimax > phimin | |||
1052 | double DeltaPhi = PhiMax-PhiMin; | |||
1053 | if(PhiMax<PhiMin) | |||
1054 | { | |||
1055 | printf("PhiMax should be > PhiMin\n"); | |||
1056 | printf("Can't Start the ramp\n"); | |||
1057 | return -1; | |||
1058 | } | |||
1059 | ||||
1060 | ||||
1061 | //2- Calcul du nombre de points de la rampe | |||
1062 | int NumberPointsUp = DeltaPhi/dphiUp; | |||
1063 | int NumberPointsDown = DeltaPhi/dphiDown; | |||
1064 | ||||
1065 | printf("NumberPointsUp = %d\n",NumberPointsUp); | |||
1066 | printf("NumberPointsDown = %d\n",NumberPointsDown); | |||
1067 | ||||
1068 | //3- En déduire la valeur de dtUp et dtDown | |||
1069 | double dtUp = DeltaTimeUp/NumberPointsUp; | |||
1070 | double dtDown = DeltaTimeDown/NumberPointsDown; | |||
1071 | ||||
1072 | double dtmin = 24/fclk; | |||
1073 | double dtmax = dtmin*(pow(2.0,16.0)-1); | |||
1074 | ||||
1075 | //Check Up | |||
1076 | if(dtUp<dtmin) | |||
1077 | { | |||
1078 | printf("During of ramp UP should be > %f s\n",dtmin*NumberPointsUp); | |||
1079 | printf("Can't start the ramp\n"); | |||
1080 | return -1; | |||
1081 | } | |||
1082 | ||||
1083 | if(dtUp>dtmax) | |||
1084 | { | |||
1085 | printf("During of ramp UP should be < %f\n",dtmax*NumberPointsUp); | |||
1086 | printf("Can't start the ramp\n"); | |||
1087 | return -1; | |||
1088 | } | |||
1089 | ||||
1090 | //Check Down | |||
1091 | if(dtDown<dtmin) | |||
1092 | { | |||
1093 | printf("During of ramp DOWN should be > %f s\n",dtmin*NumberPointsDown); | |||
1094 | printf("Can't start the ramp\n"); | |||
1095 | return -1; | |||
1096 | } | |||
1097 | ||||
1098 | if(dtDown>dtmax) | |||
1099 | { | |||
1100 | printf("During of ramp DOWN should be < %f\n",dtmax*NumberPointsDown); | |||
1101 | printf("Can't start the ramp\n"); | |||
1102 | return -1; | |||
1103 | } | |||
1104 | ||||
1105 | ||||
1106 | ||||
1107 | //check if DeltaAmp is enouth | |||
1108 | /* | |||
1109 | double enouthUP=0.5*NumberPointsUp*100/4095; | |||
1110 | double enouthDOWN=0.5*NumberPointsDown*100/4095; | |||
1111 | ||||
1112 | int borneUP = rint(enouthUP); | |||
1113 | int borneDown = rint(enouthDOWN); | |||
1114 | ||||
1115 | if(DeltaAmp<=enouthUP) | |||
1116 | { | |||
1117 | printf("The amplitude difference should be > %d\n, decrease Number Points for positive slope",borneUP); | |||
1118 | //return -1; | |||
1119 | } | |||
1120 | ||||
1121 | if(DeltaAmp<=enouthDOWN) | |||
1122 | { | |||
1123 | printf("The amplitude difference should be > %d\n, decrease Number Points for negative slope",borneDown); | |||
1124 | //return -1; | |||
1125 | } | |||
1126 | ||||
1127 | */ | |||
1128 | ||||
1129 | //4 - Put word in register | |||
1130 | ||||
1131 | ||||
1132 | //4.1 Limit register | |||
1133 | uint32_t WordPhimin = rint(PhiMin*65535/360); | |||
1134 | uint32_t WordPhimax= rint(PhiMax*65535/360); | |||
1135 | ||||
1136 | ||||
1137 | printf("WordPhimin = %.32x\n",WordPhimin); | |||
1138 | printf("WordPhimax = %.32x\n",WordPhimax); | |||
1139 | ||||
1140 | ||||
1141 | write_register(fd,0x04,WordPhimin>>24&0xFF,WordPhimin>>16&0xFF,WordPhimin>>8&0xFF,WordPhimin&0xFF); //min => lim-(Amp ) = 0x800 = Amax/2 | |||
1142 | Send_IO_Update(f_dds); | |||
1143 | write_register(fd,0x05,WordPhimax>>24&0xFF,WordPhimax>>16&0xFF,WordPhimax>>8&0xFF,WordPhimax&0xFF);//max => lim+(Amp) = 0xFFF= Amax0 | |||
1144 | Send_IO_Update(f_dds); | |||
1145 | ||||
1146 | ||||
1147 | //4.2 dphiUP et dphiDown | |||
1148 | ||||
1149 | // uint32_t Word_dphi_up = rint(dphiUp*(pow(2.0,29.0)-1)/45); | |||
1150 | // uint32_t Word_dphi_down = rint(dphiDown*(pow(2.0,29.0)-1)/45); | |||
1151 | uint32_t Word_dphi_up = rint(dphiUp*(65535/360)); | |||
1152 | uint32_t Word_dphi_down = rint(dphiDown*(65535/360)); | |||
1153 | ||||
1154 | printf("Word_dphi_up = %.32x\n",Word_dphi_up); | |||
1155 | printf("Word_dphi_down = %.32x\n",Word_dphi_down); | |||
1156 | ||||
1157 | /* | |||
1158 | write_register(fd,0x06,Word_dphi_up>>16&0xFF,Word_dphi_up>>8&0xFF,Word_dphi_up>>0&0xFF,Word_dphi_up&0xFF); //dphi_up | |||
1159 | Send_IO_Update(f_dds); | |||
1160 | write_register(fd,0x07,Word_dphi_down>>16&0xFF,Word_dphi_down>>8&0xFF,Word_dphi_down>>0&0xFF,Word_dphi_down&0xFF);//dphi_down | |||
1161 | Send_IO_Update(f_dds); | |||
1162 | ||||
1163 | */ | |||
1164 | ||||
1165 | ||||
1166 | write_register(fd,0x06,Word_dphi_up>>24&0xFF,Word_dphi_up>>16&0xFF,Word_dphi_up>>8&0xFF,Word_dphi_up&0xFF); //dA_up | |||
1167 | Send_IO_Update(f_dds); | |||
1168 | write_register(fd,0x07,Word_dphi_down>>24&0xFF,Word_dphi_down>>16&0xFF,Word_dphi_down>>8&0xFF,Word_dphi_down&0xFF);//dA_down | |||
1169 | Send_IO_Update(f_dds); | |||
1170 | ||||
1171 | ||||
1172 | //4.3 dtUp et dtDown | |||
1173 | ||||
1174 | uint16_t Word_dt_up = rint(dtUp*fclk/24); | |||
1175 | uint16_t Word_dt_down = rint(dtDown*fclk/24); | |||
1176 | ||||
1177 | write_register(fd,0x08,Word_dt_down>>8&0xFF,Word_dt_down&0xFF,Word_dt_up>>8&0xFF,Word_dt_up&0xFF); // il y a 2 dt | |||
1178 | Send_IO_Update(f_dds); | |||
1179 | ||||
1180 | //5 Start of the ramp | |||
1181 | ||||
1182 | write_register(fd,0x01,0x00,0x9E,0x29,0x00); //rampe simple montante | |||
1183 | Send_IO_Update(f_dds); | |||
1184 | ||||
1185 | return EXIT_SUCCESS; | |||
1186 | } | |||
1187 | ||||
1188 | ||||
1189 | //-------------------------FIN FONCTIONS RAMPES HARDWARES | |||
1190 | ||||
1191 | //--------------------------FONCTIONS RAMPES SOFTWARES | |||
1192 | ||||
1193 | int RampAmpFromSoft(int fd, int f_dds,double DeltaTimeUp,double AIni, double AFin) | |||
1194 | { | |||
1195 | ||||
1196 | //On va plutôt fixé dA sinon trop de contrainte : => Besoin d'allocation dynamique | |||
1197 | double dA=0.024;//en % | |||
1198 | double DeltaAmp = AIni-AFin; | |||
1199 | double AbsDeltaAmp = 0; | |||
1200 | if(DeltaAmp>=0) | |||
1201 | { | |||
1202 | AbsDeltaAmp = DeltaAmp; | |||
1203 | } | |||
1204 | else | |||
1205 | { | |||
1206 | AbsDeltaAmp = -1*DeltaAmp; | |||
1207 | } | |||
1208 | ||||
1209 | int NumberPoints = AbsDeltaAmp/dA; | |||
1210 | ||||
1211 | double dt=DeltaTimeUp/NumberPoints; | |||
1212 | ||||
1213 | printf("Taille du tableau = %d\n", NumberPoints); | |||
1214 | printf("dt = %f s\n",dt); | |||
1215 | ||||
1216 | ||||
1217 | uint16_t* ArrayWordAmp= NULL; | |||
1218 | ArrayWordAmp = malloc(NumberPoints*sizeof(uint16_t)); | |||
1219 | ||||
1220 | //extraction de la phase initiale et de l'amplitude | |||
1221 | ||||
1222 | uint32_t ReadPhaseAmpWord = 0x00000000; | |||
1223 | read_register(fd, 0x0c,&ReadPhaseAmpWord); | |||
1224 | printf("ReadPhaseAmpWord = %.8x \n", ReadPhaseAmpWord); | |||
1225 | ||||
1226 | uint16_t WordPhaseInitiale = ReadPhaseAmpWord&0xFFFF; | |||
1227 | printf("Phase = %.4x \n", WordPhaseInitiale); | |||
1228 | ||||
1229 | ||||
1230 | // | |||
1231 | for(int i=0;i<NumberPoints;i++) | |||
1232 | { | |||
1233 | ArrayWordAmp[i]=rint((AIni+i*dA)*4096/100); | |||
1234 | // printf("ArrayWordAmp[%d] = %.16x\n", i, ArrayWordAmp[i]); | |||
1235 | } | |||
1236 | free(ArrayWordAmp); | |||
1237 | ||||
1238 | printf("Array calculated\n"); | |||
1239 | ||||
1240 | printf("Start of the ramp\n"); | |||
1241 | for(int i=0;i<NumberPoints;i++) | |||
1242 | { | |||
1243 | write_register(fd,0x0c,ArrayWordAmp[i]>>8&0xFF,ArrayWordAmp[i]&0xFF,WordPhaseInitiale>>8&0xFF,WordPhaseInitiale&0xFF); | |||
1244 | Send_IO_Update(f_dds); | |||
1245 | usleep(1000000*dt); | |||
1246 | } | |||
1247 | ||||
1248 | ||||
1249 | ||||
1250 | /* | |||
1251 | uint16_t PhaseWord = 0x0000; | |||
1252 | uint16_t AmpWord = 0x0000; | |||
1253 | uint32_t ReadPhaseAmpWord=0x00000000; | |||
1254 | ||||
1255 | AmpWord = rint(amplitude*(pow(2.0,12.0)-1)/100); | |||
1256 | ||||
1257 | read_register(fd,0x0c,&ReadPhaseAmpWord); | |||
1258 | ||||
1259 | PhaseWord = ReadPhaseAmpWord&0xFFFF; | |||
1260 | ||||
1261 | write_register(fd,0x0c,AmpWord>>8&0xFF,AmpWord&0xFF,PhaseWord>>8&0xFF,PhaseWord&0xFF); | |||
1262 | ||||
1263 | */ | |||
1264 | ||||
1265 | ||||
1266 | ||||
1267 | /* | |||
1268 | ||||
1269 | //pas de durée dtUp et dtDown fixée au minimum à 1 ms | |||
1270 | if(DeltaTimeUp < 4.095) | |||
1271 | { | |||
1272 | printf("Use hardware fonctions for the ramp\n"); | |||
1273 | } | |||
1274 | ||||
1275 | ||||
1276 | // | |||
1277 | double DeltaAmp = AMax-AMin; | |||
1278 | double dA = DeltaAmp/TAILLETAB; | |||
1279 | printf("dA=%f\n",dA); | |||
1280 | ||||
1281 | ||||
1282 | if(dA<0.024) | |||
1283 | { | |||
1284 | printf("Amplitude step should be > 0.024 pourcent\n"); | |||
1285 | printf("Impossible to start a ramp of amplitude\n"); | |||
1286 | return -1; | |||
1287 | } | |||
1288 | ||||
1289 | //extraction de la phase initiale et de l'amplitude | |||
1290 | ||||
1291 | uint32_t ReadPhaseAmpWord = 0x00000000; | |||
1292 | read_register(fd, 0x0c,&ReadPhaseAmpWord); | |||
1293 | printf("ReadPhaseAmpWord = %.8x \n", ReadPhaseAmpWord); | |||
1294 | ||||
1295 | uint16_t WordPhaseInitiale = ReadPhaseAmpWord&0xFFFF; | |||
1296 | printf("Phase = %.4x \n", WordPhaseInitiale); | |||
1297 | ||||
1298 | uint16_t WordAmpInitiale = ReadPhaseAmpWord>>16&0xFFFF; | |||
1299 | printf("Amp = %.4x \n", WordAmpInitiale); | |||
1300 | ||||
1301 | uint16_t Word_dA = rint(dA*4095/100); | |||
1302 | ||||
1303 | uint32_t ArrayWordAmp[TAILLETAB]; | |||
1304 | ||||
1305 | for(int i=0;i<TAILLETAB;i++) | |||
1306 | { | |||
1307 | ArrayWordAmp[i]=WordAmpInitiale+i*Word_dA; | |||
1308 | // printf("ArrayWordAmp[%d] = %.16x\n", i, ArrayWordAmp[i]); | |||
1309 | } | |||
1310 | ||||
1311 | */ | |||
1312 | ||||
1313 | return EXIT_SUCCESS; | |||
1314 | } | |||
1315 | ||||
1316 | int RampPhaseFromSoft(int fd, int f_dds,double DeltaTimeUp,double PhiIni, double PhiFin) | |||
1317 | { | |||
1318 | ||||
1319 | //On va plutôt fixé dphi : => Besoin d'allocation dynamique | |||
1320 | double dphi=0.06;//en ° | |||
1321 | double DeltaPhi = PhiIni-PhiFin; | |||
1322 | double AbsDeltaPhi = 0; | |||
1323 | if(DeltaPhi>=0) | |||
1324 | { | |||
1325 | AbsDeltaPhi = DeltaPhi; | |||
1326 | } | |||
1327 | else | |||
1328 | { | |||
1329 | AbsDeltaPhi = -1*DeltaPhi; | |||
1330 | } | |||
1331 | ||||
1332 | int NumberPoints = AbsDeltaPhi/dphi; | |||
1333 | ||||
1334 | double dt=DeltaTimeUp/NumberPoints; | |||
1335 | ||||
1336 | printf("Taille du tableau = %d\n", NumberPoints); | |||
1337 | printf("dt = %f s\n",dt); | |||
1338 | ||||
1339 | ||||
1340 | uint16_t* ArrayWordPhi= NULL; | |||
1341 | ArrayWordPhi = malloc(NumberPoints*sizeof(uint16_t)); | |||
1342 | ||||
1343 | //extraction de l'amplitude | |||
1344 | ||||
1345 | uint32_t ReadPhaseAmpWord = 0x00000000; | |||
1346 | read_register(fd, 0x0c,&ReadPhaseAmpWord); | |||
1347 | printf("ReadPhaseAmpWord = %.8x \n", ReadPhaseAmpWord); | |||
1348 | ||||
1349 | uint16_t WordAmpInitiale = ReadPhaseAmpWord>>16&0xFFFF; | |||
1350 | printf("Amp = %.4x \n", WordAmpInitiale); | |||
1351 | ||||
1352 | ||||
1353 | for(int i=0;i<NumberPoints;i++) | |||
1354 | { | |||
1355 | ArrayWordPhi[i]=rint((PhiIni+i*dphi)*65536/360); | |||
1356 | } | |||
1357 | free(ArrayWordPhi); | |||
1358 | ||||
1359 | printf("Array calculated\n"); | |||
1360 | ||||
1361 | printf("Start of the ramp\n"); | |||
1362 | for(int i=0;i<NumberPoints;i++) | |||
1363 | { | |||
1364 | write_register(fd,0x0c,WordAmpInitiale>>8&0xFF,WordAmpInitiale&0xFF,ArrayWordPhi[i]>>8&0xFF,ArrayWordPhi[i]&0xFF); | |||
1365 | Send_IO_Update(f_dds); | |||
1366 | usleep(1000000*dt); | |||
1367 | } | |||
1368 | ||||
1369 |
src/ddsFreq.c
#include <stdlib.h> | 1 | 1 | #include <stdlib.h> | |
#include <stdio.h> | 2 | 2 | #include <stdio.h> | |
#include <unistd.h> | 3 | 3 | #include <unistd.h> | |
#include <math.h> | 4 | 4 | #include <math.h> | |
#include "ddsFreq.h" | 5 | 5 | #include "ddsFreq.h" | |
#include "ad9915.h" | 6 | 6 | #include "ad9915.h" | |
7 | 7 | |||
//#define debug | 8 | 8 | //#define debug | |
long double pgcd ( long double m , long double n) | 9 | 9 | long double pgcd ( long double m , long double n) | |
{ | 10 | 10 | { | |
if (fmod(m,n) ==0) | 11 | 11 | if (fmod(m,n) ==0) | |
return n; | 12 | 12 | return n; | |
return pgcd(n,fmod(m,n)); | 13 | 13 | return pgcd(n,fmod(m,n)); | |
} | 14 | 14 | } | |
15 | 15 | |||
int setddsFreq(int fd, int f_dds, long double f0, long double fs) | 16 | 16 | int setddsFreq(int fd, int f_dds, long double f0, long double fs) | |
{ | 17 | 17 | { | |
18 | 18 | |||
#ifdef debug | 19 | 19 | #ifdef debug | |
printf("f0=%Le\tfs=%Le\n",f0,fs); | 20 | 20 | printf("f0=%Le\tfs=%Le\n",f0,fs); | |
#endif | 21 | 21 | #endif | |
22 | 22 | |||
if (fs<0 || f0<0) return EXIT_FAILURE; | 23 | 23 | if (fs<0 || f0<0) return EXIT_FAILURE; | |
24 | 24 | |||
struct frac f1; | 25 | 25 | struct frac f1; | |
26 | 26 | |||
f1.numerator = f0; | 27 | 27 | f1.numerator = f0; | |
f1.denominator = fs; | 28 | 28 | f1.denominator = fs; | |
29 | 29 | |||
long double d1 = pgcd (f1.numerator , f1.denominator ); | 30 | 30 | long double d1 = pgcd (f1.numerator , f1.denominator ); | |
//printf(" d1 = %24.16Lf\n",d1); | 31 | 31 | //printf(" d1 = %24.16Lf\n",d1); | |
32 | 32 | |||
long double M = f0 / d1 ; | 33 | 33 | long double M = f0 / d1 ; | |
long double N = fs / d1 ; | 34 | 34 | long double N = fs / d1 ; | |
//printf(" M = f0 / d1 = %24.16Lf\n",M); | 35 | 35 | //printf(" M = f0 / d1 = %24.16Lf\n",M); | |
//printf(" N = fs / d1 = %24.16Lf\n",N); | 36 | 36 | //printf(" N = fs / d1 = %24.16Lf\n",N); | |
37 | 37 | |||
38 | 38 | |||
long double ftw = M * scalbn(1.0,32); | 39 | 39 | long double ftw = M * scalbn(1.0,32); | |
ftw /= N; | 40 | 40 | ftw /= N; | |
//printf("ftw = %24.16Lf\n",ftw); | 41 | 41 | //printf("ftw = %24.16Lf\n",ftw); | |
42 | 42 | |||
43 | 43 | |||
//printf("X=floor(ftw) = %24.16Lf\n",(long double)floor(ftw)); | 44 | 44 | //printf("X=floor(ftw) = %24.16Lf\n",(long double)floor(ftw)); | |
45 | 45 | |||
long double Y = M * scalbn(1.0,32); | 46 | 46 | long double Y = M * scalbn(1.0,32); | |
Y -= N * floor(ftw); | 47 | 47 | Y -= N * floor(ftw); | |
//printf("Y=M*2**32-X*N = %24.16Lf\n",Y); | 48 | 48 | //printf("Y=M*2**32-X*N = %24.16Lf\n",Y); | |
49 | 49 | |||
long double d2 = pgcd (Y,N); | 50 | 50 | long double d2 = pgcd (Y,N); | |
//printf(" d2 = %24.16Lf\n",d2); | 51 | 51 | //printf(" d2 = %24.16Lf\n",d2); | |
52 | 52 | |||
long double A = Y / d2; | 53 | 53 | long double A = Y / d2; | |
long double B = N / d2; | 54 | 54 | long double B = N / d2; | |
//printf("A = Y/d2 = %24.16Lf\n",A); | 55 | 55 | //printf("A = Y/d2 = %24.16Lf\n",A); | |
//printf("B = N/d2 = %24.16Lf\n",B); | 56 | 56 | //printf("B = N/d2 = %24.16Lf\n",B); | |
57 | 57 | |||
//printf("f0 = (M/N) * fclk= %24.32Lf\n",fs*M/N); | 58 | 58 | //printf("f0 = (M/N) * fclk= %24.32Lf\n",fs*M/N); | |
//printf("f0 = (X+A/B)2**32= %24.32Lf\n",fs*(floor(ftw)+A/B)/scalbn(1.0,32)); | 59 | 59 | //printf("f0 = (X+A/B)2**32= %24.32Lf\n",fs*(floor(ftw)+A/B)/scalbn(1.0,32)); | |
60 | 60 | |||
#ifdef debug | 61 | 61 | #ifdef debug | |
printf("\n so finally the programmed registers are :\n" | 62 | 62 | printf("\n so finally the programmed registers are :\n" | |
"ftw= 0x%08x A= 0x%08x B= 0x%08x\n" | 63 | 63 | "ftw= 0x%08x A= 0x%08x B= 0x%08x\n" | |
"",(unsigned int)ftw,(unsigned int)A,(unsigned int)B); | 64 | 64 | "",(unsigned int)ftw,(unsigned int)A,(unsigned int)B); | |
printf("uint ftw = %d\n",(unsigned int)ftw); | 65 | 65 | printf("uint ftw = %d\n",(unsigned int)ftw); | |
66 | 66 | |||
printf("\n 0x%08x 0x%08x 0x%08x \n\n",(unsigned int)ftw,(unsigned int)A,(unsigned int)B); | 67 | 67 | printf("\n 0x%08x 0x%08x 0x%08x \n\n",(unsigned int)ftw,(unsigned int)A,(unsigned int)B); | |
//setFreqMM(fd,f_dds,(unsigned int)ftw, (unsigned int)A, (unsigned int)B); | 68 | 68 | //setFreqMM(fd,f_dds,(unsigned int)ftw, (unsigned int)A, (unsigned int)B); | |
#endif | 69 | 69 | #endif | |
setFreqMM(fd,f_dds,(unsigned int)ftw, 2*(unsigned int)B, 2*(unsigned int)A); //??why *2?? | 70 | 70 | setFreqMM(fd,f_dds,(unsigned int)ftw, 2*(unsigned int)B, 2*(unsigned int)A); //??why *2?? | |
return EXIT_SUCCESS; | 71 | 71 | return EXIT_SUCCESS; | |
} | 72 | 72 | } | |
int ddsFreq(int fd, int f_dds) | 73 | 73 | int ddsFreq(int fd, int f_dds) | |
{ | 74 | 74 | { | |
//checkSize(); | 75 | 75 | checkSize(); | |
long double f0,fs; | 76 | 76 | long double f0,fs; | |
//printf("long = %lu\n",sizeof (long)); | 77 | 77 | //printf("long = %lu\n",sizeof (long)); | |
//printf("float = %lu\n",sizeof (float)); | 78 | 78 | //printf("float = %lu\n",sizeof (float)); | |
//printf("double = %lu\n",sizeof (double)); | 79 | 79 | //printf("double = %lu\n",sizeof (double)); | |
//printf("long double = %lu\n",sizeof (long double)); | 80 | 80 | //printf("long double = %lu\n",sizeof (long double)); | |
81 | 81 | |||
printf("\nDesired output Frequency (MHz) : "); | 82 | 82 | printf("\nDesired output Frequency (MHz) : "); | |
scanf("%Lf",&f0); | 83 | 83 | scanf("%Lf",&f0); | |
printf("DDS frequency Clock (MHz) : "); | 84 | 84 | printf("DDS frequency Clock (MHz) : "); | |
scanf("%Lf",&fs); | 85 | 85 | scanf("%Lf",&fs); | |
86 | 86 | |||
//long double f0=atof(argv[1]); //desired output freq | 87 | 87 | //long double f0=atof(argv[1]); //desired output freq | |
//long double fs=atof(argv[2]); //dds_clk | 88 | 88 | //long double fs=atof(argv[2]); //dds_clk | |
//int toto = (int)strtol(argv[3],NULL,0); | 89 | 89 | //int toto = (int)strtol(argv[3],NULL,0); | |
//printf("toto=%d\t%x\n",toto,toto); | 90 | 90 | //printf("toto=%d\t%x\n",toto,toto); | |
91 | 91 | |||
if (fs<0 || f0<0) return EXIT_FAILURE; | 92 | 92 | if (fs<0 || f0<0) return EXIT_FAILURE; | |
93 | 93 | |||
struct frac f1; | 94 | 94 | struct frac f1; | |
95 | 95 | |||
f1.numerator = f0; | 96 | 96 | f1.numerator = f0; | |
f1.denominator = fs; | 97 | 97 | f1.denominator = fs; | |
98 | 98 | |||
long double d1 = pgcd (f1.numerator , f1.denominator ); | 99 | 99 | long double d1 = pgcd (f1.numerator , f1.denominator ); | |
printf(" d1 = %24.16Lf\n",d1); | 100 | 100 | printf(" d1 = %24.16Lf\n",d1); | |
101 | 101 | |||
long double M = f0 / d1 ; | 102 | 102 | long double M = f0 / d1 ; | |
long double N = fs / d1 ; | 103 | 103 | long double N = fs / d1 ; | |
printf(" M = f0 / d1 = %24.16Lf\n",M); | 104 | 104 | printf(" M = f0 / d1 = %24.16Lf\n",M); | |
printf(" N = fs / d1 = %24.16Lf\n",N); | 105 | 105 | printf(" N = fs / d1 = %24.16Lf\n",N); |