mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-21 03:10:02 +02:00
gotthard:highvoltage done
git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@57 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
parent
1ecde6beeb
commit
39d9ae8b7b
@ -852,8 +852,7 @@ int setDACRegister(int idac, int val, int imod) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float getTemperature(int tempSensor, int imod)
|
float getTemperature(int tempSensor, int imod){
|
||||||
{
|
|
||||||
float val;
|
float val;
|
||||||
char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"};
|
char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"};
|
||||||
imod=0;//ignoring more than 1 mod for now
|
imod=0;//ignoring more than 1 mod for now
|
||||||
@ -863,31 +862,59 @@ float getTemperature(int tempSensor, int imod)
|
|||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printf("Getting Temperature of module:%d for the %s\n",imod,cTempSensor[tempSensor]);
|
printf("Getting Temperature of module:%d for the %s\n",imod,cTempSensor[tempSensor]);
|
||||||
#endif
|
#endif
|
||||||
bus_w(TEMP_SPI_IN,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby
|
bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby
|
||||||
bus_w(TEMP_SPI_IN,(T1_CLK_BIT)&~(T1_CS_BIT)|(T2_CLK_BIT));//high clk low cs
|
bus_w(TEMP_IN_REG,(T1_CLK_BIT)&~(T1_CS_BIT)|(T2_CLK_BIT));//high clk low cs
|
||||||
|
|
||||||
for(k=0;k<2;k++){
|
for(k=0;k<2;k++){
|
||||||
for(i=0;i<times;i++) {
|
for(i=0;i<times;i++) {
|
||||||
//repeats is number of register writes for delay
|
//repeats is number of register writes for delay
|
||||||
for(j=0;j<repeats;j++)
|
for(j=0;j<repeats;j++)
|
||||||
bus_w(TEMP_SPI_IN,~(T1_CLK_BIT)&~(T1_CS_BIT)&~(T2_CLK_BIT)&~(T2_CS_BIT));//low clk low cs
|
bus_w(TEMP_IN_REG,~(T1_CLK_BIT)&~(T1_CS_BIT)&~(T2_CLK_BIT)&~(T2_CS_BIT));//low clk low cs
|
||||||
for(j=0;j<repeats;j++)
|
for(j=0;j<repeats;j++)
|
||||||
bus_w(TEMP_SPI_IN,(T1_CLK_BIT)&~(T1_CS_BIT)|(T2_CLK_BIT));//high clk low cs
|
bus_w(TEMP_IN_REG,(T1_CLK_BIT)&~(T1_CS_BIT)|(T2_CLK_BIT));//high clk low cs
|
||||||
|
|
||||||
if(times==11)//only the first time
|
if(times==11)//only the first time
|
||||||
tempVal= (tempVal<<1) + (bus_r(TEMP_SPI_OUT) & (1<<tempSensor));
|
tempVal= (tempVal<<1) + (bus_r(TEMP_OUT_REG) & (1<<tempSensor));
|
||||||
}
|
}
|
||||||
times=8;
|
times=8;
|
||||||
}
|
}
|
||||||
bus_w(TEMP_SPI_IN,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby
|
bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby
|
||||||
val=((float)tempVal)/4.0;
|
val=((float)tempVal)/4.0;
|
||||||
|
|
||||||
#ifdef VERBOSE//read time from start needed??
|
#ifdef VERBOSE
|
||||||
printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val);
|
printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val);
|
||||||
#endif
|
#endif
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getHighVoltage(int val, int imod){
|
||||||
|
#ifdef VERBOSE
|
||||||
|
printf("Getting High Voltage of module:%d\n",imod);
|
||||||
|
#endif
|
||||||
|
volatile u_int32_t addr=HV_REG;
|
||||||
|
int input []={ 0, 90,110,120,150,180,200};
|
||||||
|
int value1[]={0x0,0x0,0x2,0x4,0x6,0x8,0xA};
|
||||||
|
int value2[]={0x0,0x1,0x3,0x5,0x7,0x9,0xB};
|
||||||
|
//changing anything here should also be changed in
|
||||||
|
//server_funcs.c to check if wrongly written
|
||||||
|
switch(val){
|
||||||
|
case -1: break;
|
||||||
|
case 0: bus_w(addr,0x0); break;
|
||||||
|
case 90: bus_w(addr,0x0); bus_w(addr,0x1); break;
|
||||||
|
case 110: bus_w(addr,0x2); bus_w(addr,0x3); break;
|
||||||
|
case 120: bus_w(addr,0x4); bus_w(addr,0x5); break;
|
||||||
|
case 150: bus_w(addr,0x6); bus_w(addr,0x7); break;
|
||||||
|
case 180: bus_w(addr,0x8); bus_w(addr,0x9); break;
|
||||||
|
case 200: bus_w(addr,0xA); bus_w(addr,0xB); break;
|
||||||
|
default : printf("Not a valid voltage\n"); return -1; break;
|
||||||
|
}
|
||||||
|
val=bus_r(addr);
|
||||||
|
#ifdef VERBOSE
|
||||||
|
printf("High Voltage of module:%d is %d\n",imod,val);
|
||||||
|
#endif
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
u_int32_t runBusy(void) {
|
u_int32_t runBusy(void) {
|
||||||
return bus_r(STATUS_REG)&RUN_BUSY_BIT;
|
return bus_r(STATUS_REG)&RUN_BUSY_BIT;
|
||||||
|
@ -47,6 +47,7 @@ int setContinousReadOut(int d);
|
|||||||
int setDACRegister(int idac, int val, int imod);
|
int setDACRegister(int idac, int val, int imod);
|
||||||
|
|
||||||
float getTemperature(int tempSensor, int imod);
|
float getTemperature(int tempSensor, int imod);
|
||||||
|
int getHighVoltage(int val, int imod);
|
||||||
|
|
||||||
u_int64_t getMcsNumber();
|
u_int64_t getMcsNumber();
|
||||||
u_int32_t getMcsVersion();
|
u_int32_t getMcsVersion();
|
||||||
|
@ -587,6 +587,7 @@ float initDACbyIndexDACU(int ind, int val, int imod) {
|
|||||||
|
|
||||||
if (setDACRegister(ind, -1, im)!=setDACRegister(ind, -1, 0)) {
|
if (setDACRegister(ind, -1, im)!=setDACRegister(ind, -1, 0)) {
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
|
|
||||||
printf("mod %d returning -1\n",im);
|
printf("mod %d returning -1\n",im);
|
||||||
#endif
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
@ -727,7 +728,6 @@ float getDACbyIndexDACU(int ind, int imod) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//changed arguments by dhanya
|
|
||||||
int initDAC(int dac_addr, int value, int imod) {
|
int initDAC(int dac_addr, int value, int imod) {
|
||||||
int i;
|
int i;
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
@ -741,6 +741,43 @@ int initDAC(int dac_addr, int value, int imod) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float getTemperatureByModule(int tempSensor, int imod)
|
||||||
|
{
|
||||||
|
int im;
|
||||||
|
//for the particular module
|
||||||
|
if (imod>=0 && imod<nModX) {
|
||||||
|
return getTemperature(tempSensor,imod);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//checks if all modules have the same value(ALLMOD)
|
||||||
|
for (im=1; im<nModX; im++) {
|
||||||
|
if (getTemperature(tempSensor,im)!=getTemperature(tempSensor,0)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getTemperature(tempSensor,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int getHighVoltageByModule(int val, int imod)
|
||||||
|
{
|
||||||
|
int im;
|
||||||
|
//for the particular module
|
||||||
|
if (imod>=0 && imod<nModX) {
|
||||||
|
return getHighVoltage(val,imod);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//checks if all modules have the same value(ALLMOD)
|
||||||
|
for (im=1; im<nModX; im++) {
|
||||||
|
if (getHighVoltage(val,im)!=getHighVoltage(val,0)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getHighVoltage(val,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void showbits(int h)
|
void showbits(int h)
|
||||||
{
|
{
|
||||||
|
@ -25,14 +25,14 @@
|
|||||||
|
|
||||||
|
|
||||||
// DAC definitions
|
// DAC definitions
|
||||||
enum {VREF_DS, VCASCN_PB, VCASCP_PB, VOUT_CM, VCASC_OUT, VIN_CM, VREF_COMP, IB_TESTC};
|
enum {VREF_DS, VCASCN_PB, VCASCP_PB, VOUT_CM, VCASC_OUT, VIN_CM, VREF_COMP, IB_TESTC, };
|
||||||
|
|
||||||
/* DAC adresses */
|
/* DAC adresses */
|
||||||
#define DACCS {0,0,1,1,2,2,3,3,4,4,5,5,6,6}
|
#define DACCS {0,0,1,1,2,2,3,3,4,4,5,5,6,6}
|
||||||
#define DACADDR {0,1,0,1,0,1,0,1,0,1,0,1,0,1}
|
#define DACADDR {0,1,0,1,0,1,0,1,0,1,0,1,0,1}
|
||||||
|
|
||||||
//Temp definitions
|
//Temp/HIGH VOLTAGE Definitions
|
||||||
enum {TEMP_ADC, TEMP_FPGA};
|
enum {TEMP_ADC, TEMP_FPGA, HIGH_VOLTAGE};
|
||||||
|
|
||||||
//dynamic range
|
//dynamic range
|
||||||
#define MAX5523
|
#define MAX5523
|
||||||
@ -119,6 +119,11 @@ float initDACbyIndexDACU(int ind,int val, int imod);
|
|||||||
float getDACbyIndexDACU(int ind, int imod);
|
float getDACbyIndexDACU(int ind, int imod);
|
||||||
int getThresholdEnergy();
|
int getThresholdEnergy();
|
||||||
int setThresholdEnergy(int ethr);
|
int setThresholdEnergy(int ethr);
|
||||||
|
|
||||||
|
/* Temp/HV routines*/
|
||||||
|
float getTemperatureByModule(int tempSensor, int imod);
|
||||||
|
int getHighVoltageByModule(int val, int imod);
|
||||||
|
|
||||||
/* Initialization*/
|
/* Initialization*/
|
||||||
int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts,int imod );
|
int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts,int imod );
|
||||||
int initChannelbyNumber(sls_detector_channel myChan);
|
int initChannelbyNumber(sls_detector_channel myChan);
|
||||||
|
@ -8,21 +8,24 @@
|
|||||||
|
|
||||||
|
|
||||||
/* registers defined in FPGA */
|
/* registers defined in FPGA */
|
||||||
|
#define GAIN_REG 0x10<<11
|
||||||
|
#define DAQ_REG 0x1b<<11
|
||||||
|
|
||||||
|
#define DUMMY_REG 0x13<<11
|
||||||
#define FIX_PATT_REG 0x45<<11
|
#define FIX_PATT_REG 0x45<<11
|
||||||
#define FPGA_VERSION_REG 0x47<<11
|
#define FPGA_VERSION_REG 0x47<<11
|
||||||
#define DUMMY_REG 0x13<<11
|
|
||||||
|
|
||||||
#define CONTROL_REG 0x5d<<11
|
#define CONTROL_REG 0x5d<<11
|
||||||
#define STATUS_REG 0x5e<<11
|
#define STATUS_REG 0x5e<<11
|
||||||
#define CONFIG_REG 0x5f<<11
|
#define CONFIG_REG 0x5f<<11
|
||||||
#define EXT_SIGNAL_REG 0x6a<<11
|
#define EXT_SIGNAL_REG 0x6a<<11
|
||||||
|
|
||||||
#define GAIN_REG 0x10<<11
|
|
||||||
#define DAQ_REG 0x1b<<11
|
|
||||||
|
|
||||||
//temperature
|
//temperature
|
||||||
#define TEMP_SPI_IN 0x81<<11
|
#define TEMP_IN_REG 0x81<<11
|
||||||
#define TEMP_SPI_OUT 0x82<<11
|
#define TEMP_OUT_REG 0x82<<11
|
||||||
|
|
||||||
|
//HV
|
||||||
|
#define HV_REG 0x93<<11
|
||||||
|
|
||||||
//not used so far
|
//not used so far
|
||||||
#define SPEED_REG 0x006000
|
#define SPEED_REG 0x006000
|
||||||
|
@ -783,7 +783,7 @@ int read_register(int fnum) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int set_dac(int fnum) {
|
int set_dac(int fnum) {
|
||||||
|
//everything in here does for all mods
|
||||||
float retval;
|
float retval;
|
||||||
int ret=OK;
|
int ret=OK;
|
||||||
int arg[2];
|
int arg[2];
|
||||||
@ -794,7 +794,7 @@ int set_dac(int fnum) {
|
|||||||
int idac=0;
|
int idac=0;
|
||||||
int itemp=-1;
|
int itemp=-1;
|
||||||
|
|
||||||
sprintf(mess,"Can't set DAC/POT/TEMP\n");
|
sprintf(mess,"Can't set DAC/TEMP/HV\n");
|
||||||
|
|
||||||
|
|
||||||
n = receiveDataOnly(arg,sizeof(arg));
|
n = receiveDataOnly(arg,sizeof(arg));
|
||||||
@ -812,7 +812,7 @@ int set_dac(int fnum) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printf("Setting DAC/POT/TEMP %d of module %d to %f V\n", ind, imod, val);
|
printf("Setting DAC/TEMP/HV %d of module %d to %f V\n", ind, imod, val);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (imod>=getNModBoard())
|
if (imod>=getNModBoard())
|
||||||
@ -852,34 +852,39 @@ int set_dac(int fnum) {
|
|||||||
case TEMPERATURE_FPGA:
|
case TEMPERATURE_FPGA:
|
||||||
itemp=TEMP_FPGA;
|
itemp=TEMP_FPGA;
|
||||||
break;
|
break;
|
||||||
|
case HV_POT:
|
||||||
|
itemp=HIGH_VOLTAGE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Unknown DAC/POT/TEMP index %d\n",ind);
|
printf("Unknown DAC/TEMP/HV index %d\n",ind);
|
||||||
sprintf(mess,"Unknown DAC/POT/TEMP index %d\n",ind);
|
sprintf(mess,"Unknown DAC/TEMP/HV index %d\n",ind);
|
||||||
ret=FAIL;
|
ret=FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret==OK) {
|
if (ret==OK) {
|
||||||
if(itemp!=-1) {
|
//dac
|
||||||
if (imod>=0 && imod<nModX)
|
if(itemp==-1)
|
||||||
retval=getTemperature(itemp,imod);
|
|
||||||
else
|
|
||||||
//get only the first mods temp, but dunno when this is used
|
|
||||||
retval=getTemperature(itemp,0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
retval=initDACbyIndexDACU(idac,val,imod);
|
retval=initDACbyIndexDACU(idac,val,imod);
|
||||||
|
else
|
||||||
|
{ //HV
|
||||||
|
if(itemp==HIGH_VOLTAGE)
|
||||||
|
retval=getHighVoltageByModule(val,imod);
|
||||||
|
else//Temp
|
||||||
|
retval=getTemperatureByModule(itemp,imod);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printf("DAC/POT/TEMP set to %f V\n", retval);
|
printf("DAC/TEMP/HV set to %f V\n", retval);
|
||||||
#endif
|
#endif
|
||||||
if (retval==val || val==-1)
|
|
||||||
ret=OK;
|
|
||||||
else {
|
|
||||||
ret=FAIL;
|
ret=FAIL;
|
||||||
printf("Setting dac/pot %d of module %d: wrote %f but read %f\n", ind, imod, val, retval);
|
if((itemp==HIGH_VOLTAGE)&&(retval!=-1))
|
||||||
}
|
ret =OK;
|
||||||
|
else if (retval==val || val==-1)
|
||||||
|
ret=OK;
|
||||||
|
|
||||||
|
if(ret==FAIL)
|
||||||
|
printf("Setting dac/hv %d of module %d: wrote %f but read %f\n", ind, imod, val, retval);
|
||||||
|
|
||||||
|
|
||||||
/* send answer */
|
/* send answer */
|
||||||
@ -891,12 +896,8 @@ int set_dac(int fnum) {
|
|||||||
} else {
|
} else {
|
||||||
n += sendDataOnly(mess,sizeof(mess));
|
n += sendDataOnly(mess,sizeof(mess));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Maybe this is done inside the initialization funcs */
|
|
||||||
//detectorDacs[imod][ind]=val;
|
|
||||||
/*return ok/fail*/
|
/*return ok/fail*/
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user