[update] lsv module

This commit is contained in:
Roy
2021-01-26 15:33:02 +08:00
parent 3fda9fff6c
commit 5938d6645f
6 changed files with 145 additions and 131 deletions
@@ -3,7 +3,7 @@
#define Vset INSTRUCTION.Vset
static void CV3Curve(void)
static void cv_volt_out(void)
{
struct wm_cv_ctx_t *cv = (struct wm_cv_ctx_t *)wm_get();
struct wm_meas_t *m = &cv->measure;
@@ -3,99 +3,101 @@
#define Vset INSTRUCTION.Vset
//static uint16_t LSVCurve(void *WM){
// struct LSVMode *LSV = (struct LSVMode *)WM;
//
// static uint16_t DACOutCode;
// static int32_t Vin;
// static int32_t Vout;
// static int32_t DeltaVout;
//
// Vin = LSV->_measureVin * 200;//[5nV]
// if(DACReset){
// Vout = Vset + Vin;
// DACReset = false;
// }else{
// DeltaVout = Vset - (Vout - Vin);
// Vout = Vout + DeltaVout;
// }
//
// INSTRUCTION.VoltConstant = Vout / 40000 + 25000;//5nV=>usercode
// DACOutCode = Usercode_Correction_to_DAC(INSTRUCTION.VoutGainLevel, INSTRUCTION.VoltConstant);
//
// int32_t RealV2;
// RealV2 = (int32_t)((Vout - Vin) / 200);//[1uV]
// InputNotify(NOTIFY_VOLT, RealV2);
//
// int32_t RealV;
// RealV = (int32_t)(Vout / 200);//[1uV]
// InputNotify(NOTIFY_IMPEDANCE, RealV);
//
// DAC_outputV(DACOutCode);
////
// return DACOutCode;
//}
static void lsv_volt_out(void)
{
struct wm_lsv_ctx_t *lsv = (struct wm_lsv_ctx_t *)wm_get();
struct wm_meas_t *m = &lsv->measure;
uint16_t DACOutCode;
int32_t Vin;
int32_t Vout;
int32_t DeltaVout;
//static void lsv_vscan(void *WM){
// struct LSVMode *LSV = (struct LSVMode *)WM;
//
// NotifyCycleNumber = (INSTRUCTION.cycleNumber - LSV->_cycleNumber + 1);
//
// if(vscanReset){
// if(INSTRUCTION.directionInit == 1){
// LSV->_direction_up = true;
// LSV->_current_direction_up = true;
// }else{
// LSV->_direction_up = false;
// LSV->_current_direction_up = false;
// }
//
// //Vsetp = x * 20 * N, x=xmV ; N=VscanRate
// if(INSTRUCTION.step <= 10){
// LSV->_Vstep = INSTRUCTION.step * INSTRUCTION.VsetRate / 5;
// }else{
// LSV->_Vstep = INSTRUCTION.step / 5 * INSTRUCTION.VsetRate;
// }
//
// Vset = LSV->_Vinit;
// }
//
// if(!vscanReset){
//
// if (LSV->_current_direction_up){
// Vset = Vset + LSV->_Vstep * GPT.GptimerMultiple;
// }else{
// Vset = Vset - LSV->_Vstep * GPT.GptimerMultiple;
// }
//
// /*stop condition*/
// if (Vset >= LSV->_Vmax){
// ModeLED(POST_WORK);
//// PeriodicEvent = false;
// Vset = LSV->_Vmin;
// InitEliteFlag();
// INSTRUCTION.eliteFxn = CURVE_CC;
// INSTRUCTION.sampleRate = 15;
// INSTRUCTION.charge = 0x01;
// INSTRUCTION.constantCurrent = 0x00;
// INSTRUCTION.Vmax = 0xC350;
// INSTRUCTION.Vmin = 0x0000;
// INSTRUCTION.notifyRate = 500;
// INSTRUCTION.VoViSwitch = 0x02;//read Vscan = Vout - Vin
// }else if (Vset <= LSV->_Vmin){
// ModeLED(POST_WORK);
//// PeriodicEvent = false;
// Vset = LSV->_Vmax;
// InitEliteFlag();
// INSTRUCTION.eliteFxn = CURVE_CC;
// INSTRUCTION.sampleRate = 15;
// INSTRUCTION.charge = 0x01;
// INSTRUCTION.constantCurrent = 0x00;
// INSTRUCTION.Vmax = 0xC350;
// INSTRUCTION.Vmin = 0x0000;
// INSTRUCTION.notifyRate = 500;
// INSTRUCTION.VoViSwitch = 0x02;//read Vscan = Vout - Vin
// }
// }
//}
Vin = m->_measureVin * 200;//[5nV]
if (DACReset) {
Vout = Vset + Vin;
DACReset = false;
} else {
DeltaVout = Vset - (Vout - Vin);
Vout = Vout + DeltaVout;
}
INSTRUCTION.VoltConstant = Vout / 40000 + 25000;//5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(INSTRUCTION.VoutGainLevel, INSTRUCTION.VoltConstant);
int32_t RealV2;
RealV2 = (int32_t)((Vout - Vin) / 200);//[1uV]
InputNotify(NOTIFY_VOLT, RealV2);
int32_t RealV;
RealV = (int32_t)(Vout / 200);//[1uV]
InputNotify(NOTIFY_IMPEDANCE, RealV);
DAC_outputV(DACOutCode);
return;
}
static void lsv_vscan(void)
{
struct wm_lsv_ctx_t *lsv = (struct wm_lsv_ctx_t *)wm_get();
NotifyCycleNumber = (INSTRUCTION.cycleNumber - lsv->_cycleNumber + 1);
if (vscanReset) {
if (INSTRUCTION.directionInit == 1) {
lsv->_direction_up = true;
lsv->_current_direction_up = true;
} else {
lsv->_direction_up = false;
lsv->_current_direction_up = false;
}
//Vsetp = x * 20 * N, x=xmV ; N=VscanRate
if (INSTRUCTION.step <= 10) {
lsv->_Vstep = INSTRUCTION.step * INSTRUCTION.VsetRate / 5;
} else {
lsv->_Vstep = INSTRUCTION.step / 5 * INSTRUCTION.VsetRate;
}
Vset = lsv->_Vinit;
}
if (!vscanReset) {
if (lsv->_current_direction_up) {
Vset = Vset + lsv->_Vstep * GPT.GptimerMultiple;
} else {
Vset = Vset - lsv->_Vstep * GPT.GptimerMultiple;
}
/*stop condition*/
if (Vset >= lsv->_Vmax) {
ModeLED(POST_WORK);
// PeriodicEvent = false;
Vset = lsv->_Vmin;
InitEliteFlag();
INSTRUCTION.eliteFxn = CURVE_CC;
INSTRUCTION.sampleRate = 15;
INSTRUCTION.charge = 0x01;
INSTRUCTION.constantCurrent = 0x00;
INSTRUCTION.Vmax = 0xC350;
INSTRUCTION.Vmin = 0x0000;
INSTRUCTION.notifyRate = 500;
INSTRUCTION.VoViSwitch = 0x02;//read Vscan = Vout - Vin
} else if (Vset <= lsv->_Vmin) {
ModeLED(POST_WORK);
// PeriodicEvent = false;
Vset = lsv->_Vmax;
InitEliteFlag();
INSTRUCTION.eliteFxn = CURVE_CC;
INSTRUCTION.sampleRate = 15;
INSTRUCTION.charge = 0x01;
INSTRUCTION.constantCurrent = 0x00;
INSTRUCTION.Vmax = 0xC350;
INSTRUCTION.Vmin = 0x0000;
INSTRUCTION.notifyRate = 500;
INSTRUCTION.VoViSwitch = 0x02;//read Vscan = Vout - Vin
}
}
}
#endif
@@ -89,12 +89,11 @@ struct wm_cv_ctx_t {
VOUT_PARA;
};
//struct LSVMode {
// /* WARNING: please keep MEASURE at first!! */
// struct wm_meas_t measure;
//
// VOUT_PARA;
//};
struct wm_lsv_ctx_t {
/* WARNING: please keep MEASURE at first!! */
struct wm_meas_t measure;
VOUT_PARA;
};
//struct CVSCANMode {
// /* WARNING: please keep MEASURE at first!! */
@@ -350,23 +349,35 @@ static int __cv_create(void)
return 0;
}
//void *InitLSVMode(){
// struct LSVMode *ret = malloc(sizeof(struct LSVMode));
// ret->_measureCurrent = 0;
// ret->_measureVin = 0;
// ret->_measureVout = 0;
// ret->_measureBat = 0;
// ret->_VoViSwitch = INSTRUCTION.VoViSwitch;
// ret->_Vinit = (INSTRUCTION.Vinit - 25000) * 4 * 10000; //[5nV]
// ret->_Vmax = (INSTRUCTION.Vmax - 25000) * 4 * 10000; //[5nV]
// ret->_Vmin = (INSTRUCTION.Vmin - 25000) * 4 * 10000; //[5nV]
// ret->_Vset = 0;
// ret->_Vstep = 0;
// ret->_direction_up = true;
// ret->_current_direction_up = true;
// ret->_cycleNumber = INSTRUCTION.cycleNumber;
// return (void *)ret;
//} /* LSV Mode */
static int __lsv_create(void)
{
struct wm_meas_t *m;
struct wm_lsv_ctx_t *p;
void **wm = &workMode_p;
p = malloc(sizeof(struct wm_lsv_ctx_t));
if (!p) return -1;
m = (struct wm_meas_t *)p;
m->_measureCurrent = 0;
m->_measureVin = 0;
m->_measureVout = 0;
m->_measureBat = 0;
m->_VoViSwitch = INSTRUCTION.VoViSwitch;
p->_Vinit = (INSTRUCTION.Vinit - 25000) * 4 * 10000; //[5nV]
p->_Vmax = (INSTRUCTION.Vmax - 25000) * 4 * 10000; //[5nV]
p->_Vmin = (INSTRUCTION.Vmin - 25000) * 4 * 10000; //[5nV]
p->_Vset = 0;
p->_Vstep = 0;
p->_direction_up = true;
p->_current_direction_up = true;
p->_cycleNumber = INSTRUCTION.cycleNumber;
*wm = p;
return 0;
}
//void *InitCVSCANMode(){
// struct CVSCANMode *ret = malloc(sizeof(struct CVSCANMode));
@@ -416,9 +427,6 @@ static int __cv_create(void)
// case CURVE_CALI_DAC:
// *WM = InitVoltOutMode();
// break;
// case CURVE_LSV:
// *WM = InitLSVMode();
// break;
// case CURVE_CA:
// *WM = InitCVSCANMode();
// break;
@@ -468,6 +476,10 @@ int wm_init(void)
if (__cv_create()) return -2;
break;
case CURVE_LSV:
if (__lsv_create()) return -2;
break;
default:
// printf("DO NOT support!!");
return -3;
@@ -82,11 +82,11 @@ static void DACenable(uint8_t afterRead){
break;
case CURVE_CV:
CV3Curve();
cv_volt_out();
break;
case CURVE_LSV:{
// LSVCurve(wm);
lsv_volt_out();
break;
}
case CURVE_CA:{
@@ -600,7 +600,7 @@ static void EliteVscanControl(void);
static void mode_done(void);
//mode (Vset)
static void lsv_vscan(void *WM);
static void lsv_vscan(void);
static void ca_vscan(void *WM);
static void cv_vscan(void);
static void cc_vscan(void);
@@ -608,8 +608,8 @@ static void cc_vscan(void);
//mode (DAC)
static void DACenable(uint8_t afterRead);
static void volt_out();
static void CV3Curve(void);
static uint16_t LSVCurve(void *WM);
static void cv_volt_out(void);
static void lsv_volt_out(void);
static uint16_t CVSCANCurve(void *WM);
static void pulse_vscan(void);
@@ -335,7 +335,7 @@ static void EliteADCControl(void)
case CURVE_RT:
case CURVE_CC:
case CURVE_CV:
// case CURVE_LSV:
case CURVE_LSV:
// case CURVE_CA:
// case CURVE_PULSE:
case CURVE_VO:
@@ -398,10 +398,10 @@ static void EliteVscanControl(void)
cv_vscan();
break;
// case CURVE_LSV:{
// lsv_vscan(WM);
// break;
// }
case CURVE_LSV:
lsv_vscan();
break;
// case CURVE_CA:{
// ca_vscan(WM);
// break;