Compare commits

...

99 Commits

Author SHA1 Message Date
Benny Liu b1f1ff9f09 Clear okay. (?) 2021-12-20 17:29:57 +08:00
Roy da2d69c3a5 fix notify data of dpv mode 2021-12-17 10:10:10 +08:00
Roy 449b8137c2 add BOARD_F098 & BOARD_F068 calibration data 2021-12-09 17:49:12 +08:00
Roy cd19585046 data length 120 byte 2021-12-03 17:47:09 +08:00
Roy 52fa207cee Merge remote-tracking branch 'origin/Elite1.5' into Elite1.5 2021-12-02 14:57:31 +08:00
Roy d296305771 fix cc mode first vset 2021-12-02 14:57:08 +08:00
Roy 329a1e26f1 fix damping of manual control(change gain) 2021-12-02 14:55:21 +08:00
Benny Liu 2f3a7986d6 Update BOARD_F09F & F057 calibration data. 2021-11-29 18:25:33 +08:00
Benny Liu e1dea7286e Update BOARD_F057 calibration data. 2021-11-29 17:08:46 +08:00
Roy a41b51d552 Update BOARD_F09F calibration data. 2021-11-29 11:48:47 +08:00
Benny Liu caefa515ad Update BOARD_F057 calibration data. 2021-11-23 15:03:47 +08:00
Roy 179895df57 add BOARD_F09F calibration data 2021-11-19 10:30:05 +08:00
Roy 0bdb108deb add BOARD_EDA9 & BOARD_F0D6 calibration data 2021-11-18 17:36:28 +08:00
Roy 12616ebf26 update BOARD_F0C0 calibration data 2021-11-17 15:03:27 +08:00
Roy b625609973 update BOARD_EF20 calibration data 2021-11-17 13:20:13 +08:00
Roy 44664f1081 update BOARD_F01C calibration data 2021-11-17 12:25:52 +08:00
Roy 5eb03e21f7 add BOARD_F0C0 calibration data 2021-11-16 15:57:06 +08:00
Roy fad33ae7b8 add BOARD_F01C calibration data 2021-11-11 10:51:02 +08:00
Roy ea904f1be5 update dpv mode 2021-11-10 17:58:04 +08:00
Roy 93f1bc3cba fix CURVE_DPV_SMPRATE mode led 2021-11-01 17:20:14 +08:00
Roy ceec1dc934 add BOARD_F057 calibration data 2021-11-01 17:18:23 +08:00
Roy 3b11f4b166 new dpv mode v.1 2021-10-29 19:01:32 +08:00
Roy d2f4e80ac7 add BOARD_EF20 calibration data 2021-10-26 13:23:14 +08:00
Roy 6de9d27c10 new dpv mode 2021-10-26 13:19:09 +08:00
Roy 853f1a588e update FINISH_MODE_INS 2021-10-07 15:39:19 +08:00
Roy 9c7cd4deae update device name 2021-10-06 16:14:17 +08:00
Roy cb5fb2ace3 add BOARD_ECDB & BOARD_C81C calibration data 2021-09-29 12:49:25 +08:00
Roy 5dc38146b8 add BOARD_EFD8 calibration data 2021-09-22 18:32:43 +08:00
Benny Liu 785358ea83 Update F08F calibration value 2021-09-16 16:22:26 +08:00
Roy ecc6841a05 update BOARD_EF30 & EE3A & ED21 & EF50 calibration data 2021-09-14 23:08:31 +08:00
Roy 5b2889cbc7 don't update Iin channel when change gain 2021-09-09 18:01:12 +08:00
Roy f638c872ad add BOARD_EF30 & BOARD_EF50 calibration data 2021-09-03 15:19:31 +08:00
Roy a0ddb1f13b cal impedance use Vout_set for RT 2021-09-01 18:03:07 +08:00
Roy cfe3aacfc5 fix change Iin gain damping 2021-08-25 14:18:34 +08:00
Roy f38c99a226 VT mode use Iin_Vin_Plot and send Iin & Vin 2021-08-24 16:33:41 +08:00
Roy b958536d96 fix realtime instruction 2021-08-20 16:19:10 +08:00
Roy 489047b7f6 annotation 2021-08-20 11:19:38 +08:00
Roy 9138b93e80 update all mode data 2021-08-19 13:33:04 +08:00
Roy cdec2f5134 update CV & CA & LSV data 2021-08-17 13:57:42 +08:00
Benny Liu 9f5f87d3bd Update BOARD_C5AF & BOARD_F08F calibration data 2021-08-12 18:20:50 +08:00
Roy 39280c1bce CV.LSV.CA Vscan is Vset - Vin 2021-08-12 11:14:14 +08:00
Roy 565c415762 notify cycle in CV mode 2021-08-05 09:35:19 +08:00
Roy 97adad6ef1 take away read bettery in CURVE_UNI_PULSE mode 2021-08-02 12:53:30 +08:00
Roy 6cdbd35a8a update CURVE_UNI_PULSE mode 2021-07-23 19:13:15 +08:00
Roy 04d4af4cad change in sequence of IT_plot & VT_plot 2021-07-22 10:28:12 +08:00
Roy 7a0691a221 sort out code (correction.h) 2021-07-21 14:15:23 +08:00
Roy e420b535d7 update adc relation function 2021-07-20 18:53:03 +08:00
Roy 568489d39e update LED_DEV_TEST 2021-07-20 18:10:34 +08:00
Roy 95cf4a7f73 fix CIS return date (insert data length) 2021-07-20 17:29:22 +08:00
Roy 1d0ab06900 sort out code 2021-07-15 18:36:25 +08:00
Roy 52dd0e8585 sort out code 2021-07-15 16:02:11 +08:00
Roy 0749a7390d multi channel separate from Iin, and calculate average skip 10ms 2021-07-15 13:28:24 +08:00
Roy baa0894240 fix leadtime & vscantime 2021-07-12 23:22:08 +08:00
Roy e29e5f4127 update OCP highz instruction 2021-07-12 16:01:47 +08:00
Roy ca4a265b65 improve mode instruction, and change it & rt & vo volt anytime 2021-07-09 16:10:33 +08:00
Roy 0aea99cb2f chart ugly 2021-07-07 18:46:16 +08:00
Roy 33f2e77ed9 new uni_pulse mode 2021-07-07 15:41:03 +08:00
Benny Liu 34838a793f Combine battery voltage and CC2650 temperature measurement. 2021-07-06 14:57:25 +08:00
Benny Liu 9a87a5316f Add over temperature protection check. 2021-07-05 16:23:11 +08:00
Benny Liu a23235085d Add Temperature sensing function. (Not done yet) 2021-07-05 14:00:48 +08:00
Benny Liu 78cc816ba3 Run Iin_Vin_Vout_plot() at CURVE_IT. 2021-07-02 11:22:28 +08:00
Benny Liu 2ff582a0c5 Merge branch 'Elite1.5_Vout_in_RT_0628' into Elite1.5
# Conflicts:
#	simplelink/ble_sdk_2_02_02_25/src/examples/simple_peripheral/cc26xx/app/headstage/Elite_mode_ADC_DAC.h
#	simplelink/ble_sdk_2_02_02_25/src/examples/simple_peripheral/cc26xx/app/headstage/headstage.h
2021-07-02 10:14:16 +08:00
Roy 23d16b37dc modulize ADC.h 2021-07-01 19:02:23 +08:00
Roy 5eb08c48e5 modulize ADC.h 2021-07-01 15:52:09 +08:00
Roy 8d9d9a4955 optimize auto gain changer 2021-07-01 15:50:33 +08:00
Benny Liu c5d487f7c7 Set Vout voltage and send notify at IT mode. 2021-06-30 13:56:39 +08:00
Roy cfa28f9d7d modify IV.CV notify 2021-06-28 18:18:24 +08:00
Benny Liu d44843d525 Add parameter from UI. 2021-06-28 17:10:18 +08:00
Benny Liu 43d2623eb2 RT mode output 0.1V 2021-06-28 16:39:44 +08:00
Roy be8a39694e take away Old boundary 2021-06-28 12:13:22 +08:00
Roy 6f6fd80488 take away Old boundary 2021-06-28 11:58:51 +08:00
Roy cfd06ea0ea modify SIMPLEPROFILE_CHAR4_LEN 60 to 20 2021-06-22 16:46:33 +08:00
Roy faff6a229a nothing 2021-06-18 16:38:45 +08:00
Benny Liu aa5d0be31e Add calibration coeff. and offset for Vout_volt 2021-06-18 13:28:57 +08:00
Benny Liu 376d1777ba Add calibration Vout plot and device correction parameter for Vout_in 2021-06-18 11:50:36 +08:00
Roy 12241635a3 [update] update CURVE_CALI_ADC 2021-06-17 12:18:24 +08:00
Roy 18eba87064 [update] update OCP mode & merge vscan_volt 2021-06-17 11:48:18 +08:00
Roy d313f48eaa [update] new OCP mode and centralized notify 2021-06-16 22:32:54 +08:00
Roy 117336020f [update] new Vout_Plot 2021-06-15 14:03:49 +08:00
Roy cf3172f99a [update] update Elite_mode_ADC_DAC file 2021-06-09 14:28:16 +08:00
Roy 8b32a6d2d1 [cali] add BOARD_F08F & E774 & ED21 & EE3A & F010 & EEEF calibration data. 2021-06-07 15:27:44 +08:00
Roy 3e7d3abed7 [update] change to ELITE_PIN_1_5_RE version 2021-05-25 10:12:33 +08:00
Roy 6ac29b48c2 [update] change to ELITE_PIN_1_5_RE 2021-05-25 09:56:56 +08:00
Roy d0d83e6ae6 [cali] add BOARD_C5AF & C6E7 & ED49 calibration data. 2021-05-25 09:36:48 +08:00
Roy 0e181aaa07 [cali] add BOARD_C68B & ED5A & C705 & C6EF calibration data. 2021-05-21 15:32:40 +08:00
Roy a7b0b3965c RT send resister in denomination of mOhm to controller 2021-04-19 10:18:13 +08:00
Roy dbbb44e0d2 new sps on IT.VT.RT.CC.VOUT mode 2021-04-14 09:28:08 +08:00
Roy 156927e8f9 new sps on IT.VT.RT.CC.VOUT mode 2021-04-13 11:31:27 +08:00
Roy daab3bed0b GPtimer CLOCK_FREQ 4800 -> 4769 2021-04-12 09:37:02 +08:00
Roy 7c6d7c68de CC MODE deltaV = 10mV 2021-04-09 16:23:10 +08:00
Roy eff1e4a43e new 1.5re pin (use define) 2021-04-09 10:48:25 +08:00
Roy 9678266e59 fix RT (no 10 ohm) 2021-04-08 14:10:31 +08:00
Roy 6f74dc2c05 datalength extension:60bytes 2021-04-08 11:07:44 +08:00
Roy 910576ac6d datalength extension 200 bytes 2021-03-31 10:19:35 +08:00
Roy 9377dc517f battery < 3V when running mode, don't close elite 2021-03-16 14:25:21 +08:00
Roy e44d3d8e60 adjusted cc value 2021-03-16 11:24:45 +08:00
Roy f5416d5e1f measure battery when run mode 2021-03-15 15:44:47 +08:00
Roy 0d60074697 send mode finish flag 2021-03-12 12:12:24 +08:00
Roy 3c74358634 update notify rate 2021-03-10 17:25:12 +08:00
37 changed files with 3734 additions and 3099 deletions
+2 -1
View File
@@ -5,4 +5,5 @@ xdctools_*/
ccsv8/
# CSS build files
FlashROM/
FlashROM/
/simplelink/ble_sdk_2_02_02_25/examples/cc2650em/simple_central/ccs/app/.xdchelp
@@ -0,0 +1,3 @@
eclipse.preferences.version=1
inEditor=false
onBuild=false
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker
@@ -0,0 +1,32 @@
eclipse.preferences.version=1
encoding//FlashROM/Application/subdir_rules.mk=UTF-8
encoding//FlashROM/Application/subdir_vars.mk=UTF-8
encoding//FlashROM/Drivers/Display/subdir_rules.mk=UTF-8
encoding//FlashROM/Drivers/Display/subdir_vars.mk=UTF-8
encoding//FlashROM/Drivers/ECC/subdir_rules.mk=UTF-8
encoding//FlashROM/Drivers/ECC/subdir_vars.mk=UTF-8
encoding//FlashROM/Drivers/PIN/subdir_rules.mk=UTF-8
encoding//FlashROM/Drivers/PIN/subdir_vars.mk=UTF-8
encoding//FlashROM/Drivers/RF/subdir_rules.mk=UTF-8
encoding//FlashROM/Drivers/RF/subdir_vars.mk=UTF-8
encoding//FlashROM/Drivers/SPI/subdir_rules.mk=UTF-8
encoding//FlashROM/Drivers/SPI/subdir_vars.mk=UTF-8
encoding//FlashROM/Drivers/TRNG/subdir_rules.mk=UTF-8
encoding//FlashROM/Drivers/TRNG/subdir_vars.mk=UTF-8
encoding//FlashROM/Drivers/UART/subdir_rules.mk=UTF-8
encoding//FlashROM/Drivers/UART/subdir_vars.mk=UTF-8
encoding//FlashROM/Drivers/UDMA/subdir_rules.mk=UTF-8
encoding//FlashROM/Drivers/UDMA/subdir_vars.mk=UTF-8
encoding//FlashROM/ICall/subdir_rules.mk=UTF-8
encoding//FlashROM/ICall/subdir_vars.mk=UTF-8
encoding//FlashROM/ICallBLE/subdir_rules.mk=UTF-8
encoding//FlashROM/ICallBLE/subdir_vars.mk=UTF-8
encoding//FlashROM/PROFILES/subdir_rules.mk=UTF-8
encoding//FlashROM/PROFILES/subdir_vars.mk=UTF-8
encoding//FlashROM/Startup/subdir_rules.mk=UTF-8
encoding//FlashROM/Startup/subdir_vars.mk=UTF-8
encoding//FlashROM/TOOLS/subdir_rules.mk=UTF-8
encoding//FlashROM/TOOLS/subdir_vars.mk=UTF-8
encoding//FlashROM/makefile=UTF-8
encoding//FlashROM/objects.mk=UTF-8
encoding//FlashROM/sources.mk=UTF-8
@@ -0,0 +1,3 @@
eclipse.preferences.version=1
inEditor=false
onBuild=false
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker
@@ -3,16 +3,20 @@
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_DEBUGGER_PROPERTIES.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS100v3 USB Debug Probe_0/Cortex_M3_0" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot; ?&gt;&#10;&lt;PropertyValues&gt;&#10;&#10; &lt;property id=&quot;ConnectOnStartup&quot;&gt;&#10; &lt;curValue&gt;1&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10; &lt;property id=&quot;EnableInstalledBreakpoint&quot;&gt;&#10; &lt;curValue&gt;1&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10; &lt;property id=&quot;IgnoreSoftLaunchFailures&quot;&gt;&#10; &lt;curValue&gt;0&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10;&lt;/PropertyValues&gt;&#10;"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_DEBUGGER_PROPERTIES.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe/Cortex_M3_0" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot; ?&gt;&#10;&lt;PropertyValues&gt;&#10;&#10; &lt;property id=&quot;ConnectOnStartup&quot;&gt;&#10; &lt;curValue&gt;1&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10; &lt;property id=&quot;EnableInstalledBreakpoint&quot;&gt;&#10; &lt;curValue&gt;1&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10; &lt;property id=&quot;IgnoreSoftLaunchFailures&quot;&gt;&#10; &lt;curValue&gt;0&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10;&lt;/PropertyValues&gt;&#10;"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_DEBUGGER_PROPERTIES.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe_0/Cortex_M3_0" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot; ?&gt;&#10;&lt;PropertyValues&gt;&#10;&#10; &lt;property id=&quot;ConnectOnStartup&quot;&gt;&#10; &lt;curValue&gt;1&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10; &lt;property id=&quot;EnableInstalledBreakpoint&quot;&gt;&#10; &lt;curValue&gt;1&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10; &lt;property id=&quot;IgnoreSoftLaunchFailures&quot;&gt;&#10; &lt;curValue&gt;0&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10;&lt;/PropertyValues&gt;&#10;"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_DEBUGGER_PROPERTIES.CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe_0/Cortex_M3_0" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot; ?&gt;&#10;&lt;PropertyValues&gt;&#10;&#10; &lt;property id=&quot;ConnectOnStartup&quot;&gt;&#10; &lt;curValue&gt;1&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10; &lt;property id=&quot;EnableInstalledBreakpoint&quot;&gt;&#10; &lt;curValue&gt;1&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10; &lt;property id=&quot;IgnoreSoftLaunchFailures&quot;&gt;&#10; &lt;curValue&gt;0&lt;/curValue&gt;&#10; &lt;/property&gt;&#10;&#10;&lt;/PropertyValues&gt;&#10;"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_PROGRAM.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS100v3 USB Debug Probe_0/Cortex_M3_0" value="${build_artifact:simple_peripheral_cc2650em_app}"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_PROGRAM.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe/Cortex_M3_0" value="${build_artifact:simple_peripheral_cc2650em_app}"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_PROGRAM.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe_0/Cortex_M3_0" value="${build_artifact:simple_peripheral_cc2650em_app}"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_PROGRAM.CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe_0/Cortex_M3_0" value="${build_artifact:simple_peripheral_cc2650em_app}"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_PROJECT.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS100v3 USB Debug Probe_0/Cortex_M3_0" value="simple_peripheral_cc2650em_app"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_PROJECT.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe/Cortex_M3_0" value="simple_peripheral_cc2650em_app"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_PROJECT.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe_0/Cortex_M3_0" value="simple_peripheral_cc2650em_app"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_PROJECT.CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe_0/Cortex_M3_0" value="simple_peripheral_cc2650em_app"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.ATTR_TARGET_CONFIG" value="${target_config_active_default:simple_peripheral_cc2650em_app}"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.MRU_PROGRAM.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS100v3 USB Debug Probe_0/Cortex_M3_0" value="C:/ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\FlashROM\simple_peripheral_cc2650em_app.out"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.MRU_PROGRAM.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe/Cortex_M3_0" value="C:/ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\FlashROM\simple_peripheral_cc2650em_app.out"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.MRU_PROGRAM.C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\targetConfigs\CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe_0/Cortex_M3_0" value="C:/ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\FlashROM\simple_peripheral_cc2650em_app.out"/>
<stringAttribute key="com.ti.ccstudio.debug.debugModel.MRU_PROGRAM.CC2650F128.ccxml.Texas Instruments XDS110 USB Debug Probe_0/Cortex_M3_0" value="C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650em\simple_peripheral\ccs\app\FlashROM\simple_peripheral_cc2650em_app.out"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/simple_peripheral_cc2650em_app"/>
</listAttribute>
@@ -1,77 +0,0 @@
#ifndef ELITECCMODE
#define ELITECCMODE
#define Vset instru.Vset
#define DELTAVOLTMAX 100000
/* Transform setting CC into IUC
*
* User code in CC mode : 0 ~ 3000000
* Real current value : -15.00000 ~ 15.00000 mA
* => user code = 1500000 mapping to 0.00000 mA
*/
static void cc_vscan(void)
{
struct wm_cc_ctx_t *cc = (struct wm_cc_ctx_t *)wm_get();
struct wm_meas_t *m = &cc->measure;
uint16_t divisionRate;
int32_t deltaI;
int32_t deltaV;
int32_t Iin;
int32_t Vin;
if (vscanReset) {
Vset = 0;
if (cc->_charge == 0) {
cc->_Iset = instru.constantCurrent * 200 * (-1);
//[50pA] //controller UI 15000uA => Elite 1500000 => 1500000 * 10 * 1000 / 50 [50pA];
}
Iin = m->_measureCurrent * 20; //[50pA] nA => 50pA
Vin = m->_measureVin * 200; //[5nV]
Vset = Vin + cc->_Iset / 20 ; //[5nV]
if (Vset >= 1100000000) { // 5.5V
Vset = 1100000000;
} else if (Vset <= -1000000000) { //-5V
Vset = -1000000000;
}
}
if (!vscanReset) {
Iin = m->_measureCurrent * 20; //[50pA] nA => 50pA
deltaI = Iin - cc->_Iset;
if (deltaI > 20000000 || deltaI < -20000000) { //1mA
divisionRate = 1000;
} else {
divisionRate = 10;
}
deltaV = -1 * (deltaI / divisionRate); //-5 * deltaI / 5000 //pV=> 5nV
if (deltaV > DELTAVOLTMAX) { //100000 = 500uV
deltaV = DELTAVOLTMAX;
} else if (deltaV < (-DELTAVOLTMAX)) {
deltaV = (-DELTAVOLTMAX);
}
Vset = Vset + deltaV; //[5nV]
if (Vset >= 1100000000) { // 5.5V
Vset = 1100000000;
} else if (Vset <= -1000000000) { //-5V
Vset = -1000000000;
}
if (Vset <= cc->_Vmin) {
Vset = cc->_Vmin;
} else if (Vset >= cc->_Vmax) {
Vset = cc->_Vmax;
}
}
}
#endif
@@ -1,142 +0,0 @@
#ifndef ELITECV3
#define ELITECV3
#define Vset instru.Vset
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;
uint16_t DACOutCode;
int32_t Vin;
int32_t Vout;
int32_t DeltaVout;
Vin = m->_measureVin * 200;//[5nV]
if (DACReset) {
Vout = Vset + Vin;
} else {
DeltaVout = Vset - (Vout - Vin);
Vout = Vout + DeltaVout;
}
instru.VoltConstant = Vout / 40000 + 25000;//5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(instru.VoutGainLevel, instru.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 cv_vscan(void)
{
struct wm_cv_ctx_t *cv = (struct wm_cv_ctx_t *)wm_get();
static bool VminCounter;
static bool VmaxCounter;
NotifyCycleNumber = (instru.cycleNumber - cv->_cycleNumber + 1);
if (vscanReset) {
VmaxCounter = false;
VminCounter = false;
if (instru.directionInit == 1) {
cv->_direction_up = true;
cv->_current_direction_up = true;
} else {
cv->_direction_up = false;
cv->_current_direction_up = false;
}
//Vsetp = x * 20 * N, x=xmV ; N=VscanRate
if (instru.step <= 10) {
cv->_Vstep = instru.step * instru.VsetRate / 5;
} else {
cv->_Vstep = instru.step / 5 * instru.VsetRate;
}
if (cv->_Vmin == cv->_Vinit) {
VminCounter = true;
}
if (cv->_Vmax == cv->_Vinit) {
VmaxCounter = true;
}
Vset = cv->_Vinit;
}
if (!vscanReset) {
if ((instru.Vinit < instru.Ve1 && instru.Vinit < instru.Ve2) ||
(instru.Vinit > instru.Ve1 && instru.Vinit > instru.Ve2)
) {
if (cv->_current_direction_up) {
Vset = Vset + cv->_Vstep * GPT.GptimerMultiple;
} else {
Vset = Vset - cv->_Vstep * GPT.GptimerMultiple;
}
if (instru.Vinit < instru.Ve1 && instru.Vinit < instru.Ve2) {
if (Vset == cv->_Vmin) {
VminCounter = true;
instru.Vinit = instru.Vmin;
cv->_Vinit = cv->_Vmin;
}
} else if (instru.Vinit > instru.Ve1 && instru.Vinit > instru.Ve2) {
if (Vset == cv->_Vmax) {
VmaxCounter = true;
instru.Vinit = instru.Vmax;
cv->_Vinit = cv->_Vmax;
}
}
} else {
if (Vset >= cv->_Vmax) {
VmaxCounter = true;
} else if (Vset <= cv->_Vmin) {
VminCounter = true;
}
if (cv->_current_direction_up) {
Vset = Vset + cv->_Vstep * GPT.GptimerMultiple;
} else {
Vset = Vset - cv->_Vstep * GPT.GptimerMultiple;
}
if (VmaxCounter && VminCounter) {
if (cv->_direction_up && cv->_current_direction_up) {
if (Vset >= cv->_Vinit) {
cv->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
}
if (!cv->_direction_up && !cv->_current_direction_up) {
if (Vset <= cv->_Vinit) {
cv->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
}
}
if (Vset >= cv->_Vmax) {
cv->_current_direction_up = false;
} else if (Vset <= cv->_Vmin) {
cv->_current_direction_up = true;
}
/*stop condition*/
if (cv->_cycleNumber == 0) {
PeriodicEvent = false;
}
}
}
}
#endif
@@ -1,84 +0,0 @@
#ifndef ELITECV
#define ELITECV
static void iv_cy_vscan(void)
{
struct wm_iv_cy_ctx_t *iv_cy = (struct wm_iv_cy_ctx_t *)wm_get();
static bool VminCounter;
static bool VmaxCounter;
NotifyCycleNumber = (instru.cycleNumber - iv_cy->_cycleNumber + 1);
if(vscanReset){
VmaxCounter = false;
VminCounter = false;
if(instru.directionInit == 1){
iv_cy->_direction_up = true;
iv_cy->_current_direction_up = true;
}else if(instru.directionInit == 0){
iv_cy->_direction_up = false;
iv_cy->_current_direction_up = false;
}
//Vsetp = x * 20 * N, x=xmV ; N=VscanRate
if(instru.step <= 10){
iv_cy->_Vstep = instru.step * instru.VsetRate / 5;
}else{
iv_cy->_Vstep = instru.step / 5 * instru.VsetRate;
}
if(iv_cy->_Vmin == iv_cy->_Vinit){
VminCounter = true;
}
if(iv_cy->_Vmax == iv_cy->_Vinit){
VmaxCounter = true;
}
Vset = iv_cy->_Vinit;
}
if(!vscanReset){
if (Vset >= iv_cy->_Vmax){
VmaxCounter = true;
}else if (Vset <= iv_cy->_Vmin){
VminCounter = true;
}
if (iv_cy->_current_direction_up){
Vset = Vset + iv_cy->_Vstep * GPT.GptimerMultiple;
}else{
Vset = Vset - iv_cy->_Vstep * GPT.GptimerMultiple;
}
if(VmaxCounter && VminCounter){
if(iv_cy->_direction_up && iv_cy->_current_direction_up){
if(Vset >= iv_cy->_Vinit){
iv_cy->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
}
if(!iv_cy->_direction_up && !iv_cy->_current_direction_up){
if(Vset <= iv_cy->_Vinit){
iv_cy->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
}
}
if (Vset >= iv_cy->_Vmax){
iv_cy->_current_direction_up = false;
}else if (Vset <= iv_cy->_Vmin){
iv_cy->_current_direction_up = true;
}
/*stop condition*/
if(iv_cy->_cycleNumber == 0){
PeriodicEvent = false;
}
}
}
#endif
@@ -1,51 +0,0 @@
#ifndef ELITECVSCAN
#define ELITECVSCAN
#define Vset instru.Vset
static void ca_volt_out(void)
{
struct wm_ca_ctx_t *ca = (struct wm_ca_ctx_t *)wm_get();
struct wm_meas_t *m = &ca->measure;
uint16_t DACOutCode;
int32_t Vin;
int32_t Vout;
int32_t DeltaVout;
Vin = m->_measureVin * 200;//[5nV]
if (DACReset) {
Vout = Vset + Vin;
} else {
DeltaVout = Vset - (Vout - Vin);
Vout = Vout + DeltaVout;
}
instru.VoltConstant = Vout / 40000 + 25000;//5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(instru.VoutGainLevel, instru.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 ca_vscan(void)
{
struct wm_ca_ctx_t *ca = (struct wm_ca_ctx_t *)wm_get();
if(vscanReset){
Vset = ca->_Vinit;
}
if(!vscanReset){
Vset = ca->_Vinit;
}
}
#endif
@@ -4,31 +4,6 @@
static bool DACReset;
//#ifdef ELITE_VERSION_1_3
//#define DACOUT 0x30
//
//static void DAC_outputV(uint16_t voltLV) {
// // C = command, X = don't care, D = data
// // CCCC XXXX = command
// // DDDD DDDD = v1
// // DDDD XXXX = v2
//
// uint8_t v1, v2 = 0;
// v1 = (uint8_t) (voltLV >> 4) & 0xFF;
// v2 = (uint8_t) ((voltLV & 0x000F) << 4) & 0xF0;
//
// spi_DACtxbuf[0] = command;
// spi_DACtxbuf[1] = v1;
// spi_DACtxbuf[2] = v2;
// for (int i = 3; i < SPI_DAC_SIZE; i++) {
// spi_DACtxbuf[i] = 0;
// }
//
// DAC_SPI(SPI_DAC_SIZE, spi_DACtxbuf, spi_rxbuf);
//}
//#endif
#ifdef ELITE_VERSION_1_4
#define DACCLS 0x02
#define DACOUT 0x31
@@ -59,20 +34,21 @@ static uint16_t DAC_outputV(uint16_t voltLV) {
static void VoutGainControl(uint8_t VOUTLevel){
if(VOUTLevel == 0){
// VOUT gain level = 0, using 240K resister
PIN15_setOutputValue(Turon_VOUT_SMALL, 0);
PIN15_setOutputValue(Turnon_VOUT_SMALL, 0);
}
else if(VOUTLevel == 1){
// VOUT gain level = 1, using 15K resister
PIN15_setOutputValue(Turon_VOUT_SMALL, 1);
PIN15_setOutputValue(Turnon_VOUT_SMALL, 1);
}
else if(VOUTLevel == 2){
// VOUT gain level = 2, using 15K resister
PIN15_setOutputValue(Turon_VOUT_SMALL, 1);
PIN15_setOutputValue(Turnon_VOUT_SMALL, 1);
}
else{
// default using 15K resister
PIN15_setOutputValue(Turon_VOUT_SMALL, 1);
PIN15_setOutputValue(Turnon_VOUT_SMALL, 1);
}
volt_rec_en = false;
}
#endif
@@ -94,26 +70,23 @@ static void AutoGainChangeVout(int32_t userCode){
// switch to 1 level volt(small) 15K
// switch to 2 level volt(large) 240K
if(instru.VoutGainLevel == VOUT_GAIN_AUTO){
instru.VoutGainLevel = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLevel);
record_flag = false;
if(instru.VoutGainLv == VOUT_GAIN_AUTO){
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
}
if(instru.VoutGainLevel == VOUT_GAIN_15K){
if(instru.VoutGainLv == VOUT_GAIN_15K){
if(RealVolt > DAC_VOUT_GAIN_LARGE_BOUNDARY || RealVolt < -1 * DAC_VOUT_GAIN_LARGE_BOUNDARY){
// switch to 2 level volt(large)
instru.VoutGainLevel = VOUT_GAIN_240K;
VoutGainControl(instru.VoutGainLevel);
record_flag = false;
instru.VoutGainLv = VOUT_GAIN_240K;
VoutGainControl(instru.VoutGainLv);
}
}
else if(instru.VoutGainLevel == VOUT_GAIN_240K){
else if(instru.VoutGainLv == VOUT_GAIN_240K){
if(RealVolt < DAC_VOUT_GAIN_SMALL_BOUNDARY && RealVolt > -1 * DAC_VOUT_GAIN_SMALL_BOUNDARY ){
// switch to 1 level volt(small)
instru.VoutGainLevel = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLevel);
record_flag = false;
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
}
}
}
@@ -2,13 +2,6 @@
#ifndef ELITE_FLAG_CT_INIT
#define ELITE_FLAG_CT_INIT
// CT counter
struct _CT{
uint32_t SampleRate_counter;
uint16_t StepTimeCounter;
uint16_t NotifyCounter;
}CT = {0};
// GPT counter
struct _GPT{
uint32_t GptimerCounter;
@@ -17,7 +17,7 @@ static void elite_gptimer_callback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_In
#define elite_gptimer_start() GPTimerCC26XX_start(gptimer_handle)
#define elite_gptimer_stop() GPTimerCC26XX_stop(gptimer_handle)
#define elite_gptimer_close() GPTimerCC26XX_close(gptimer_handle)
#define CLOCK_FREQ 4800 // clock freq = 0.1 ms
#define CLOCK_FREQ 4769 // clock freq = 0.1 ms(4800), Measured(4769)
#define elite_gptimer_open() \
do { \
@@ -1,62 +0,0 @@
#ifndef ELITEIV
#define ELITEIV
#define Vset instru.Vset
static void iv_vscan(void)
{
struct wm_iv_ctx_t *iv = (struct wm_iv_ctx_t *)wm_get();
if (vscanReset) {
if (instru.directionInit == 1) {
iv->_direction_up = true;
iv->_current_direction_up = true;
} else if (instru.directionInit == 0) {
iv->_direction_up = false;
iv->_current_direction_up = false;
}
//Vsetp = x * 20 * N, x=xmV ; N=VscanRate
if (instru.step <= 10) {
iv->_Vstep = instru.step * instru.VsetRate / 5;
} else {
iv->_Vstep = instru.step / 5 * instru.VsetRate;
}
Vset = iv->_Vinit;
}
if (!vscanReset) {
if (iv->_current_direction_up) {
if (Vset >= iv->_Vmax) {
PeriodicEvent = false;
}
} else {
if (Vset <= iv->_Vmin) {
PeriodicEvent = false;
}
}
if (iv->_current_direction_up) {
Vset = Vset + iv->_Vstep * GPT.GptimerMultiple;
} else {
Vset = Vset - iv->_Vstep * GPT.GptimerMultiple;
}
}
}
static void vo_vscan(void)
{
struct wm_vo_ctx_t *vo = (struct wm_vo_ctx_t *)wm_get();
if (vscanReset) {
Vset = vo->_Vinit;
}
if(!vscanReset) {
Vset = vo->_Vinit;
}
}
#endif
@@ -1,5 +1,8 @@
#ifndef __INSTR_H__
#define __INSTR_H__
/*=============================================================================
= instr.h =
=============================================================================*/
#ifndef ELITE_INSTR_H
#define ELITE_INSTR_H
#ifdef __cpulsplus
extern "C" {
@@ -12,9 +15,13 @@ struct HEADSTAGE_INSTRUCTION {
uint8_t chip_id;
uint8_t eliteFxn;
/** DAC parameter **/
// time relation
uint8_t VsetRateIndex;
uint32_t VsetRate;
uint32_t sampleRate;
uint32_t notifyRate;
uint32_t period;
int32_t Vset;
uint16_t VoltConstant;
uint8_t directionInit;
@@ -25,26 +32,40 @@ struct HEADSTAGE_INSTRUCTION {
int32_t Vmax;
int32_t Vmin;
/** ADC parameter **/
uint8_t sampleRateIndex;
uint32_t sampleRate;
uint8_t VoViSwitch;
uint8_t AutoGainEnable;
uint8_t VinAutoGainEnable;
uint8_t VoutAutoGainEnable;
uint8_t ADCGainLevel;
// voltage output gain
uint16_t VoutGainLevel;
uint8_t VinADCGainLevel;
uint32_t steptime;
/** Notify parameter **/
uint32_t notifyRate;
uint8_t IinADCAutoGainEn;
uint8_t VinADCAutoGainEn;
uint8_t VoutAutoGainEn;
uint8_t IinADCGainLv;
uint8_t VinADCGainLv;
uint16_t VoutGainLv;
uint8_t gain_switch_on;
uint8_t AdcChannel;
bool hign_z_en;
/** mode parameter **/
uint16_t cycleNumber;
uint8_t charge;
int32_t constantCurrent;
int32_t Currentmax;
// uni pulse mode
int32_t v0;
uint32_t t_pulse[4];
int32_t v_initial[4];
int32_t v_slope[4];
int32_t v_step[4];
uint32_t t_pulse_min[4];
uint32_t t_pulse_max[4];
int32_t v_stop;
int32_t v_up;
int32_t v_low;
bool v_invert_option;
bool v_stop_direction;
int32_t v_1;
int32_t v_2;
// pulse mode
int32_t sti_v1;
int32_t sti_v2;
int32_t sti_v3;
@@ -62,38 +83,46 @@ struct HEADSTAGE_INSTRUCTION {
uint16_t sti_cy;
uint16_t sti_loop;
uint16_t StepTime;
int32_t Vout;
// not use
int32_t Currentmax;
uint8_t VoViSwitch;
uint8_t AdcChannel;
} instru = {0};
/** Iin, Vin, Vout **/
#define IIN_ADC 0x00
#define VIN_ADC 0x01
#define VOUT_DAC 0x02
#define HIGH_Z 0x03
#define RIS_ADC_IIN 0x00
#define RIS_ADC_VIN 0x01
#define RIS_DAC_VOUT 0x02
#define RIS_HIGH_Z 0x03
#define RIS_ADC_VOUT 0x04
#define RIS_ADC_BAT 0x05
/** ADC Iin gain level **/
#define I_GAIN_3M 0x00 // largest gain
#define I_GAIN_100K 0x01
#define I_GAIN_3K 0x02
#define I_GAIN_100R 0x03 // the least gain
// ADC Iin gain level !!! move to ADC.h in future
#define I_GAIN_3M 0x00 // lv0,largest gain
#define I_GAIN_100K 0x01 // lv1
#define I_GAIN_3K 0x02 // lv2
#define I_GAIN_100R 0x03 // lv3,the least gain
#define I_GAIN_AUTO 0x04
/** ADC Vin gain level **/
// ADC Vin gain level !!! move to ADC.h in future
#define VIN_GAIN_1M 0x00
#define VIN_GAIN_30K 0x01
#define VIN_GAIN_1K 0x02
#define VIN_GAIN_AUTO 0x03
/** Vout gain level **/
// DAC Vout gain level !!! move to DAC.h in future
#define VOUT_GAIN_240K 0x00
#define VOUT_GAIN_15K 0x01
#define VOUT_GAIN_AUTO 0x02
/* DAC reset parameter */
#define DAC_ZERO 25000
#define DAC_ZERO 25000 // DAC_ZERO is about 0V
// Step time macro
#define STEPTIME_HALF_SEC 5000
@@ -109,36 +138,72 @@ struct HEADSTAGE_INSTRUCTION {
*
* @return None.
*/
static void InitEliteInstruction(){
static void InitEliteInstruction(void)
{
instru.chip_id = 0;
instru.eliteFxn = 0; //default is a null event
instru.VsetRateIndex = 0;
instru.VsetRateIndex = 0; // vscan rate
instru.VsetRate = 2;
instru.Vset = 0;
instru.VoltConstant = DAC_ZERO; //DAC_ZERO is about 0V
instru.directionInit = 1; //0:reverse 1:forward
instru.sampleRate = 15; // ADC's sample rate
instru.notifyRate = CLOCK_ONE_SECOND; // send data's rate
instru.period = CLOCK_ONE_SECOND;
instru.Vset = 0; // vscan's volt[5nv]
instru.VoltConstant = DAC_ZERO; // DAC's volt[UC]
instru.directionInit = 1; // 0:reverse, 1:forward
instru.step = 0;
instru.Ve1 = DAC_ZERO;
instru.Ve2 = DAC_ZERO;
instru.Vinit = 0;
instru.Vmax = 0;
instru.Vmin = 0;
instru.sampleRateIndex = 1;
instru.sampleRate = 100;
instru.VoViSwitch = 0x01; //0:user see Vo 1: user see Vi
instru.AutoGainEnable = 1;
instru.VinAutoGainEnable = 1;
instru.VoutAutoGainEnable = 1;
instru.ADCGainLevel = I_GAIN_AUTO;
instru.VoutGainLevel = VOUT_GAIN_AUTO;
instru.VinADCGainLevel = VIN_GAIN_AUTO;
instru.notifyRate = STEPTIME_ONE_SEC;
instru.Ve1 = DAC_ZERO; // user set volt[UC]
instru.Ve2 = DAC_ZERO; // user set volt[UC]
instru.Vinit = 0; // user set init volt[5nv]
instru.Vmax = 0; // user set max volt[5nv]
instru.Vmin = 0; // user set min voit[5nv]
instru.IinADCAutoGainEn = 1;
instru.VinADCAutoGainEn = 1;
instru.VoutAutoGainEn = 1;
instru.IinADCGainLv = I_GAIN_AUTO;
instru.VinADCGainLv = VIN_GAIN_AUTO;
instru.VoutGainLv = VOUT_GAIN_AUTO;
instru.gain_switch_on = 0b11110000; // cur auto gain switch, |lv0|lv1|lv2|lv3|none|none|none|none|
instru.AdcChannel = 0; // RIS_ADC_IIN: 0x00, RIS_ADC_VIN: 0x01, RIS_DAC_VOUT: 0x02, RIS_HIGH_Z: 0x03
instru.hign_z_en = 1;
instru.cycleNumber = 1;
instru.charge = 1; //0:discharge 1:charge
instru.charge = 1; // 0:discharge, 1:charge
instru.constantCurrent = 0;
instru.Currentmax = 0;
instru.StepTime = STEPTIME_ONE_SEC;
instru.AdcChannel = 0;
// uni pulse mode
instru.v0 = DAC_ZERO; // t < 0, volt is 0v
instru.v_stop = 0;
instru.t_pulse[0] = 0;
instru.t_pulse[1] = 0;
instru.t_pulse[2] = 0;
instru.t_pulse[3] = 0;
instru.v_initial[0] = 0;
instru.v_initial[1] = 0;
instru.v_initial[2] = 0;
instru.v_initial[3] = 0;
instru.v_slope[0] = 0;
instru.v_slope[1] = 0;
instru.v_slope[2] = 0;
instru.v_slope[3] = 0;
instru.v_step[0] = 0;
instru.v_step[1] = 0;
instru.v_step[2] = 0;
instru.v_step[3] = 0;
instru.t_pulse_min[0] = 0;
instru.t_pulse_min[1] = 0;
instru.t_pulse_min[2] = 0;
instru.t_pulse_min[3] = 0;
instru.t_pulse_max[0] = 0;
instru.t_pulse_max[1] = 0;
instru.t_pulse_max[2] = 0;
instru.t_pulse_max[3] = 0;
instru.v_invert_option = false;
instru.v_stop_direction = true;
instru.v_1 = 0;
instru.v_2 = 0;
//pulse mode
instru.sti_t1 = 0;
@@ -157,6 +222,14 @@ static void InitEliteInstruction(){
instru.sti_v7 = DAC_ZERO;
instru.sti_loop = 1;
instru.sti_cy = 0;
instru.Vout = 0;
// not use
instru.Currentmax = 0;
instru.VoViSwitch = 0x01;
return;
}
#ifdef __cpulsplus
@@ -5,6 +5,12 @@
#define DARKLED 0xE1
#define LIGHTLED 0xE8
static bool btWaitLedFlag = 0;
static bool noEventLedFlag = 0;
static bool preWorkLedFlag = 0;
static bool workingLedFlag = 0;
static bool postWorkLedFlag = 0;
static void WorkModeLED();
static void LED_color(uint8_t bright, uint8_t red, uint8_t green, uint8_t blue) {
@@ -134,7 +140,8 @@ static void ModeLED(uint16_t modeStatus) {
}
}
static void checkFlafLED() {
static void checkFlafLED()
{
if(btWaitLedFlag == 1){
ModeLED(BT_WAIT);
}
@@ -152,49 +159,22 @@ static void checkFlafLED() {
}
}
static void WorkModeLED() {
static void WorkModeLED()
{
switch (instru.eliteFxn) {
case CURVE_IV:
case CURVE_IV_CY:
case DIFFERENTIAL_PULSE_VOLTAMMETRY:
case SQUARE_WAVE_VOLTAMMETRY:
case CURVE_VO:
case CURVE_RT:
case CURVE_VT:
case CURVE_IT:
case CURVE_CALI_ADCTEST:
case CURVE_CV:
case CURVE_LSV:
case CURVE_CA:{
WORKLED();
break;
}
case CURVE_PULSE:{
// Elite_led_color(COLOR_YELLOW);
WORKLED();
break;
}
case CURVE_CC:{
WORKLED();
break;
}
case CURVE_CALI_ADC:{
if(instru.AdcChannel == IIN_ADC){
Elite_led_color(COLOR_RED);
}else if(instru.AdcChannel == VIN_ADC){
Elite_led_color(COLOR_ORANGE);
}
case CURVE_CALI_ADC:
if (instru.AdcChannel == RIS_ADC_IIN) {
Elite_led_color(COLOR_RED);
} else if (instru.AdcChannel == RIS_ADC_VIN) {
Elite_led_color(COLOR_ORANGE);
} else if (instru.AdcChannel == RIS_DAC_VOUT) {
Elite_led_color(COLOR_BLUE);
}
break;
default:
break;
break;
}
// case VIS_RST: {
// LEDPowerON();
// break;
// }
default: {
WORKLED();
break;
}
}
}
@@ -1,80 +0,0 @@
#ifndef ELITELSV
#define ELITELSV
#define Vset instru.Vset
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;
Vin = m->_measureVin * 200;//[5nV]
if (DACReset) {
Vout = Vset + Vin;
} else {
DeltaVout = Vset - (Vout - Vin);
Vout = Vout + DeltaVout;
}
instru.VoltConstant = Vout / 40000 + 25000;//5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(instru.VoutGainLevel, instru.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 = (instru.cycleNumber - lsv->_cycleNumber + 1);
if (vscanReset) {
if (instru.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 (instru.step <= 10) {
lsv->_Vstep = instru.step * instru.VsetRate / 5;
} else {
lsv->_Vstep = instru.step / 5 * instru.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) {
PeriodicEvent = false;
} else if (Vset <= lsv->_Vmin) {
PeriodicEvent = false;
}
}
}
#endif
@@ -10,57 +10,22 @@
#include "headstage.h"
/*notify's input type*/
#define NOTIFY_CURRENT 0
#define NOTIFY_VOLT 1
#define NOTIFY_IMPEDANCE 2
#define NOTIFY_VOLT_BAT 3
#define NOTIFY_CURRENT 0
#define NOTIFY_VOLT 1
#define NOTIFY_IMPEDANCE 2
#define NOTIFY_VOLT_BAT 3
#define NOTIFY_TEMPERATURE 4
#define NOT_BUF_OFFSET_INIT 8
#define FINISH_MODE_INS 0b10100000
/**
* the index where to start insert data into buffer.
* start from 6.
*/
static size_t not_buf_offset = NOT_BUF_OFFSET_INIT;
static uint32_t not_time_stamp;
static uint8_t NotifyCurrent[4] = {0};
static uint8_t NotifyVolt[4] = {0};
static uint8_t NotifyImpedance[4] = {0};
static uint8_t NotifyVoltBat[4] = {0};
static uint8_t NotifyTemperature[4] = {0};
static uint16_t NotifyCycleNumber = 0;
// ****************** New Notify Format ******************************** //
/*
* Notify format
*
*
| | 1 | 2 | 3 |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
-----------------------------------------------------------------
| header |
| current |
| voltage or impedance |
| mode & gain |
| time stamp |
| cycle number |
mode & gain
this byte include Elite working mode and ADC gain level
we use "(mode & 0xF0) | (gain & 0x0F)" to encode these two information
cycle number
for cyclic voltammetry use, we save it as channel number.
0xFF
* header = device ID
* I = current (0.001nA), V = voltage (mV),
* Z = impedance (k ohm), T = time (ms)
*
*
*/
// ********* End New Format Notify ***************************************** //
static bool finishMode = false;
/*
* Notify format
@@ -108,7 +73,14 @@ static void SendNotify() {
not_buf[17] = (NotifyCycleNumber >> 8) & 0xff;
not_buf[18] = NotifyCycleNumber & 0xff;
for (int i = 19; i < BLE_DAT_BUFF_SIZE; i++){
if (finishMode) {
not_buf[19] = (FINISH_MODE_INS) & 0b11110000;
} else {
not_buf[19] = 0 & 0b11110000;
}
for (int i = 20; i < BLE_DAT_BUFF_SIZE; i++){
not_buf[i] = 0;
}
@@ -136,6 +108,7 @@ static void initCISBuf(){
static void initRawDataBuf(){
not_time_stamp = 0;
NotifyCycleNumber = 0;
finishMode = false;
for (int i = 0; i < 4; i++){
NotifyCurrent[i] = 0;
@@ -183,6 +156,12 @@ static void InputNotify(int NotifyType, int32_t Data){
NotifyVoltBat[2] = (uint8_t)((Data & 0x0000FF00) >> 8);
NotifyVoltBat[3] = (uint8_t)(Data & 0x000000FF);
break;
case NOTIFY_TEMPERATURE :
NotifyTemperature[0] = (uint8_t)((Data & 0xFF000000) >> 24);
NotifyTemperature[1] = (uint8_t)((Data & 0x00FF0000) >> 16);
NotifyTemperature[2] = (uint8_t)((Data & 0x0000FF00) >> 8);
NotifyTemperature[3] = (uint8_t)(Data & 0x000000FF);
break;
}
}
#endif
@@ -1,115 +0,0 @@
#ifndef ELITEPULSE
#define ELITEPULSE
#define Vset instru.Vset
static void pulse_vscan(void)
{
struct wm_pulse_ctx_t *pulse = (struct wm_pulse_ctx_t *)wm_get();
static uint16_t lastVolt;
if (stiFirstTime) {
stiFirstTime = false;
lastVolt = 25000;
pulse->_sti_t_flag = 1;
pulse->_sti_v = pulse->_sti_v1;
pulse->_sti_t = pulse->_sti_t1;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if(!stiFirstTime) {
if (GPT.StiCounter >= pulse->_sti_t) {
GPT.StiCounter -= pulse->_sti_t; //to get right time
if (pulse->_sti_lp > 0) {
if (pulse->_sti_cy > 0) {
if (pulse->_sti_t_flag == 1) {
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 2) {
pulse->_sti_t_flag = 3;
pulse->_sti_v = pulse->_sti_v3;
pulse->_sti_t = pulse->_sti_t3;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 3) {
pulse->_sti_cy -- ;
if (pulse->_sti_cy == 0) {
pulse->_sti_t_flag = 4;
pulse->_sti_v = pulse->_sti_v4;
pulse->_sti_t = pulse->_sti_t4;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else {
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
}
}
} else if (pulse->_sti_cy <= 0){
if (pulse->_sti_t_flag == 4) {
pulse->_sti_lp -- ;
if (pulse->_sti_lp > 0) {
pulse->_sti_cy = instru.sti_cy;
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else {
pulse->_sti_t_flag = 5;
pulse->_sti_v = pulse->_sti_v5;
pulse->_sti_t = pulse->_sti_t5;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
}
}
}
} else if (pulse->_sti_lp <= 0) {
if (pulse->_sti_t_flag == 5) {
pulse->_sti_t_flag = 6;
pulse->_sti_v = pulse->_sti_v6;
pulse->_sti_t = pulse->_sti_t6;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 6) {
pulse->_sti_t_flag = 7;
pulse->_sti_v = pulse->_sti_v7;
pulse->_sti_t = pulse->_sti_t7;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 7) {
pulse->_sti_v = 25000;
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
}
}
}
if (lastVolt != pulse->_sti_v) {
lastVolt = pulse->_sti_v;
//if (pulse->_sti_v == 25000) {
// PIN15_setOutputValue(HIGH_Z_MODE, 0); // 1 => close high_z mode
//} else {
// PIN15_setOutputValue(HIGH_Z_MODE, 1); // 1 => close high_z mode
//}
DAC_outputV(Usercode_Correction_to_DAC(VOUT_GAIN_240K, pulse->_sti_v));
DAC_outputV(Usercode_Correction_to_DAC(VOUT_GAIN_240K, pulse->_sti_v));
}
}
#endif
@@ -3,24 +3,21 @@
#define ELITERESET
static void reset() {
mode_init = true;
megaStiEnable = false;
PeriodicEvent = false; // is there an PeriodicEvent?
Free_Work_Mode = true; // Free(WorkModeData)
InitPeriodicEvent = true; // need to create a WorkModeData?
InitGPT();
initINSBuf();
initDATBuf();
PIN15_setOutputValue(HIGH_Z_MODE, 0); // HIGH Z MODE // 1: close; 0: open;
VinADCGainControl(VIN_GAIN_AUTO);
IinADCGainControl(I_GAIN_AUTO);
VinADCGainCtrl(VIN_GAIN_AUTO);
IinADCGainCtrl(I_GAIN_AUTO);
instru.VoutGainLevel = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLevel);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLevel, 25000));
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
for (int i = 0; i < SPI_LED_SIZE; i++) {
spi_LEDtxbuf[i] = 0;
@@ -42,21 +39,18 @@ static void reset() {
}
static void Eliteinterrupt() {
mode_init = true;
megaStiEnable = false;
PeriodicEvent = false; // is there an PeriodicEvent?
Free_Work_Mode = true; // Free(WorkModeData)
InitPeriodicEvent = true; // need to create a WorkModeData?
InitGPT();
initINSBuf();
initDATBuf();
PIN15_setOutputValue(HIGH_Z_MODE, 0); // HIGH Z MODE // 1: close; 0: open;
instru.VoutGainLevel = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLevel);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLevel, 25000));
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
for (int i = 0; i < SPI_LED_SIZE; i++) {
spi_LEDtxbuf[i] = 0;
@@ -75,7 +75,7 @@ static void ADC_SPI(uint8_t length, uint8_t *spi_txbuf, uint8_t *spi_rxbuf) {
SPI_transfer(spiHandle1, &ADC_DAC_transaction);
PIN_setOutputValue(pin_handle, D6, 1); // ADC_CS HOGH
PIN_setOutputValue(pin_handle, D6, 1); // ADC_CS HIGH
update_latch_status (ADC_CS, 1);
// PIN15_setOutputValue(ADC_CS, 1); // ADC_CS HIGH
}
@@ -91,13 +91,18 @@ static void DAC_SPI(uint8_t length, uint8_t *spi_txbuf, uint8_t *spi_rxbuf) {
SPI_transfer(spiHandle1, &ADC_DAC_transaction);
PIN_setOutputValue(pin_handle, D7, 1); // DAC_CS HOGH
PIN_setOutputValue(pin_handle, D7, 1); // DAC_CS HIGH
update_latch_status (DAC_CS, 1);
// PIN15_setOutputValue(DAC_CS, 1); // DAC_CS HIGH
}
static void ELITE15_SPI_HOLD() {
Elite_SPI_init();
#ifdef ELITE_PIN_1_5_RE
PIN_setOutputValue(pin_handle, D6, LH.LATCH0[6]); // ADC_CS
PIN_setOutputValue(pin_handle, D7, LH.LATCH0[7]); // DAC_CS
PIN_setOutputValue(pin_handle, D4, LH.LATCH0[4]); // update HIGH_Z_MODE
#endif
PIN_setOutputValue(pin_handle, LOAD0, 1);
PIN_setOutputValue(pin_handle, LOAD1, 0);
@@ -1,10 +1,12 @@
/*=============================================================================
= wm.h =
=============================================================================*/
#ifndef ELITE_WORK_DATA
#define ELITE_WORK_DATA
#ifndef ELITE_WORK_DATA_H
#define ELITE_WORK_DATA_H
#define CLOCK_ONE_SECOND 10000
#ifdef __cplusplus
extern "C" {
#endif
#include "EliteInstruction.h"
@@ -44,6 +46,8 @@ struct wm_vo_ctx_t {
struct wm_it_ctx_t {
/* WARNING: please keep MEASURE at first!! */
struct wm_meas_t measure;
int32_t _Vset;
int32_t _Vinit;
};
struct wm_vt_ctx_t {
@@ -124,7 +128,84 @@ struct wm_pulse_ctx_t {
uint16_t _sti_lp;
};
int wm_init(void); //(void *instr_ctx);
struct wm_uni_pulse_ctx_t {
/* WARNING: please keep MEASURE at first!! */
struct wm_meas_t measure;
int32_t _Vset;
int32_t _v0;
uint32_t _t_pulse[4];
int32_t _v_initial[4];
int32_t _v_slope[4];
int32_t _v_step[4];
uint32_t _t_period;
uint32_t _t_pa[4];
uint32_t _t_pulse_min[4];
uint32_t _t_pulse_max[4];
};
struct wm_dpv_ctx_t {
/* WARNING: please keep MEASURE at first!! */
struct wm_meas_t measure;
int32_t _Vset;
int32_t _v0;
uint32_t _t_pulse[4];
int32_t _v_initial[4];
int32_t _v_slope[4];
int32_t _v_step[4];
uint32_t _t_period;
uint32_t _t_pa[4];
int32_t _v_stop;
bool _v_curr_direc;
int32_t _v_amp;
uint32_t _t_pulse_min[4];
uint32_t _t_pulse_max[4];
bool _v_direc_init;
};
struct wm_dpv_advance_ctx_t {
/* WARNING: please keep MEASURE at first!! */
struct wm_meas_t measure;
int32_t _Vset;
int32_t _v0;
uint32_t _t_pulse[4];
int32_t _v_initial[4];
int32_t _v_slope[4];
int32_t _v_step[4];
uint32_t _t_period;
uint32_t _t_pa[4];
int32_t _v_stop;
int32_t _v_up;
int32_t _v_low;
int32_t _v_amp;
int32_t _v_1;
int32_t _v_2;
uint32_t _t_pulse_min[4];
uint32_t _t_pulse_max[4];
uint16_t _cycleNumber;
bool _v_curr_direc;
bool _v_direc_init;
bool _v_invert_option;
bool _v_stop_direction;
};
struct wm_ocp_ctx_t {
/* WARNING: please keep MEASURE at first!! */
struct wm_meas_t measure;
};
int wm_init(void);
int wm_deinit(void);
void *wm_get(void);
@@ -176,6 +257,9 @@ static int __it_create(void)
m->_measureBat = 0;
m->_VoViSwitch = instru.VoViSwitch;
p->_Vinit = (instru.Vinit - 25000) * 4 * 10000; //[5nV]
p->_Vset = 0;
*wm = p;
return 0;
@@ -440,6 +524,222 @@ static int __pulse_create(void)
return 0;
}
static int __uni_pulse_create(void)
{
struct wm_meas_t *m;
struct wm_uni_pulse_ctx_t *p;
void **wm = &workMode_p;
uint32_t pul_acc = 0;
int i;
p = malloc(sizeof(struct wm_uni_pulse_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 = instru.VoViSwitch;
p->_Vset = 0;
p->_v0 = UC_TO_5NV(instru.v0); //[5nV]
p->_t_pulse[0] = instru.t_pulse[0];
p->_t_pulse[1] = instru.t_pulse[1];
p->_t_pulse[2] = instru.t_pulse[2];
p->_t_pulse[3] = instru.t_pulse[3];
p->_v_initial[0] = UC_TO_5NV(instru.v_initial[0]); //[5nv]
p->_v_initial[1] = UC_TO_5NV(instru.v_initial[1]); //[5nv]
p->_v_initial[2] = UC_TO_5NV(instru.v_initial[2]); //[5nv]
p->_v_initial[3] = UC_TO_5NV(instru.v_initial[3]); //[5nv]
p->_v_slope[0] = instru.v_slope[0];
p->_v_slope[1] = instru.v_slope[1];
p->_v_slope[2] = instru.v_slope[2];
p->_v_slope[3] = instru.v_slope[3];
p->_v_step[0] = UC_TO_5NV(instru.v_step[0]); //[5nv]
p->_v_step[1] = UC_TO_5NV(instru.v_step[1]); //[5nv]
p->_v_step[2] = UC_TO_5NV(instru.v_step[2]); //[5nv]
p->_v_step[3] = UC_TO_5NV(instru.v_step[3]); //[5nv]
p->_t_period = 0;
for (i=0; i<4; i++) {
p->_t_pa[i] = pul_acc + p->_t_pulse[i];
pul_acc = p->_t_pa[i];
p->_t_period += p->_t_pulse[i];
}
instru.period = p->_t_period;
p->_t_pulse_min[0] = (instru.t_pulse[0] - 100) * instru.t_pulse_min[0] / 100 + 50;
p->_t_pulse_min[1] = (instru.t_pulse[1] - 100) * instru.t_pulse_min[1] / 100 + 50;
p->_t_pulse_min[2] = (instru.t_pulse[2] - 100) * instru.t_pulse_min[2] / 100 + 50;
p->_t_pulse_min[3] = (instru.t_pulse[3] - 100) * instru.t_pulse_min[3] / 100 + 50;
p->_t_pulse_max[0] = (instru.t_pulse[0] - 100) * instru.t_pulse_max[0] / 100 + 50;
p->_t_pulse_max[1] = (instru.t_pulse[1] - 100) * instru.t_pulse_max[1] / 100 + 50;
p->_t_pulse_max[2] = (instru.t_pulse[2] - 100) * instru.t_pulse_max[2] / 100 + 50;
p->_t_pulse_max[3] = (instru.t_pulse[3] - 100) * instru.t_pulse_max[3] / 100 + 50;
*wm = p;
return 0;
}
static int __dpv_create(void)
{
struct wm_meas_t *m;
struct wm_dpv_ctx_t *p;
void **wm = &workMode_p;
uint32_t pul_acc = 0;
int i;
p = malloc(sizeof(struct wm_dpv_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 = instru.VoViSwitch;
p->_Vset = 0;
p->_v0 = instru.v0; //[5nV]
p->_v_stop = instru.v_stop; //[5nV]
p->_t_pulse[0] = instru.t_pulse[0];
p->_t_pulse[1] = instru.t_pulse[1];
p->_v_initial[0] = instru.v_initial[0]; //[5nv]
p->_v_initial[1] = instru.v_initial[1]; //[5nv]
p->_v_slope[0] = instru.v_slope[0];
p->_v_slope[1] = instru.v_slope[1];
p->_v_step[0] = instru.v_step[0]; //[5nv]
p->_v_step[1] = instru.v_step[1]; //[5nv]
p->_t_period = 0;
for (i=0; i<4; i++) {
p->_t_pa[i] = pul_acc + p->_t_pulse[i];
pul_acc = p->_t_pa[i];
p->_t_period += p->_t_pulse[i];
}
instru.period = p->_t_period;
p->_v_direc_init = instru.directionInit;
p->_v_curr_direc = instru.directionInit;
p->_v_amp = instru.v_initial[1] - instru.v_initial[0];
p->_t_pulse_min[0] = (instru.t_pulse[0] - 100) * instru.t_pulse_min[0] / 100 + 50;
p->_t_pulse_min[1] = (instru.t_pulse[1] - 100) * instru.t_pulse_min[1] / 100 + 50;
p->_t_pulse_max[0] = (instru.t_pulse[0] - 100) * instru.t_pulse_max[0] / 100 + 50;
p->_t_pulse_max[1] = (instru.t_pulse[1] - 100) * instru.t_pulse_max[1] / 100 + 50;
*wm = p;
return 0;
}
static int __dpv_advance_create(void)
{
struct wm_meas_t *m;
struct wm_dpv_advance_ctx_t *p;
void **wm = &workMode_p;
uint32_t pul_acc = 0;
int i;
p = malloc(sizeof(struct wm_dpv_advance_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 = instru.VoViSwitch;
p->_Vset = 0;
p->_v0 = instru.v0; //[5nV]
p->_v_stop = instru.v_stop; //[5nV]
p->_t_pulse[0] = instru.t_pulse[0];
p->_t_pulse[1] = instru.t_pulse[1];
p->_v_initial[0] = instru.v_initial[0]; //[5nv]
p->_v_initial[1] = instru.v_initial[1]; //[5nv]
p->_v_slope[0] = instru.v_slope[0];
p->_v_slope[1] = instru.v_slope[1];
p->_v_step[0] = instru.v_step[0]; //[5nv]
p->_v_step[1] = instru.v_step[1]; //[5nv]
p->_t_period = 0;
for (i=0; i<4; i++) {
p->_t_pa[i] = pul_acc + p->_t_pulse[i];
pul_acc = p->_t_pa[i];
p->_t_period += p->_t_pulse[i];
}
instru.period = p->_t_period;
p->_v_direc_init = instru.directionInit;
p->_v_curr_direc = instru.directionInit;
p->_v_stop_direction = instru.v_stop_direction;
p->_v_up = instru.v_up;
p->_v_low = instru.v_low;
p->_v_amp = instru.v_initial[1] - instru.v_initial[0];
p->_v_1 = instru.v_1;
p->_v_2 = instru.v_2;
p->_t_pulse_min[0] = (instru.t_pulse[0] - 100) * instru.t_pulse_min[0] / 100 + 50;
p->_t_pulse_min[1] = (instru.t_pulse[1] - 100) * instru.t_pulse_min[1] / 100 + 50;
p->_t_pulse_max[0] = (instru.t_pulse[0] - 100) * instru.t_pulse_max[0] / 100 + 50;
p->_t_pulse_max[1] = (instru.t_pulse[1] - 100) * instru.t_pulse_max[1] / 100 + 50;
p->_cycleNumber = instru.cycleNumber;
p->_v_invert_option = instru.v_invert_option;
*wm = p;
return 0;
}
static int __ocp_create(void)
{
struct wm_meas_t *m;
struct wm_ocp_ctx_t *p;
void **wm = &workMode_p;
p = malloc(sizeof(struct wm_ocp_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 = instru.VoViSwitch;
*wm = p;
return 0;
}
int wm_init(void)
{
int mode = instru.eliteFxn;
@@ -448,55 +748,10 @@ int wm_init(void)
if (*wm) return -1;
switch (mode) {
case CURVE_VO:
case CURVE_CALI_DAC:
if (__vo_create()) return -2;
break;
case CURVE_IT:
if (__it_create()) return -2;
break;
case CURVE_VT:
if (__vt_create()) return -2;
break;
case CURVE_RT:
if (__rt_create()) return -2;
break;
case CURVE_IV:
if (__iv_create()) return -2;
break;
case CURVE_IV_CY:
if (__iv_cy_create()) return -2;
break;
case CURVE_CC:
if (__cc_create()) return -2;
break;
case CURVE_CV:
if (__cv_create()) return -2;
break;
case CURVE_LSV:
if (__lsv_create()) return -2;
break;
case CURVE_CA:
if (__ca_create()) return -2;
break;
case CURVE_PULSE:
if (__pulse_create()) return -2;
break;
default:
// printf("DO NOT support!!");
return -3;
};
}
return 0;
}
@@ -522,20 +777,7 @@ void *wm_get(void)
return wm;
}
/* CC Mode parameter
* @ Measure : measure current value (nA)
* @ Charge : Charge or Discharge
* @ BatteryV : Vin measure battery voltage (mV)
* @ value : constant current setting.
* Current value divide current level into 3,000,001 pieces
* 1,500,000 is zero point; 3,000,000 is 15mA
* Current = (value - 1,500,000)/100,000 mA
* @ Done : Done = false => Ignore Vmin condition;
* Done will be true, if BatteryV <= Vmin last for about 12sec in discharge mode
* @ VMax : voltage upper bound in charge mode
* CC->value will set to zero if BatteryV >= VMax in charge mode
* @ VMin : voltage lower bound in charge mode
* CC->value will set to zero if BatteryV <=> VMin in charge mode
* Note that VMax and VMin are always larger or equal to zero
*/
#ifdef __cplusplus
}
#endif
#endif
@@ -1,23 +0,0 @@
#ifndef ELITEZT
#define ELITEZT
// output a certain voltage e.g. 2v
// and measure the input voltage
// => calculate the resister
// change the output voltage step
// => get a R-T curve (with resolution = 1 sample/volt step )
static void rt_vscan(void)
{
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
if (vscanReset) {
Vset = rt->_Vinit;
}
if(!vscanReset) {
Vset = rt->_Vinit;
}
}
#endif
@@ -6,6 +6,9 @@
#include <Board.h>
#include <ti/drivers/PIN.h>
//#define ELITE_PIN_1_5
#define ELITE_PIN_1_5_RE
/* SPI Board */
#define Board_SPI0_MISO PIN_UNASSIGNED
#define Board_SPI0_MOSI D1
@@ -36,15 +39,24 @@
#define ADC_DAC_SPI_CLK LOAD0, D2
#define LED_MOSI LOAD0, D1
#define LED_CLK LOAD0, D0
#define MEM_HOLD LOAD0, D4
#define MEM_CS LOAD0, D5
#ifdef ELITE_PIN_1_5
#define MEM_HOLD LOAD0, D4
#define HIGH_Z_MODE LOAD2, D5
#endif
#ifdef ELITE_PIN_1_5_RE
#define MEM_HOLD LOAD1, D0
#define HIGH_Z_MODE LOAD0, D4
#endif
#define Turnon_I_MID LOAD2, D0
#define Turnon_I_SMALL LOAD2, D4
#define Turnon_I_LARGE LOAD2, D1
#define Turnon_V_SMALL LOAD2, D2
#define Turnon_V_MID LOAD2, D3
#define Turon_VOUT_SMALL LOAD2, D7
#define Turnon_VOUT_SMALL LOAD2, D7
#define shutdown_6994 LOAD2, D6
//#define Turnon10K Turnon_I_MID
//#define Turnon200R Turnon_I_LARGE
@@ -55,9 +67,7 @@
#define Board_I2C0_SDA0 PIN_UNASSIGNED
#endif
#define shutdown_6994 LOAD2, D6
#define switch_on IOID_14
#define HIGH_Z_MODE LOAD2, D5
#define enable_10v LOAD1, D5
#define enable_5v LOAD1, D6
@@ -2,7 +2,7 @@
***********************************************************
Read battery's method
***********************************************************
1.ReadADCBat(spi_ADC_rxbuf)
1.read_adc_raw_data(RIS_ADC_BAT, spi_ADC_rxbuf, spi_ADC_txbuf);
let "spi_ADC_rxbuf" be 8000
8000 * 187.5uV * 2 = 3000000uV = 3V ;
2.AONBatMonBatteryVoltageGet()
@@ -34,40 +34,41 @@ static uint8_t headstage_battery_percent() {
static void headstage_battery_volt(){
uint32_t bat_volt = 0;
ReadADCBat(spi_ADC_rxbuf);
read_adc_raw_data(RIS_ADC_BAT, spi_ADC_rxbuf, spi_ADC_txbuf);
bat_volt = (uint32_t) (spi_ADC_rxbuf[0] << 8) | (uint32_t) (spi_ADC_rxbuf[1]);
bat_volt = bat_volt * 12 / 125; //x * 187.5 * 1e-6 * 2 / 125 * 320 * 100 ;
// bat_volt = (bat_volt - 1) * 187.5 * 2;
InputNotify(NOTIFY_VOLT_BAT, bat_volt);
}
static void headstage_temperature(void) {
int32_t curTemp = 0;
curTemp = AONBatMonTemperatureGetDegC();
InputNotify(NOTIFY_TEMPERATURE,curTemp);
}
static void EliteADCBattery(){
static uint8_t ADCSwitch = 0;
if(instru.eliteFxn == CURVE_CALI_ADCTEST){
if(ADCSwitch == 0){ /**read V**/
read_adc_raw_data(RIS_ADC_BAT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADCSwitch++;
}
else if(ADCSwitch == 1){ /**read V**/
read_adc_raw_data(RIS_ADC_BAT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADCSwitch++;
}
else if(ADCSwitch == 2){ /**read V(buffer)**/
headstage_battery_volt();
batteryCheck_flag = false;
headstage_temperature();
tempCheck_flag = false;
ADCSwitch = 0;
}else{
if(ADCSwitch == 0){ /**read V**/
ReadADCBat(spi_ADC_rxbuf);
ADCSwitch++;
}
else if(ADCSwitch == 1){ /**read V**/
ReadADCBat(spi_ADC_rxbuf);
ADCSwitch++;
}
else if(ADCSwitch == 2){ /**read V(buffer)**/
headstage_battery_volt();
batteryCheck_flag = false;
ADCSwitch = 0;
}
}
}
static void measureBat(){
GPT.DeltaGptimerCounter = GPT.GptimerCounter - GPT.GptimerCounter0;
GPT.GptimerCounter0 = GPT.GptimerCounter;
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.DeltaGptimerCounter;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.DeltaGptimerCounter;
if(GPT.BatteryCheckCounter >= 50000){//5min=3000000, 5s=50000
GPT.BatteryCheckCounter = 0;
batteryCheck_flag = true;
@@ -17,62 +17,40 @@
#define VIS_SHIFT_200R 0x80
#define VIS_DEVICE_SHINY 0x10
#define VIS_SHINY_DIS 0x20
#define VIS_CC_ZERO 0x40
// RIS (real instruction)
enum all_mode_e {
CURVE_IV = 0x10,
CURVE_IV_CY = 0x20, // cycling iv
CURVE_VO = 0x30,
CURVE_RT = 0x40,
CURVE_VT = 0x50,
CURVE_IT = 0x60,
SET_SAMPLE_RATE = 0x70,
SET_ADC_DAC_GAIN = 0x80,
DIFFERENTIAL_PULSE_VOLTAMMETRY = 0xA0,
SQUARE_WAVE_VOLTAMMETRY = 0xB0,
CURVE_CV = 0xC0, // cyclic voltammetry
CURVE_CC = 0xD0, // constant current
CURVE_CC_CY = 0xF0, // cycling constant current
CURVE_CV_HIGH_CY = 0x01, // cyclic voltammetry(high cycle)
CURVE_LSV = 0x02, // linear sweep voltammetry
CURVE_CA = 0x03, // chronoamperometric graph(CA)
CURVE_CALI_ADCTEST = 0x91,
CURVE_CALI_DAC = 0x93,
CURVE_CALI_ADC = 0x92,
CURVE_PULSE = 0x94,
CURVE_CALI_ADC = 0xF1, // Cali ADC - test //0x92,
SET_SAMPLE_RATE = 0xE0, //0x70,
SET_ADC_DAC_GAIN = 0xE1, //0x80,
};
enum set_para_e {
DAC_VOLT = 0x01,
};
enum dev_para_e {
VERSION_DEV_TEST = 0x01,
BAT_DEV_TEST = 0x02,
TEMP_DEV_TEST = 0x03,
LED_DEV_TEST = 0x04,
};
// CIS (control instruction)
#define CIS_VERSION 0x40
#define CIS_VOLT 0x10
#define CIS_LED_TEST 0x70
#define CIS_TEMPERATURE 0x80
// mode parameter
#define STEP_TO_VSETRATE(step) step2VsetRate(step)
#define VMAX(v1,v2) ((v1 >= v2) ? v1 : v2)
#define VMIN(v1,v2) ((v1 < v2) ? v1 : v2)
#define VDIRECTION(v1,v2) ((v1 > v2) ? 0 : 1)
#define AFTER_READ_I 0
#define AFTER_READ_V 1
#define ReadADCVolt(x) ((x==0)? ReadADCVout(spi_ADC_rxbuf) : ReadADCVin(spi_ADC_rxbuf))
#define PARA_1 0x01
#define PARA_2 0x02
#define PARA_3 0x03
#define PARA_4 0x04
#define PARA_5 0x05
#define PARA_6 0x06
#define PARA_7 0x07
#define PARA_8 0x08
#define PARA_9 0x09
#define PARA_10 0x0A
#define PARA_11 0x0B
#define PARA_12 0x0C
#define PARA_13 0x0D
#define PARA_14 0x0E
#define PARA_15 0x0F
#define PARA_16 0x10
#define PARA_17 0x11
//Elite LED
#define COLOR_BLACK 0x00
@@ -105,4 +83,14 @@ enum all_mode_e {
#define POST_WORK 0x05
#define VALUE_ZERO_TO_ONE(_v) (_v == 0) ? 1 : _v
//plot_type
#define IT_PLOT 1
#define VT_PLOT 2
#define VOUT_PLOT 3
#define IIN_VIN_PLOT 4
#define IIN_VIN_VOUT_PLOT 5
#define CLOCK_ONE_SECOND 10000
#endif
@@ -5,481 +5,233 @@
static void volt_out() {
static uint16_t DACOutCode;
static int32_t Vout;
static int32_t DeltaVout;
if(DACReset){
Vout = Vset;
}else{
DeltaVout = Vset - (Vout);
Vout = Vout + DeltaVout;
if (DACReset) {
instru.Vout = Vset;
} else {
DeltaVout = Vset - (instru.Vout);
instru.Vout = instru.Vout + DeltaVout;
}
if (Vout >= 1100000000) { //1100000000 = 5.5V
Vout = 1100000000;
} else if (Vout <= -1000000000) { //-1000000000 = -5V
Vout = -1000000000;
if (instru.Vout >= 1100000000) { //1100000000 = 5.5V
instru.Vout = 1100000000;
} else if (instru.Vout <= -1000000000) { //-1000000000 = -5V
instru.Vout = -1000000000;
}
instru.VoltConstant = Vout / 40000 + 25000; //5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(instru.VoutGainLevel, instru.VoltConstant);
instru.VoltConstant = instru.Vout / 40000 + 25000; //5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(instru.VoutGainLv, instru.VoltConstant);
DAC_outputV(DACOutCode);
if ((instru.eliteFxn == CURVE_IV)||(instru.eliteFxn == CURVE_IV_CY)||(instru.eliteFxn == CURVE_CC)){
int32_t RealV;
RealV = (int32_t)(Vout / 200);//[1uV]
InputNotify(NOTIFY_IMPEDANCE, RealV);
return;
}
static void vscan_volt_out(void)
{
void *wm = wm_get();
uint16_t DACOutCode;
int32_t DeltaVout;
int32_t Vin;
Vin = MEAS_VIN(wm) * 200;//[5nV]
if (DACReset) {
instru.Vout = Vset + Vin;
} else {
DeltaVout = Vset - (instru.Vout - Vin);
instru.Vout = instru.Vout + DeltaVout;
}
instru.VoltConstant = instru.Vout / 40000 + 25000;//5nV=>usercode
DACOutCode = Usercode_Correction_to_DAC(instru.VoutGainLv, instru.VoltConstant);
DAC_outputV(DACOutCode);
return;
}
static void CalcuResistance()
{
/* Elite 100 = 100R
Elite 1000 = 1KR
Elite 10000 = 10KR
Elite 100000 = 100KR
Elite 1000000 = 1MR
/* Elite 100000 = 100R
Elite 1000000 = 1KR
Elite 10000000 = 10KR
Elite 100000000 = 100KR
Elite 1000000000 = 1MR
*/
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
struct wm_meas_t *m = &rt->measure;
int32_t resist;
int32_t volt;
int64_t resist;
int64_t volt = instru.Vout / 200; // [uV]
int64_t current = (int64_t)(m->_measureCurrent);
volt = (m->_measureVin * 1000) - (m->_measureCurrent * 10); //V = Vin - Iin * 10
resist = volt / m->_measureCurrent; //R = V / Iin;
resist = volt * 1000000 / current; //R = V / Iin; [mOhm]
InputNotify(NOTIFY_IMPEDANCE, resist);
}
static void DACenable(uint8_t afterRead){
void *wm = wm_get();
/*
* skip damping times in Iin channel for manual control
* any level switch to 0 level has 80ms damping
* any level switch to 1 level has 20ms damping
* any level switch to 2 level has 10ms damping
* any level switch to 3 level has 10ms damping
*/
#define CNT_TO_I_GAIN_3K_IIN_VIN_VOUT_PLOT 9 // 9 * 9ms = 81ms
#define CNT_TO_I_GAIN_100K_IIN_VIN_VOUT_PLOT 3 // 3 * 9ms = 27ms
#define CNT_TO_I_GAIN_3M_IIN_VIN_VOUT_PLOT 2 // 2 * 9ms = 18ms
#define CNT_TO_I_GAIN_100R_IIN_VIN_VOUT_PLOT 2 // 2 * 9ms = 18ms
if (afterRead == AFTER_READ_I) {
switch (instru.eliteFxn) {
case CURVE_CC:
cc_vscan();
volt_out();
break;
#define CNT_TO_I_GAIN_3K_IIN_VIN_PLOT 14 // 14 * 6ms = 84ms
#define CNT_TO_I_GAIN_100K_IIN_VIN_PLOT 4 // 4 * 6ms = 24ms
#define CNT_TO_I_GAIN_3M_IIN_VIN_PLOT 2 // 2 * 6ms = 12ms
#define CNT_TO_I_GAIN_100R_IIN_VIN_PLOT 2 // 2 * 6ms = 12ms
default:
break;
}
} else if (afterRead == AFTER_READ_V) {
switch (instru.eliteFxn) {
case CURVE_IV_CY:
case CURVE_IV:
case CURVE_VO:
volt_out();
break;
case CURVE_RT:
volt_out();
CalcuResistance();
break;
case CURVE_CV:
cv_volt_out();
break;
case CURVE_LSV:{
lsv_volt_out();
break;
}
case CURVE_CA:{
ca_volt_out();
break;
}
default:{
break;
}
}
}
}
static void CC_Plot(void)
{
static uint8_t ADCSwitch = 0;
static uint8_t BatSwitch = 0;
static int32_t VoltData = 0;
void *wm = wm_get();
// if (batteryCheck_flag) {
// if (BatSwitch == 0) {
// if (ADCSwitch == 0) { /**read Iin(buffer),read bat**/
// if (instru.AutoGainEnable) {
// MEAS_CURR(wm) = AutoGainReadIin(spi_ADC_rxbuf);
// AutoGainChangeIin(MEAS_CURR(wm));
// } else {
// ReadADCIin(spi_ADC_rxbuf);
// MEAS_CURR(wm) = DecodeADCValue(instru.ADCGainLevel, ADC_CH_CURRENT, spi_ADC_rxbuf);
// if (lastIinADCGainLevel != instru.ADCGainLevel) {
// IinADCGainControl(instru.ADCGainLevel);
// record_flag = false;
// }
// }
// if (record_flag == false) {
// static int recordCount = 0;
// recordCount++;
// if (recordCount == 2) {
// record_flag = true;
// recordCount = 0;
// }
// } else {
// InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
// }
// DACenable(AFTER_READ_I);
//
// ReadADCBat(spi_ADC_rxbuf);
// BatSwitch++;
// } else if(ADCSwitch == 1 || ADCSwitch == 3) { /**read Bat**/
// ReadADCBat(spi_ADC_rxbuf);
// BatSwitch++;
// } else if(ADCSwitch == 2) { /**read V(buffer),read bat**/
// if (VOLT_SW(wm) == 0x01 || VOLT_SW(wm) == 0x02) {
// if (instru.VinAutoGainEnable) {
// MEAS_VIN(wm) = AutoGainReadVin(spi_ADC_rxbuf);
// AutoGainChangeVin(MEAS_VIN(wm));
// } else {
// ReadADCVolt(VOLT_SW(wm));
// MEAS_VIN(wm) = DecodeADCValue(instru.VinADCGainLevel, ADC_CH_VOLT, spi_ADC_rxbuf);
// if (lastVinADCGainLevel != instru.VinADCGainLevel) {
// VinADCGainControl(instru.VinADCGainLevel);
// record_flag = false;
// }
// }
// VoltData = MEAS_VIN(wm);
// } else if (VOLT_SW(wm) == 0x00) {
// ReadADCVolt(VOLT_SW(wm));
// MEAS_VOUT(wm) = DecodeADCValue(instru.ADCGainLevel, ADC_CH_DAC, spi_ADC_rxbuf);
// VoltData = MEAS_VOUT(wm);
// }
//
// if (instru.VoViSwitch == 0x02) {
// int32_t Vscan = (Vset / 200 - MEAS_VIN(wm));
// Vscan = (int32_t)(Vscan);//[1uV]
// InputNotify(NOTIFY_VOLT, Vscan);
// } else {
// InputNotify(NOTIFY_VOLT, VoltData);
// }
// DACenable(AFTER_READ_V);
//
// ReadADCBat(spi_ADC_rxbuf);
// BatSwitch++;
// }
// } else if(BatSwitch == 1) {
// ReadADCBat(spi_ADC_rxbuf);
// BatSwitch++;
// } else if(BatSwitch == 2) {
// headstage_battery_volt();
// ReadADCIin(spi_ADC_rxbuf);
// batteryCheck_flag = false;
// BatSwitch = 0;
// ADCSwitch = 3;
// }
// } else {
BatSwitch = 0;
if (ADCSwitch == 0) { /**read Iin(buffer),read V**/
if (instru.AutoGainEnable) {
MEAS_CURR(wm) = AutoGainReadIin(spi_ADC_rxbuf);
AutoGainChangeIin(MEAS_CURR(wm));
} else {
ReadADCIin(spi_ADC_rxbuf);
MEAS_CURR(wm) = DecodeADCValue(instru.ADCGainLevel, ADC_CH_CURRENT, spi_ADC_rxbuf);
if (lastIinADCGainLevel != instru.ADCGainLevel) {
IinADCGainControl(instru.ADCGainLevel);
record_flag = false;
}
}
if (record_flag == false) {
static int recordCount = 0;
recordCount++;
if (recordCount == 2) {
record_flag = true;
recordCount = 0;
}
} else {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
}
DACenable(AFTER_READ_I);
ReadADCVolt(VOLT_SW(wm));
ADCSwitch++;
} else if(ADCSwitch == 1) { /**read V**/
ReadADCVolt(VOLT_SW(wm));
ADCSwitch++;
} else if(ADCSwitch == 2) { /**read V(buffer),read Iin**/
if (VOLT_SW(wm) == 0x01 || VOLT_SW(wm) == 0x02) {
if (instru.VinAutoGainEnable) {
MEAS_VIN(wm) = AutoGainReadVin(spi_ADC_rxbuf);
AutoGainChangeVin(MEAS_VIN(wm));
} else {
ReadADCVolt(VOLT_SW(wm));
MEAS_VIN(wm) = DecodeADCValue(instru.VinADCGainLevel, ADC_CH_VOLT, spi_ADC_rxbuf);
if (lastVinADCGainLevel != instru.VinADCGainLevel) {
VinADCGainControl(instru.VinADCGainLevel);
record_flag = false;
}
}
VoltData = MEAS_VIN(wm);
} else if (VOLT_SW(wm) == 0x00) {
ReadADCVolt(VOLT_SW(wm));
MEAS_VOUT(wm) = DecodeADCValue(instru.ADCGainLevel, ADC_CH_DAC, spi_ADC_rxbuf);
VoltData = MEAS_VOUT(wm);
}
if (instru.VoViSwitch == 0x02) {
int32_t Vscan = (Vset / 200 - MEAS_VIN(wm));
Vscan = (int32_t)(Vscan);//[1uV]
InputNotify(NOTIFY_VOLT, Vscan);
} else {
InputNotify(NOTIFY_VOLT, VoltData);
}
DACenable(AFTER_READ_V);
ReadADCIin(spi_ADC_rxbuf);
ADCSwitch++;
} else if (ADCSwitch == 3) { /**read Iin**/
ReadADCIin(spi_ADC_rxbuf);
ADCSwitch = 0;
}
// }
}
static void IT_Plot(void)
{
static uint8_t ADCSwitch = 0;
void *wm = wm_get();
// if (batteryCheck_flag) {
// EliteADCBattery();
// if (!batteryCheck_flag) {
// ReadADCIin(spi_ADC_rxbuf);
// ADCSwitch = 2;
// }
// } else {
if (ADCSwitch == 0) { /**read Iin(buffer)**/
if (instru.AutoGainEnable) {
MEAS_CURR(wm) = AutoGainReadIin(spi_ADC_rxbuf);
AutoGainChangeIin(MEAS_CURR(wm));
} else {
ReadADCIin(spi_ADC_rxbuf);
MEAS_CURR(wm) = DecodeADCValue(instru.ADCGainLevel, ADC_CH_CURRENT, spi_ADC_rxbuf);
if (lastIinADCGainLevel != instru.ADCGainLevel) {
IinADCGainControl(instru.ADCGainLevel);
record_flag = false;
}
}
if (record_flag == false) {
static int recordCount = 0;
recordCount++;
if (recordCount == 2) {
record_flag = true;
recordCount = 0;
}
} else {
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
}
ADCSwitch++;
} else if (ADCSwitch == 1) { /**read Iin**/
ReadADCIin(spi_ADC_rxbuf);
ADCSwitch++;
} else if(ADCSwitch == 2) { /**read Iin**/
ReadADCIin(spi_ADC_rxbuf);
ADCSwitch = 0;
}
// }
}
static void VT_Plot(void)
{
static uint8_t ADCSwitch = 0;
static int32_t VoltData;
void *wm = wm_get();
// if (batteryCheck_flag) {
// EliteADCBattery();
// if (!batteryCheck_flag) {
// ReadADCVolt(VOLT_SW(wm));
// ADCSwitch = 2;
// }
// } else {
if (ADCSwitch == 0) { /**read V(buffer)**/
if (VOLT_SW(wm) == 0x01 || VOLT_SW(wm) == 0x02) {
if (instru.VinAutoGainEnable) {
MEAS_VIN(wm) = AutoGainReadVin(spi_ADC_rxbuf);
AutoGainChangeVin(MEAS_VIN(wm));
} else {
ReadADCVolt(VOLT_SW(wm));
MEAS_VIN(wm) = DecodeADCValue(instru.VinADCGainLevel, ADC_CH_VOLT, spi_ADC_rxbuf);
if (lastVinADCGainLevel != instru.VinADCGainLevel) {
VinADCGainControl(instru.VinADCGainLevel);
record_flag = false;
}
}
VoltData = MEAS_VIN(wm);
} else if (VOLT_SW(wm) == 0x00) {
ReadADCVolt(VOLT_SW(wm));
MEAS_VOUT(wm) = DecodeADCValue(instru.ADCGainLevel, ADC_CH_DAC, spi_ADC_rxbuf);
VoltData = MEAS_VOUT(wm);
}
if (record_flag == false) {
static int recordCount = 0;
recordCount++;
if (recordCount == 2) {
record_flag = true;
recordCount = 0;
}
} else {
InputNotify(NOTIFY_VOLT, VoltData);
}
ADCSwitch++;
} else if (ADCSwitch == 1) { /**read V**/
ReadADCVolt(VOLT_SW(wm));
ADCSwitch++;
} else if (ADCSwitch == 2) { /**read V**/
ReadADCVolt(VOLT_SW(wm));
ADCSwitch = 0;
}
// }
}
#define CNT_TO_I_GAIN_3K_IT_PLOT 4 // 4 * 3ms = 12ms
#define CNT_TO_I_GAIN_100K_IT_PLOT 7 // 7 * 3ms = 21ms
#define CNT_TO_I_GAIN_3M_IT_PLOT 27 // 27 * 3ms = 81ms
#define CNT_TO_I_GAIN_100R_IT_PLOT 4 // 4 * 3ms = 12ms
static void cali_IT_plot(void) {
void *wm = wm_get();
static uint8_t ADCSwitch = 0;
static int32_t ADCValueSUM = 0;
int32_t ADCValueAVG = 0;
static int32_t ADCValueSUM = 0;
static uint16_t cali_count = 0;
static uint8_t ADC_cnt = 0;
static uint8_t rec_cnt = 0;
static uint16_t cali_count_max = 1000;
int32_t ADCValueAVG = 0;
if(ADCSwitch == 0){ /**read Iin(buffer)**/
if(instru.AutoGainEnable){
/* ADC_cnt: 0 - read Iin and do NOT buffer the Iin after changing gain twice
* 1 - read Iin and increase ADC_cnt
* 2 - read Iin and reset ADC_cnt
*/
if (ADC_cnt == 0) {
if (instru.IinADCAutoGainEn) {
MEAS_CURR(wm) = 0xFFFF;
}else{
ReadADCIin(spi_ADC_rxbuf);
} else {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_CURR(wm) = (int32_t) (spi_ADC_rxbuf[0] << 8) | (int32_t) (spi_ADC_rxbuf[1]);
if(lastIinADCGainLevel != instru.ADCGainLevel){
IinADCGainControl(instru.ADCGainLevel);
record_flag = false;
if (lastIinADCGainLevel != instru.IinADCGainLv) {
IinADCGainCtrl(instru.IinADCGainLv);
}
}
if(instru.ADCGainLevel == 0) {
if (instru.IinADCGainLv == 0) {
cali_count_max = 5000;
} else {
cali_count_max = 1000;
}
if(record_flag == false){
static int recordCount = 0;
recordCount++;
if(recordCount == 2){
record_flag = true;
recordCount = 0;
}
}else{
static uint16_t cali_count = 0;
if(cali_count >= cali_count_max){
if (curr_rec_en == false) {
rec_cnt++;
} else {
if (cali_count >= cali_count_max) {
ADCValueAVG = ADCValueSUM / cali_count;
InputNotify(NOTIFY_CURRENT, ADCValueAVG);
SendNotify();
uint8_t CIS_buf[9] = {0};
CIS_buf[0] = instru.chip_id;
CIS_buf[1] = (uint8_t) ((ADCValueAVG & 0xFF00) >> 8);
CIS_buf[2] = (uint8_t) (ADCValueAVG & 0x00FF);
CIS_buf[3] = 0x00;
CIS_buf[4] = instru.ADCGainLevel;
CIS_buf[0] = 5; //data len
CIS_buf[1] = instru.chip_id;
CIS_buf[2] = (uint8_t) ((ADCValueAVG & 0xFF00) >> 8);
CIS_buf[3] = (uint8_t) (ADCValueAVG & 0x00FF);
CIS_buf[4] = 0x00;
CIS_buf[5] = instru.IinADCGainLv;
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, 9, CIS_buf);
ADCValueSUM = 0;
cali_count = 0;
PeriodicEvent = false;
ADCValueSUM = 0;
cali_count = 0;
ModeLED(NO_EVENT);
}else{
} else {
cali_count++;
ADCValueSUM = ADCValueSUM + MEAS_CURR(wm);
InputNotify(NOTIFY_CURRENT, MEAS_CURR(wm));
InputNotify(NOTIFY_VOLT, ADCValueSUM);
InputNotify(NOTIFY_IMPEDANCE, (int32_t)cali_count);
}
}
ADCSwitch++;
if (rec_cnt == 2) {
curr_rec_en = true;
rec_cnt = 0;
}
ADC_cnt++;
return;
}
else if(ADCSwitch == 1){ /**read Iin**/
ReadADCIin(spi_ADC_rxbuf);
ADCSwitch++;
if (ADC_cnt == 1) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_cnt++;
return;
}
else if(ADCSwitch == 2){ /**read Iin**/
ReadADCIin(spi_ADC_rxbuf);
ADCSwitch = 0;
if (ADC_cnt == 2) {
read_adc_raw_data(RIS_ADC_IIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_cnt = 0;
return;
}
return;
}
static void cali_VT_plot(void) {
void *wm = wm_get();
static uint8_t ADCSwitch = 0;
static int32_t VoltData = 0;
static int32_t ADCValueSUM = 0;
int32_t ADCValueAVG = 0;
static uint16_t cali_count_max = 1000;
static int32_t ADCValueSUM = 0;
static uint16_t cali_count = 0;
static uint8_t ADC_cnt = 0;
static uint8_t rec_cnt = 0;
uint16_t cali_count_max = 0;
int32_t ADCValueAVG = 0;
if(ADCSwitch == 0){ /**read Iin(buffer)**/
if(VOLT_SW(wm) == 0x01 || VOLT_SW(wm) == 0x02){
if(instru.VinAutoGainEnable){
MEAS_VIN(wm) = 0xFFFF;
}else{
ReadADCVolt(VOLT_SW(wm));
MEAS_VIN(wm) = (int32_t) (spi_ADC_rxbuf[0] << 8) | (int32_t) (spi_ADC_rxbuf[1]);
if(lastVinADCGainLevel != instru.VinADCGainLevel){
VinADCGainControl(instru.VinADCGainLevel);
record_flag = false;
}
}
VoltData = MEAS_VIN(wm);
/* ADC_cnt: 0 - read Vin and do NOT buffer the Vin after changing gain twice
* 1 - read Vin and increase ADC_cnt
* 2 - read Vin and reset ADC_cnt
*/
if (ADC_cnt == 0) {
if (instru.VinADCAutoGainEn) {
MEAS_VIN(wm) = 0xFFFF;
} else {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_VIN(wm) = (int32_t) (spi_ADC_rxbuf[0] << 8) | (int32_t) (spi_ADC_rxbuf[1]);
if (lastVinADCGainLv != instru.VinADCGainLv) VinADCGainCtrl(instru.VinADCGainLv);
}
if(instru.VinADCGainLevel == 0) {
if (instru.VinADCGainLv == 0) {
cali_count_max = 5000;
} else {
cali_count_max = 1000;
}
if(record_flag == false){
static int recordCount = 0;
recordCount++;
if(recordCount == 2){
record_flag = true;
recordCount = 0;
}
}else{
static uint16_t cali_count = 0;
if(cali_count >= cali_count_max){
if (volt_rec_en == false) {
rec_cnt++;
} else {
if (cali_count >= cali_count_max) {
ADCValueAVG = ADCValueSUM / cali_count;
InputNotify(NOTIFY_VOLT, ADCValueAVG);
SendNotify();
uint8_t CIS_buf[9] = {0};
CIS_buf[0] = instru.chip_id;
CIS_buf[1] = (uint8_t) ((ADCValueAVG & 0xFF00) >> 8);
CIS_buf[2] = (uint8_t) (ADCValueAVG & 0x00FF);
CIS_buf[3] = 0x00;
CIS_buf[4] = instru.VinADCGainLevel;
CIS_buf[0] = 5; //data len
CIS_buf[1] = instru.chip_id;
CIS_buf[2] = (uint8_t) ((ADCValueAVG & 0xFF00) >> 8);
CIS_buf[3] = (uint8_t) (ADCValueAVG & 0x00FF);
CIS_buf[4] = 0x00;
CIS_buf[5] = instru.VinADCGainLv;
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, 9, CIS_buf);
ADCValueSUM = 0;
cali_count = 0;
PeriodicEvent = false;
ADCValueSUM = 0;
cali_count = 0;
ModeLED(NO_EVENT);
}else{
} else {
cali_count++;
ADCValueSUM = ADCValueSUM + MEAS_VIN(wm);
InputNotify(NOTIFY_VOLT, MEAS_VIN(wm));
@@ -487,16 +239,105 @@ static void cali_VT_plot(void) {
InputNotify(NOTIFY_IMPEDANCE, (int32_t)cali_count);
}
}
ADCSwitch++;
}
else if(ADCSwitch == 1){ /**read v**/
ReadADCVolt(VOLT_SW(wm));
ADCSwitch++;
}
else if(ADCSwitch == 2){ /**read v**/
ReadADCVolt(VOLT_SW(wm));
ADCSwitch = 0;
}
}
if (rec_cnt == 2) {
volt_rec_en = true;
rec_cnt = 0;
}
ADC_cnt++;
return;
}
if (ADC_cnt == 1) {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_cnt++;
return;
}
if (ADC_cnt == 2) {
read_adc_raw_data(RIS_ADC_VIN, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_cnt = 0;
return;
}
return;
}
static void cali_Vout_plot(void) {
void *wm = wm_get();
static int32_t ADCValueSUM = 0;
static uint16_t cali_count = 0;
static uint8_t ADC_cnt = 0;
static uint8_t rec_cnt = 0;
uint16_t cali_count_max = 1000;
int32_t ADCValueAVG = 0;
/* ADC_cnt: 0 - read Vin and do NOT buffer the Vin after changing gain twice
* 1 - read Vin and increase ADC_cnt
* 2 - read Vin and reset ADC_cnt
*/
if (ADC_cnt == 0) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
MEAS_VOUT(wm) = (int32_t) (spi_ADC_rxbuf[0] << 8) | (int32_t) (spi_ADC_rxbuf[1]);
if (volt_rec_en == false) {
rec_cnt++;
} else {
if (cali_count >= cali_count_max) {
ADCValueAVG = ADCValueSUM / cali_count;
InputNotify(NOTIFY_VOLT, ADCValueAVG);
SendNotify();
uint8_t CIS_buf[9] = {0};
CIS_buf[0] = 5; //data len
CIS_buf[1] = instru.chip_id;
CIS_buf[2] = (uint8_t) ((ADCValueAVG & 0xFF00) >> 8);
CIS_buf[3] = (uint8_t) (ADCValueAVG & 0x00FF);
CIS_buf[4] = 0x00;
CIS_buf[5] = instru.VinADCGainLv;
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, 9, CIS_buf);
PeriodicEvent = false;
ADCValueSUM = 0;
cali_count = 0;
ModeLED(NO_EVENT);
} else {
cali_count++;
ADCValueSUM = ADCValueSUM + MEAS_VOUT(wm);
InputNotify(NOTIFY_VOLT, MEAS_VOUT(wm));
InputNotify(NOTIFY_CURRENT, ADCValueSUM);
InputNotify(NOTIFY_IMPEDANCE, (int32_t)cali_count);
}
}
if (rec_cnt == 2) {
volt_rec_en = true;
rec_cnt = 0;
}
ADC_cnt++;
return;
}
if (ADC_cnt == 1) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_cnt++;
return;
}
if (ADC_cnt == 2) {
read_adc_raw_data(RIS_ADC_VOUT, spi_ADC_rxbuf, spi_ADC_txbuf);
ADC_cnt = 0;
return;
}
return;
}
#endif
@@ -3,10 +3,10 @@
#define VERSION_DATE
#define VERSION_DATE_YEAR 21
#define VERSION_DATE_MONTH 3
#define VERSION_DATE_DAY 8
#define VERSION_DATE_MONTH 12
#define VERSION_DATE_DAY 17
#define VERSION_DATE_HOUR 10
#define VERSION_DATE_MINUTE 5
#define VERSION_DATE_MINUTE 10
// this is NOT the version hash !!
// it's the last version hash
@@ -437,13 +437,13 @@ characteristic change event
EliteZM_pulsefly 0,2,1,7
**************************/
// product information
#define DEVICE_NAME "Elite"
#define MAJOR_PRODUCT_NUMBER 0 //0:Elite ,1:Neulive
#define MINOR_PRODUCT_NUMBER 2 //1:Elite_legacy(Ori_Neulive) 2:Elite_zm 3:Elite_bat
#define DEVICE_NAME "Elite-EDC"
#define MAJOR_PRODUCT_NUMBER 0 // 0:Elite, 1:Neulive
#define MINOR_PRODUCT_NUMBER 2 // 1:Elite_legacy(Ori_Neulive) 2:Elite_zm 3:Elite_bat
#define MAJOR_VERSION_NUMBER 1
#define MINOR_VERSION_NUMBER 6
#define ELITE_VERSION_1_4
//#define ELITE_VERSION_1_3
// buffer size
#define BLE_CIS_BUFF_CHAR SIMPLEPROFILE_CHAR2
@@ -452,22 +452,33 @@ characteristic change event
#define BLE_CIS_BUFF_SIZE SIMPLEPROFILE_CHAR2_LEN
#define BLE_INS_BUFF_SIZE SIMPLEPROFILE_CHAR3_LEN
#define BLE_DAT_BUFF_SIZE SIMPLEPROFILE_CHAR4_LEN
#define CHANNEL_COUNT 16
enum send_ins_para_order_e {
PARA_1 = 0x01,
PARA_2 = 0x02,
PARA_3 = 0x03,
PARA_4 = 0x04,
PARA_5 = 0x05,
PARA_6 = 0x06,
PARA_7 = 0x07,
PARA_8 = 0x08,
PARA_9 = 0x09,
PARA_10 = 0x0A,
PARA_11 = 0x0B,
PARA_12 = 0x0C,
PARA_13 = 0x0D,
PARA_14 = 0x0E,
PARA_15 = 0x0F,
PARA_16 = 0x10,
PARA_17 = 0x11,
PARA_FINAL = 0xFF,
};
#define UC_TO_5NV(_v) (_v - 25000) * 4 * 10000; //userode to 5nv per unit
#include "Elite_def.h"
#include "EliteWorkData.h"
/**
* the pointer to point which channel is used currently.
* -1 for not beginning.
*/
static int8 channel_pointer = -1;
/**
* boolean array for indicate which channel is enable.
*/
static uint8 channel_table[CHANNEL_COUNT] = {0};
/**
* application use instruction receive buffer.
* the length equals to the characteristic 3 which value is 12 bytes.
@@ -539,65 +550,44 @@ static void set_update_instruction_callback(update_instruction_callback_type cal
update_instruction_callback = callback;
}
// for DPVCurve SWVCurve
static uint16_t Amplitude;
static uint8_t PulseWidth;
static uint16_t PulseWidth_16;
static uint8_t PulsePeriod;
static uint16_t PulsePeriod_16;
static uint32_t SampleRateTable[6] = {100, 1000, 10000, 50000, 100000, 1000000}; // 100 =>100 Hz, 1000000=>0.01 Hz
static uint32_t VsetRateTable[5] = {2, 10, 100, 1000, 10000};
static bool batteryCheck_flag;
static bool batteryADC_flag;
static bool ADC_flag;
static bool vscan_flag;
static bool notify_flag;
static bool notifyFirst_flag;
static bool record_flag;
static bool volt_rec_en;
static bool curr_rec_en;
static bool vscanReset;
static bool mode_init;
static bool leadTimeReset;
static bool firstTimeReset;
static bool first_highz_flag;
static bool tempCheck_flag;
static bool calc_avg_en;
static uint16_t dpv_step_cnt = 0;
//pulse mode variable
static bool stiFirstTime;
static int16_t I_GAIN_100R_counter;
static int16_t I_GAIN_3K_counter;
static int16_t I_GAIN_100K_counter;
static int16_t I_GAIN_3M_counter;
static int16_t VIN_GAIN_1M_counter;
static int16_t VIN_GAIN_30K_counter;
static int16_t VIN_GAIN_1K_counter;
static int16_t VOUT_GAIN_240K_counter;
static int16_t VOUT_GAIN_15K_counter;
static uint8_t lastVinADCGainLevel;
static uint8_t lastVinADCGainLv;
static uint8_t lastIinADCGainLevel;
static bool btWaitLedFlag = 0;
static bool noEventLedFlag = 0;
static bool preWorkLedFlag = 0;
static bool workingLedFlag = 0;
static bool postWorkLedFlag = 0;
static void update_latch_status (uint32_t latch_num, uint32_t elite_pin, bool highlow);
// ADC function
static int32_t DecodeADCValue(uint8_t ADCGain, uint8_t ADCChannel, uint8_t *ADC_raw);
static void headstage_battery_volt();
static void EliteADCBattery();
static void VinADCGainControl(uint8_t VinADCLevel);
static void VinADCGainCtrl(uint8_t VinADCLevel);
static void VoutGainControl(uint8_t VOUTLevel);
static void PIN15_setOutputValue (uint32_t latch_num, uint32_t pin_num, bool highlow);
// Elite key detection & turn on/ shutdown function (peripheral hardware control)
static void Elite_led_color(uint16_t color);
static void ModeLED(uint16_t modeStatus);
//static void LED_color(uint8_t bright, uint8_t red, uint8_t green, uint8_t blue);
static bool If10Von = false;
static void TurnOn10V();
// periodic event control
static void EliteADCControl(void);
static void vscan_ctrl(void);
static void mode_done(void);
static void EliteADCControl();
//mode (Vset)
static void lsv_vscan(void);
@@ -606,21 +596,15 @@ static void cv_vscan(void);
static void cc_vscan(void);
//mode (DAC)
static void DACenable(uint8_t afterRead);
static void volt_out();
static void cv_volt_out(void);
static void lsv_volt_out(void);
static void ca_volt_out(void);
static void vscan_volt_out(void);
static void pulse_vscan(void);
//mode (notify)
static void initDATBuf();
//init parameter
static void InitEliteFlag();
#include "EliteInstruction.h"
#include "EliteADC.h"
#include "EliteInstruction.h"
#include "EliteDAC.h"
#include "EliteSPI.h"
#include "Elite_PIN.h"
@@ -638,16 +622,9 @@ static void InitEliteFlag();
#include "EliteLED.h"
#include "EliteKeyDetect.h"
#include "Elite_mode_ADC_DAC.h"
#include "EliteCCMode.h"
#include "EliteIVCurve.h"
#include "EliteCVCurve.h"
#include "EliteZTCurve.h"
#include "scan_volt.h"
#include "impedance_meter.h"
#include "Elite_version.h"
#include "EliteCV3Mode.h"
#include "EliteLSVMode.h"
#include "EliteCVSCANMode.h"
#include "ElitePulseMode.h"
#include "Elite_batt.h"
#include "Elite_power.h"
@@ -662,304 +639,47 @@ static void update_ZM_instruction(uint8 *ins) {
case INS_TYPE_RIS: {
switch (ins[2]) {
case CURVE_IV: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_IV;
instru.sampleRate = 15;
instru.Ve1 = ((uint16_t)(ins[3]) << 8) | (uint16_t)(ins[4]);
instru.Ve2 = ((uint16_t)(ins[5]) << 8) | (uint16_t)(ins[6]);
instru.Vinit = (int32_t)instru.Ve1;
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.notifyRate = (uint32_t)(ins[9]);
instru.notifyRate = OldStep2NewStepTime(instru.notifyRate); //5000;10000;20000;
instru.step = ((uint32_t)(ins[7]) << 8) | (uint32_t)(ins[8]);//1~1000 = 0.1mv ~ 100mv
instru.step = instru.step * 100000 / instru.notifyRate;
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.VoViSwitch = 0x01;
instru.cycleNumber = 1;
if((instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE)
&& (instru.Ve2 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve2 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE)){
instru.VoutGainLevel = VOUT_GAIN_15K;
} else {
instru.VoutGainLevel = VOUT_GAIN_240K;
}
break;
}
case CURVE_IV_CY: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_IV_CY;
instru.sampleRate = 15;
instru.Ve1 = ((uint16_t)(ins[3]) << 8) | (uint16_t)(ins[4]);
instru.Ve2 = ((uint16_t)(ins[5]) << 8) | (uint16_t)(ins[6]);
instru.Vinit = (int32_t)instru.Ve1;
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.notifyRate = (uint32_t)(ins[9]);
instru.notifyRate = OldStep2NewStepTime(instru.notifyRate); //5000;10000;20000;
instru.step = ((uint32_t)(ins[7]) << 8) | (uint32_t)(ins[8]);//1~1000 = 0.1mv ~ 100mv
instru.step = instru.step * 100000 / instru.notifyRate;
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.VoViSwitch = 0x01;
instru.cycleNumber = ((uint16_t)(ins[10]) << 8) | (uint16_t)(ins[11]);
if((instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE)
&& (instru.Ve2 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve2 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE)){
instru.VoutGainLevel = VOUT_GAIN_15K;
}else{
instru.VoutGainLevel = VOUT_GAIN_240K;
}
break;
}
case CURVE_VO: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_VO;
instru.Ve1 = ((uint16_t)ins[3] << 8) | (uint16_t)ins[4];
instru.Vinit = (int32_t)instru.Ve1;
if(instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE){
instru.VoutGainLevel = VOUT_GAIN_15K;
} else {
instru.VoutGainLevel = VOUT_GAIN_240K;
}
instru.notifyRate = 1000;
instru.sampleRate = 15;
instru.VoViSwitch = 0x01;
// TODO: input to json
instru.AutoGainEnable = 1;
instru.ADCGainLevel = I_GAIN_100R;
IinADCGainControl(instru.ADCGainLevel);
instru.VinAutoGainEnable = 1;
instru.VinADCGainLevel = VIN_GAIN_1K;
VinADCGainControl(instru.VinADCGainLevel);
// end
break;
}
case CURVE_RT: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_RT;
instru.notifyRate = (uint32_t)instru.sampleRate;
instru.sampleRate = 15;
instru.VsetRate = 2;
instru.Ve1 = 25000 + 5000;
instru.Vinit = (int32_t)instru.Ve1;
instru.VoViSwitch = 0x01;
// TODO: input to json
instru.AutoGainEnable = 1;
instru.ADCGainLevel = I_GAIN_100R;
IinADCGainControl(instru.ADCGainLevel);
instru.VinAutoGainEnable = 1;
instru.VinADCGainLevel = VIN_GAIN_1K;
VinADCGainControl(instru.VinADCGainLevel);
// end
if(instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE){
instru.VoutGainLevel = VOUT_GAIN_15K;
} else {
instru.VoutGainLevel = VOUT_GAIN_240K;
}
break;
}
case CURVE_VT: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_VT;
instru.notifyRate = (uint32_t)instru.sampleRate;
instru.sampleRate = 15;
instru.VoViSwitch = 0x01;
break;
}
case CURVE_IT: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_IT;
instru.notifyRate = (uint32_t)instru.sampleRate;
instru.sampleRate = 15;
instru.VoViSwitch = 0x01;
break;
}
case CURVE_CC: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_CC;
instru.sampleRate = 15;
instru.charge = ins[3]; //0:discharge 1:charge
instru.constantCurrent = (uint32_t)(ins[4]) << 24 | (uint32_t)(ins[5]) << 16 | (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
instru.Vmax = (uint32_t)(ins[8]) << 8 | (uint32_t)(ins[9]);
instru.Vmin = (uint32_t)(ins[10]) << 8 | (uint32_t)(ins[11]);
instru.notifyRate = 500;
instru.VoViSwitch = 0x01;
instru.VoutGainLevel = VOUT_GAIN_240K;
/*******************************************************
controller instruction
ins[3] -> Charge, 0:discharge 1:charge
ins[6:9] -> ConstantCurrent, 0 ~ 15000uA : 0 ~ 1500000
********************************************************/
break;
}
case CURVE_CV: {
if (ins[3] == PARA_1) {
instru.sampleRate = 15;
instru.Vinit = ((int32_t)(ins[4]) << 8) | (int32_t)(ins[5]);
instru.Ve1 = ((uint16_t)(ins[6]) << 8) | (uint16_t)(ins[7]);
instru.Ve2 = ((uint16_t)(ins[8]) << 8) | (uint16_t)(ins[9]);
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
if (instru.Vinit > instru.Ve1 || instru.Vinit == instru.Vmax){
instru.directionInit = 0;//0:reverse 1:forward
} else if (instru.Vinit <= instru.Ve1 || instru.Vinit == instru.Vmin){
instru.directionInit = 1;
}
} else if (ins[3] == PARA_2) {
ModeLED(WORKING);
instru.eliteFxn = CURVE_CV;
instru.Currentmax = (int32_t)(ins[10]) << 24 | (int32_t)(ins[11]) << 16 | (int32_t)(ins[12]) << 8 | (int32_t)(ins[13]);
instru.notifyRate = (uint32_t)(ins[8]) << 8 | (uint32_t)(ins[9]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)(ins[4]) << 24 | (uint32_t)(ins[5]) << 16 | (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.VoViSwitch = 0x01;
instru.cycleNumber = ((uint16_t)(ins[14]) << 8) | (uint16_t)(ins[15]);
instru.VoutGainLevel = VOUT_GAIN_240K;
}
break;
}
case CURVE_CV_HIGH_CY: {
if (ins[3] == PARA_1) {
instru.sampleRate = 15;
instru.Vinit = ((int32_t)(ins[4]) << 8) | (int32_t)(ins[5]);
instru.Ve1 = ((uint16_t)(ins[6]) << 8) | (uint16_t)(ins[7]);
instru.Ve2 = ((uint16_t)(ins[8]) << 8) | (uint16_t)(ins[9]);
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
if (instru.Vinit > instru.Ve1 || instru.Vinit == instru.Vmax){
instru.directionInit = 0;//0:reverse 1:forward
} else if (instru.Vinit <= instru.Ve1 || instru.Vinit == instru.Vmin){
instru.directionInit = 1;
}
} else if (ins[3] == PARA_2) {
ModeLED(WORKING);
instru.eliteFxn = CURVE_CV;
instru.Currentmax = (int32_t)(ins[10]) << 24 | (int32_t)(ins[11]) << 16 | (int32_t)(ins[12]) << 8 | (int32_t)(ins[13]);
instru.notifyRate = (uint32_t)(ins[8]) << 8 | (uint32_t)(ins[9]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)(ins[4]) << 24 | (uint32_t)(ins[5]) << 16 | (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.VoViSwitch = 0x01;
instru.cycleNumber = ((uint16_t)(ins[14]) << 8) | (uint16_t)(ins[15]);
instru.VoutGainLevel = VOUT_GAIN_240K;
}
break;
}
case CURVE_LSV: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_LSV;
instru.sampleRate = 15;
instru.Ve1 = ((uint16_t)(ins[3]) << 8) | (uint16_t)(ins[4]);
instru.Ve2 = ((uint16_t)(ins[5]) << 8) | (uint16_t)(ins[6]);
instru.Vinit = (int32_t)instru.Ve1;
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.Currentmax = (int32_t)(ins[13]) << 24 | (int32_t)(ins[14]) << 16 | (int32_t)(ins[15]) << 8 | (int32_t)(ins[16]);
instru.notifyRate = (uint32_t)(ins[11]) << 8 | (uint32_t)(ins[12]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)(ins[7]) << 24 | (uint32_t)(ins[8]) << 16 | (uint32_t)(ins[9]) << 8 | (uint32_t)(ins[10]);
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.VoViSwitch = 0x01;
instru.cycleNumber = 1;//ins[17];
instru.VoutGainLevel = VOUT_GAIN_240K;
break;
}
case CURVE_CA: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_CA;
instru.sampleRate = 15;
instru.Vinit = ((int32_t)(ins[3]) << 8) | (int32_t)(ins[4]);
instru.notifyRate = (uint32_t)(ins[5]) << 8 | (uint32_t)(ins[6]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.VsetRate = VsetRateTable[0];
instru.VoViSwitch = 0x01;
instru.VoutGainLevel = VOUT_GAIN_240K;
break;
}
case CURVE_CC_CY: {
break;
}
case SET_SAMPLE_RATE: {
instru.sampleRateIndex = ins[3];
instru.sampleRate = SampleRateTable[instru.sampleRateIndex];
instru.notifyRate = (uint32_t)(ins[3]) << 8 | (uint32_t)(ins[4]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
break;
}
case SET_ADC_DAC_GAIN: {
switch(ins[3]){
case IIN_ADC : {
instru.ADCGainLevel = ins[4];
if (instru.ADCGainLevel != I_GAIN_AUTO) {
instru.AutoGainEnable = 0;
case RIS_ADC_IIN : {
instru.IinADCGainLv = ins[4];
if (instru.IinADCGainLv != I_GAIN_AUTO) {
instru.IinADCAutoGainEn = 0;
} else {
instru.AutoGainEnable = 1;
instru.ADCGainLevel = I_GAIN_100R;
IinADCGainControl(instru.ADCGainLevel);
record_flag = false;
instru.IinADCAutoGainEn = 1;
instru.IinADCGainLv = I_GAIN_100R;
IinADCGainCtrl(instru.IinADCGainLv);
}
break;
}
case VIN_ADC : {
instru.VinADCGainLevel = ins[4];
if (instru.VinADCGainLevel != VIN_GAIN_AUTO) {
instru.VinAutoGainEnable = 0;
case RIS_ADC_VIN : {
instru.VinADCGainLv = ins[4];
if (instru.VinADCGainLv != VIN_GAIN_AUTO) {
instru.VinADCAutoGainEn = 0;
} else {
instru.VinAutoGainEnable = 1;
instru.VinADCGainLevel = VIN_GAIN_1K;
VinADCGainControl(instru.VinADCGainLevel);
record_flag = false;
instru.VinADCAutoGainEn = 1;
instru.VinADCGainLv = VIN_GAIN_1K;
VinADCGainCtrl(instru.VinADCGainLv);
}
break;
}
case VOUT_DAC : {
// instru.VoutGainLevel = ins[4];
// if(instru.VoutGainLevel == VOUT_GAIN_AUTO){
// instru.VoutGainLevel = VOUT_GAIN_15K;
case RIS_DAC_VOUT : {
// instru.VoutGainLv = ins[4];
// if(instru.VoutGainLv == VOUT_GAIN_AUTO){
// instru.VoutGainLv = VOUT_GAIN_15K;
// }
instru.VoutGainLevel = ins[4];
VoutGainControl(instru.VoutGainLevel);
instru.VoutGainLv = ins[4];
VoutGainControl(instru.VoutGainLv);
break;
}
case HIGH_Z : {
case RIS_HIGH_Z : {
switch(ins[4]) {
case 0x00 : {
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0 => open high_z mode
@@ -982,124 +702,28 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
case CURVE_CALI_ADCTEST: {
instru.eliteFxn = CURVE_CALI_ADCTEST;
// int32_t ADCRealValue = 0;
uint8_t CIS_buf[9] = {0};
uint16_t ADCValueAVG_RAW = 0;
uint8_t ADC_input = 0;
bool AVG_done = 0;
switch(ins[3]) {
case IIN_ADC :{ // 0x00
IinADCGainControl(ins[4]);
AVG_done = 1;
ADC_input = CMD_CURRENT_MEASURE;
break;
}
case VIN_ADC :{ // 0x01
VinADCGainControl(ins[4]);
AVG_done = 1;
ADC_input = CMD_VOLT_MEASURE;
break;
}
case VOUT_DAC :{ // 0x02
VoutGainControl(ins[4]);
AVG_done = 0;
break;
}
case HIGH_Z :{ // 0x03
switch(ins[4]) {
case 0x00 :{
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0 => open high_z mode
break;
}
case 0x01 :{
PIN15_setOutputValue(HIGH_Z_MODE, 1); // 1 => close high_z mode
break;
}
default :{
break;
}
}
AVG_done = 0;
break;
}
default :{
AVG_done = 0;
break;
}
}
if (AVG_done) {
CPUdelay(100);
ADCValueAVG_RAW = ADC_CURRENT_AVG_calibration(ADC_input);
} else {
AVG_done = 0;
for (int i = 1; i < 9; i++) {
CIS_buf[i + 1] = 0x00;
}
}
CIS_buf[0] = chip_ID;
CIS_buf[1] = (uint8_t) ((ADCValueAVG_RAW & 0xFF00) >> 8);
CIS_buf[2] = (uint8_t) (ADCValueAVG_RAW & 0x00FF);
CIS_buf[3] = spi_ADC_rxbuf[2];
CIS_buf[4] = spi_ADC_rxbuf[3];
// decode ADC measure value
// ADCRealValue = DecodeADCValue(ins[4], ins[3], spi_ADC_rxbuf);
// test ADC output through CIS
// if (ins[3] == ADC_CH_VOLT) {
// // return ADC volt measure
// CIS_buf[5] = (uint8_t)(ADCRealValue >> 24);
// CIS_buf[6] = (uint8_t)((ADCRealValue & 0x00FF0000) >> 16);
// CIS_buf[7] = (uint8_t)((ADCRealValue & 0x0000FF00) >> 8);
// CIS_buf[8] = (uint8_t)(ADCRealValue & 0x000000FF);
// } else if (ins[3] == ADC_CH_CURRENT) {
// // return ADC current measure
// CIS_buf[5] = (uint8_t)(ADCRealValue >> 24);
// CIS_buf[6] = (uint8_t)((ADCRealValue & 0x00FF0000) >> 16);
// CIS_buf[7] = (uint8_t)((ADCRealValue & 0x0000FF00) >> 8);
// CIS_buf[8] = (uint8_t)(ADCRealValue & 0x000000FF);
// } else {
// // CIS = 0xFF...FF using as an error report
// for (int i = 1; i < 9; i++) {
// CIS_buf[i + 1] = 0xFF;
// }
// }
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, 9, CIS_buf);
break;
}
case CURVE_CALI_DAC: {
ModeLED(WORKING);
instru.eliteFxn = CURVE_CALI_DAC;
PIN15_setOutputValue(HIGH_Z_MODE, 1); // 1 => close high_z mode
instru.VoltConstant = ( ((uint16_t)(ins[3])) << 8) | (uint16_t)(ins[4]);
break;
}
case CURVE_CALI_ADC: {
switch(ins[3]) {
case IIN_ADC : { // 0x00
case RIS_ADC_IIN : { // 0x00
instru.eliteFxn = CURVE_CALI_ADC;
instru.AdcChannel = IIN_ADC;
instru.AdcChannel = RIS_ADC_IIN;
instru.notifyRate = 1000;
instru.sampleRate = 15;
instru.VoViSwitch = 0x01;
ModeLED(WORKING);
break;
}
case VIN_ADC : { // 0x01
case RIS_ADC_VIN : { // 0x01
instru.eliteFxn = CURVE_CALI_ADC;
instru.AdcChannel = VIN_ADC;
instru.AdcChannel = RIS_ADC_VIN;
instru.notifyRate = 1000;
instru.sampleRate = 15;
instru.VoViSwitch = 0x01;
ModeLED(WORKING);
break;
}
case RIS_DAC_VOUT : { // 0x02
instru.eliteFxn = CURVE_CALI_ADC;
instru.AdcChannel = RIS_DAC_VOUT;
instru.notifyRate = 1000;
instru.VoltConstant = ( ((uint16_t)(ins[4])) << 8) | (uint16_t)(ins[5]); // output voltage
DAC_outputV(instru.VoltConstant); //UserCode -> DAC code -> DAC out
ModeLED(WORKING);
break;
}
@@ -1110,79 +734,58 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
case CURVE_PULSE: {
instru.VoutGainLevel = VOUT_GAIN_240K;
instru.sampleRate = 15;
instru.notifyRate = 100;
instru.VoViSwitch = 0x01;
if (ins[3] == PARA_1) {
instru.sti_t1 = (int32_t)(ins[4]) << 24 | (int32_t)(ins[5]) << 16 | (int32_t)(ins[6]) << 8 | (int32_t)(ins[7]);
instru.sti_t2 = (int32_t)(ins[8]) << 24 | (int32_t)(ins[9]) << 16 | (int32_t)(ins[10]) << 8 | (int32_t)(ins[11]);
instru.sti_t3 = (int32_t)(ins[12]) << 24 | (int32_t)(ins[13]) << 16 | (int32_t)(ins[14]) << 8 | (int32_t)(ins[15]);
instru.sti_t4 = (int32_t)(ins[16]) << 24 | (int32_t)(ins[17]) << 16 | (int32_t)(ins[18]) << 8 | (int32_t)(ins[19]);
} else if (ins[3] == PARA_2) {
instru.sti_t5 = (int32_t)(ins[4]) << 24 | (int32_t)(ins[5]) << 16 | (int32_t)(ins[6]) << 8 | (int32_t)(ins[7]);
instru.sti_v1 = 25000; //8~11
instru.sti_v2 = 50000; //12~15 //41406.43161.
instru.sti_v3 = 25000; //16~19
} else if (ins[3] == PARA_3) {
instru.sti_v4 = 25000; //4~7
instru.sti_v5 = 25000; //8~11
instru.sti_cy = (uint16_t)(ins[12]); //12
instru.sti_loop = (uint16_t)(ins[13]); //13
} else if (ins[3] == PARA_4) {
instru.sti_t6 = (int32_t)(ins[4]) << 24 | (int32_t)(ins[5]) << 16 | (int32_t)(ins[6]) << 8 | (int32_t)(ins[7]); //4~7
instru.sti_t7 = (int32_t)(ins[8]) << 24 | (int32_t)(ins[9]) << 16 | (int32_t)(ins[10]) << 8 | (int32_t)(ins[11]); //8~11
instru.sti_v6 = 25000; //12~15
instru.sti_v7 = 25000;; //16~19
instru.sti_t1 = VALUE_ZERO_TO_ONE(instru.sti_t1);
instru.sti_t2 = VALUE_ZERO_TO_ONE(instru.sti_t2);
instru.sti_t3 = VALUE_ZERO_TO_ONE(instru.sti_t3);
instru.sti_t4 = VALUE_ZERO_TO_ONE(instru.sti_t4);
instru.sti_t5 = VALUE_ZERO_TO_ONE(instru.sti_t5);
instru.sti_t6 = VALUE_ZERO_TO_ONE(instru.sti_t6);
instru.sti_t7 = VALUE_ZERO_TO_ONE(instru.sti_t7);
megaStiEnable = true;
} else if (ins[3] == PARA_17) {
instru.eliteFxn = CURVE_PULSE;
ModeLED(WORKING);
}
break;
}
case 0xFF: { // 0x3000FF
switch (ins[3]) {
case 0x01: {
headstage_battery_volt();
case VERSION_DEV_TEST: {
initCISBuf();
cis_buf[0] = 0xFF;
cis_buf[1] = NotifyVoltBat[0];
cis_buf[2] = NotifyVoltBat[1];
cis_buf[3] = NotifyVoltBat[2];
cis_buf[4] = NotifyVoltBat[3];
cis_buf[5] = 0x00;
cis_buf[0] = 6; //data len
cis_buf[1] = VERSION_DEV_TEST;
cis_buf[2] = VERSION_DATE_YEAR;
cis_buf[3] = VERSION_DATE_MONTH;
cis_buf[4] = VERSION_DATE_DAY;
cis_buf[5] = VERSION_DATE_HOUR;
cis_buf[6] = VERSION_DATE_MINUTE;
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
break;
}
case 0x02: {
instru.VinADCGainLevel = ins[4]; //0:VIN_GAIN_1M, 1:VIN_GAIN_30K, 2:VIN_GAIN_1K, 3:VIN_GAIN_AUTO
if (instru.VinADCGainLevel != VIN_GAIN_AUTO) {
instru.VinAutoGainEnable = 0;
VinADCGainControl(instru.VinADCGainLevel);
record_flag = false;
} else {
instru.VinAutoGainEnable = 1;
instru.VinADCGainLevel = VIN_GAIN_1K;
VinADCGainControl(instru.VinADCGainLevel);
record_flag = false;
}
break;
case BAT_DEV_TEST: {
headstage_battery_volt();
initCISBuf();
cis_buf[0] = 6; //data len
cis_buf[1] = BAT_DEV_TEST;
cis_buf[2] = NotifyVoltBat[0];
cis_buf[3] = NotifyVoltBat[1];
cis_buf[4] = NotifyVoltBat[2];
cis_buf[5] = NotifyVoltBat[3];
cis_buf[6] = 0x00;
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
break;
}
case TEMP_DEV_TEST: {
initCISBuf();
cis_buf[0] = 5; //data len
cis_buf[1] = TEMP_DEV_TEST;
cis_buf[2] = NotifyTemperature[0];
cis_buf[3] = NotifyTemperature[1];
cis_buf[4] = NotifyTemperature[2];
cis_buf[5] = NotifyTemperature[3];
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
break;
}
case LED_DEV_TEST: {
if (ins[4] == 0) {
Elite_led_color(ins[5]);
} else if (ins[4] == 1) {
LED_color(LIGHTLED, ins[5], ins[6], ins[7]);
} else if (ins[4] == 2) {
LED_color(DARKLED, ins[5], ins[6], ins[7]);
}
break;
}
}
break;
}
@@ -1205,6 +808,7 @@ static void update_ZM_instruction(uint8 *ins) {
}
case VIS_ASK: {
not_buf[0] = BLE_DAT_BUFF_SIZE - 1; //data len
for (int i = 0; i < BLE_DAT_BUFF_SIZE; i++) {
not_buf[i] = i;
}
@@ -1219,6 +823,7 @@ static void update_ZM_instruction(uint8 *ins) {
PeriodicEvent = true;
InitPeriodicEvent = true; // need to create a WorkModeData?
mode_init = true;
InitGPT();
break;
}
@@ -1237,16 +842,6 @@ static void update_ZM_instruction(uint8 *ins) {
case VIS_DEVICE_SHINY: {
Elite_led_color(COLOR_PURPLE);
// uint8_t deviceShinySwitch = (ins[2] & 0b11110000) >> 4;//1:open 0:close
// if(deviceShinySwitch == 1){
// Elite_led_color(COLOR_PURPLE);
// }else if(deviceShinySwitch == 0){
// if(PeriodicEvent){
// WORKLED();
// }else if(!PeriodicEvent){
// LEDPowerON();
// }
// }
break;
}
@@ -1259,20 +854,6 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
case VIS_CC_ZERO: {
ModeLED(PRE_WORK);
instru.eliteFxn = CURVE_CC;
instru.sampleRate = 15;
instru.charge = 0x01;
instru.constantCurrent = 0x00;
instru.Vmax = 0xC350;
instru.Vmin = 0x0000;
instru.notifyRate = 500;
instru.VoViSwitch = 0x02;//read Vscan = Vout - Vin
instru.VoutGainLevel = VOUT_GAIN_240K;
break;
}
default: {
break;
}
@@ -1289,32 +870,38 @@ static void update_ZM_instruction(uint8 *ins) {
case CIS_VERSION: {
initCISBuf();
cis_buf[0] = VERSION_DATE_YEAR;
cis_buf[1] = VERSION_DATE_MONTH;
cis_buf[2] = VERSION_DATE_DAY;
cis_buf[3] = VERSION_DATE_HOUR;
cis_buf[4] = VERSION_DATE_MINUTE;
cis_buf[0] = 6; //data len
cis_buf[1] = CIS_VERSION;
cis_buf[2] = VERSION_DATE_YEAR;
cis_buf[3] = VERSION_DATE_MONTH;
cis_buf[4] = VERSION_DATE_DAY;
cis_buf[5] = VERSION_DATE_HOUR;
cis_buf[6] = VERSION_DATE_MINUTE;
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
break;
}
case CIS_VOLT: {
initCISBuf();
cis_buf[0] = CIS_VOLT;
cis_buf[1] = NotifyVoltBat[3];
cis_buf[2] = NotifyVoltBat[2];
cis_buf[0] = 3; //data len
cis_buf[1] = CIS_VOLT;
cis_buf[2] = NotifyVoltBat[3];
cis_buf[3] = NotifyVoltBat[2];
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
break;
}
case CIS_LED_TEST: { //0x7070
if (ins[2] == 0) {
Elite_led_color(ins[3]);
} else if (ins[2] == 1) {
LED_color(LIGHTLED, ins[3], ins[4], ins[5]);
} else if (ins[2] == 2) {
LED_color(DARKLED, ins[3], ins[4], ins[5]);
}
case CIS_TEMPERATURE: { //0x7080
initCISBuf();
cis_buf[0] = 5; //data len
cis_buf[1] = CIS_TEMPERATURE;
cis_buf[2] = NotifyTemperature[0];
cis_buf[3] = NotifyTemperature[1];
cis_buf[4] = NotifyTemperature[2];
cis_buf[5] = NotifyTemperature[3];
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, BLE_CIS_BUFF_SIZE, cis_buf);
break;
}
}
@@ -1345,101 +932,6 @@ static void ZM_instruction_update_handle(uint8_t characteristic) {
}
}
// static void update_clock_period() {
// uint32_t clock_rate = instru.adc_clock_rate;
//
// headstage_gptimer_set_frequency(clock_rate);
//}
/*======================
==== main function ====
======================*/
// static void headstage_instruction_update_handle(uint8_t characteristic) {
// switch (characteristic) {
// case BLE_INS_BUFF_CHAR:
// SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR3, ins_buf);
// update_instruction(ins_buf);
// update_clock_period();
// update_ins_buffer();
//
// break;
// }
//}
/*===================================
==== system function implements ====
==================================*/
/* gptimer */
/*
static void headstage_gptimer_init() {
GPTimerCC26XX_Params params;
GPTimerCC26XX_Params_init(&params);
params.width = GPT_CONFIG_16BIT;
params.mode = GPT_MODE_PERIODIC_DOWN;
params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
hTimer = GPTimerCC26XX_open(Board_GPTIMER0A, &params);
GPTimerCC26XX_setLoadValue(hTimer, 0xFFFFFF);
GPTimerCC26XX_registerInterrupt(hTimer, headstage_gptimer_callback, GPT_INT_TIMEOUT);
GPTimerCC26XX_start(hTimer);
}
static void headstage_gptimer_main_handle() {
if (events & GPTIMER_PERIODIC_EVT) {
events &= ~GPTIMER_PERIODIC_EVT;
// headstage_periodic_handle();
}
}
static void headstage_gptimer_set_frequency(uint32_t frequency) {
Types_FreqHz freq;
BIOS_getCpuFreq(&freq);
GPTimerCC26XX_Value loadVal = freq.lo / frequency - 1; // 4799 100us execute this value
if (loadVal < 0xFFFF) {
GPTimerCC26XX_setLoadValue(hTimer, loadVal);
} else {
loadVal = (0xFA0000 | (loadVal / 250)) - 1;
GPTimerCC26XX_setLoadValue(hTimer, loadVal);
}
}
static void headstage_gptimer_callback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask) {
// interrupt callback code goes here. Minimize processing in interrupt.
events |= GPTIMER_PERIODIC_EVT;
Semaphore_post(semaphore);
}
*/
// static void headstage_spi_transaction(uint8_t length, uint8_t *spi_txbuf, uint8_t *spi_rxbuf) {
// transaction.count = length;
// transaction.txBuf = spi_txbuf;
// transaction.rxBuf = spi_rxbuf;
//
// SPI_transfer(spiHandle, &transaction);
//}
/*=======================================
==== headstage specific declaration ====
======================================*/
/*========================
p information ====
=======================*/
#ifndef DEVICE_NAME
#error "DEVICE_NAME not defined"
#endif
@@ -30,6 +30,12 @@
#define SPI_BUFFER_SIZE 16
/**
* the pointer to point which channel is used currently.
* -1 for not beginning.
*/
static int8 channel_pointer = -1;
static uint8_t spi_txbuf[SPI_BUFFER_SIZE] = {0};
static uint8_t spi_rxbuf[SPI_BUFFER_SIZE] = {0};
@@ -56,13 +56,13 @@ static void ZM_init() {
InitEliteInstruction();
// init DAC, set output ~= 0 V
instru.VoutGainLevel = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLevel);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLevel, 25000));
instru.VoutGainLv = VOUT_GAIN_15K;
VoutGainControl(instru.VoutGainLv);
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLv, 25000));
/* when elite open, must change vin level,
measure battery value will be right */
VinADCGainControl(VIN_GAIN_AUTO);
VinADCGainCtrl(VIN_GAIN_AUTO);
elite_gptimer_open();
elite_gptimer_start();
@@ -73,37 +73,130 @@ static void ZM_init() {
static void ZM_update_instruction_callback(uint8_t ins_type, uint8_t chip_ID, uint8_t *ins) {}
static void DACCode2Real2Notify(uint16_t DACcode) {
int32_t RealV;
RealV = DAC_to_realV(instru.VoutGainLevel, DACcode);
NotifyVolt[0] = (uint8_t)((RealV & 0xFF000000) >> 24);
NotifyVolt[1] = (uint8_t)((RealV & 0x00FF0000) >> 16);
NotifyVolt[2] = (uint8_t)((RealV & 0x0000FF00) >> 8);
NotifyVolt[3] = (uint8_t)(RealV & 0x000000FF);
}
#define IsPeriodicMode() ( \
(instru.eliteFxn == CURVE_IV) || \
(instru.eliteFxn == CURVE_IV_CY) || \
(instru.eliteFxn == CURVE_IT) || \
(instru.eliteFxn == CURVE_VT) || \
(instru.eliteFxn == CURVE_RT) || \
(instru.eliteFxn == CURVE_CC) || \
(instru.eliteFxn == CURVE_CV) || \
(instru.eliteFxn == CURVE_LSV) || \
(instru.eliteFxn == CURVE_CA) || \
(instru.eliteFxn == CURVE_VO) || \
#define IsPeriodicMode() ( \
(instru.eliteFxn == CURVE_CALI_ADC) \
)
#define Ve1MatchVe2Mode() ( \
(instru.eliteFxn == CURVE_IV) || \
(instru.eliteFxn == CURVE_IV_CY) || \
(instru.eliteFxn == CURVE_CV) || \
(instru.eliteFxn == CURVE_LSV) \
)
static void peri_mode(void)
{
GPT.LeadTimeCounter = GPT.LeadTimeCounter + GPT.DeltaGptimerCounter;
if (leadTimeReset && GPT.LeadTimeCounter <= 2000) {
vscanReset = true;
if (first_highz_flag && GPT.LeadTimeCounter >= 1000) {
PIN15_setOutputValue(HIGH_Z_MODE, 1); // HIGH Z MODE // 1: close; 0: open;
first_highz_flag = false;
}
} else {
if (notifyFirst_flag) {
GPT.NotifyCounter = instru.notifyRate - 20;
notifyFirst_flag = false;
}
vscanReset = false;
leadTimeReset = false;
}
//vscan counter
GPT.VscanRateCounter = GPT.VscanRateCounter + GPT.DeltaGptimerCounter;
if (GPT.VscanRateCounter >= instru.VsetRate) {
if (GPT.VscanRateCounter >= instru.VsetRate * 2) {
GPT.GptimerMultiple = GPT.VscanRateCounter / instru.VsetRate;
} else {
GPT.GptimerMultiple = 1;
}
GPT.VscanRateCounter -= instru.VsetRate * GPT.GptimerMultiple; //To get right time
}
//battery counter
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.DeltaGptimerCounter;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.DeltaGptimerCounter;
if(GPT.BatteryCheckCounter >= 50000){
GPT.BatteryCheckCounter -= 50000; //To get right time
batteryCheck_flag = true;
tempCheck_flag = true;
}
uint16_t bat = ((uint16_t)(NotifyVoltBat[2]) << 8 & 0xFF00 ) | ((uint16_t)(NotifyVoltBat[3]) & 0x00FF);
if( bat < 768 && bat > 20){
// PIN15_setOutputValue(enable_5v, 0);
}
//ADC counter
GPT.SampleRateCounter = GPT.SampleRateCounter + GPT.DeltaGptimerCounter;
if(GPT.SampleRateCounter >= instru.sampleRate){
GPT.SampleRateCounter = 0; //To get right data, ADC must be delay 1.5ms
EliteADCControl();
}
// Over temperature protection
uint16_t CC2650temp = ((uint16_t)(NotifyTemperature[2]) << 8 & 0xFF00 ) | ((uint16_t)(NotifyTemperature[3]) & 0x00FF);
if(CC2650temp > 40) {
PIN15_setOutputValue(enable_5v, 0);
}
//Notify counter(Notify control, check if we need to send notify)
//please don't put Notify counter before ADC counter, maybe get wrong data
GPT.NotifyCounter = GPT.NotifyCounter + GPT.DeltaGptimerCounter;
if(GPT.NotifyCounter >= instru.notifyRate){
GPT.NotifyCounter -= instru.notifyRate; //To get right time
notify_flag = true;
if(vscanReset){
notify_flag = false;
}
if (!volt_rec_en || !curr_rec_en) {
notify_flag = false;
}
if(notify_flag){
SendNotify();
notify_flag = false;
}
}
}
static void mode_init_set(void)
{
batteryADC_flag = false;
volt_rec_en = true;
curr_rec_en = true;
firstTimeReset = true;
notifyFirst_flag = true;
first_highz_flag = true;
DACReset = true;
vscanReset = true;
leadTimeReset = true;
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
// gain_switch_on: [1:4]: none
// [5]: ADC gain level = 4, if value = 1, gain 4 switch on
// [6]: ADC gain level = 3, if value = 1, gain 3 switch on
// [7]: ADC gain level = 2, if value = 1, gain 2 switch on
// [8]: ADC gain level = 1, if value = 1, gain 1 switch on
instru.gain_switch_on = 0b11110000;
} else {
// fast notify rate, >= 10sps, auto gain changer only use ADC gain level = 1.2.3
instru.gain_switch_on = 0b01110000;
}
if (instru.IinADCGainLv == I_GAIN_AUTO) {
instru.IinADCGainLv = I_GAIN_100R;
}
if (instru.VinADCAutoGainEn == VIN_GAIN_AUTO) {
instru.VinADCGainLv = VIN_GAIN_1K;
}
VinADCGainCtrl(instru.VinADCGainLv);
IinADCGainCtrl(instru.IinADCGainLv);
VoutGainControl(instru.VoutGainLv);
return;
}
/*********************************************************************
* @fn SimpleBLEPeripheral_performPeriodicTask
@@ -114,278 +207,63 @@ static void DACCode2Real2Notify(uint16_t DACcode) {
*
* @return None.
*/
static void SimpleBLEPeripheral_performPeriodicTask(void) {
static void SimpleBLEPeripheral_performPeriodicTask(void)
{
GPT.DeltaGptimerCounter = GPT.GptimerCounter - GPT.GptimerCounter0;
GPT.GptimerCounter0 = GPT.GptimerCounter;
if (IsPeriodicMode()) {
/** Periodic Event **/
// Default working flow is vscan -> ADC read -> send notify
// We will need a flag to control vscan, ADC and notify
static bool first_highz_flag = false;
GPT.DeltaGptimerCounter = GPT.GptimerCounter - GPT.GptimerCounter0;
GPT.GptimerCounter0 = GPT.GptimerCounter;
if (mode_init) {
GPT.SampleRateCounter = instru.sampleRate - 10;
GPT.VscanRateCounter = instru.VsetRate - 1;
mode_init = false;
batteryADC_flag = false;
record_flag = true;
firstTimeReset = true;
notifyFirst_flag = true;
first_highz_flag = true;
I_GAIN_100R_counter = 0;
I_GAIN_3K_counter = 0;
I_GAIN_100K_counter = 0;
I_GAIN_3M_counter = 0;
VIN_GAIN_1M_counter = 0;
VIN_GAIN_30K_counter = 0;
VIN_GAIN_1K_counter = 0;
VOUT_GAIN_240K_counter = 0;
VOUT_GAIN_15K_counter = 0;
DACReset = true;
vscanReset = true;
leadTimeReset = true;
VinADCGainControl(instru.VinADCGainLevel);
IinADCGainControl(instru.ADCGainLevel);
VoutGainControl(instru.VoutGainLevel);
if (Ve1MatchVe2Mode()) {
if (instru.Ve1 == instru.Ve2) {
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLevel, instru.Ve1));
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
}
mode_init_set();
}
GPT.LeadTimeCounter = GPT.LeadTimeCounter + GPT.DeltaGptimerCounter;
if (leadTimeReset && GPT.LeadTimeCounter <= 2000) {
vscanReset = true;
if (first_highz_flag && GPT.LeadTimeCounter >= 1000) {
PIN15_setOutputValue(HIGH_Z_MODE, 1); // HIGH Z MODE // 1: close; 0: open;
first_highz_flag = false;
}
} else {
if (notifyFirst_flag) {
GPT.NotifyCounter = instru.notifyRate - 20;
notifyFirst_flag = false;
}
vscanReset = false;
leadTimeReset = false;
}
peri_mode();
//vscan counter
GPT.VscanRateCounter = GPT.VscanRateCounter + GPT.DeltaGptimerCounter;
if (GPT.VscanRateCounter >= instru.VsetRate) {
if (GPT.VscanRateCounter >= instru.VsetRate * 2) {
GPT.GptimerMultiple = GPT.VscanRateCounter / instru.VsetRate;
} else {
GPT.GptimerMultiple = 1;
}
GPT.VscanRateCounter -= instru.VsetRate * GPT.GptimerMultiple; //To get right time
vscan_flag = true;
if (vscan_flag) {
vscan_ctrl();
vscan_flag = false;
}
}
//battery counter
// GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.DeltaGptimerCounter;
// GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.DeltaGptimerCounter;
// if(GPT.BatteryCheckCounter >= 50000){
// GPT.BatteryCheckCounter -= 50000; //To get right time
// batteryCheck_flag = true;
// }
//
// uint16_t bat = ((uint16_t)(NotifyVoltBat[2]) << 8 & 0xFF00 ) | ((uint16_t)(NotifyVoltBat[3]) & 0x00FF);
// if( bat < 768 && bat > 20){
// PIN15_setOutputValue(enable_5v, 0);
// }
//ADC counter
GPT.SampleRateCounter = GPT.SampleRateCounter + GPT.DeltaGptimerCounter;
if(GPT.SampleRateCounter >= instru.sampleRate){
GPT.SampleRateCounter = 0; //To get right data, ADC must be delay 1.5ms
ADC_flag = true;
if(ADC_flag){
EliteADCControl();
ADC_flag = false;
}
}
//Notify counter(Notify control, check if we need to send notify)
//please don't put Notify counter before ADC counter, maybe get wrong data
GPT.NotifyCounter = GPT.NotifyCounter + GPT.DeltaGptimerCounter;
if(GPT.NotifyCounter >= instru.notifyRate){
GPT.NotifyCounter -= instru.notifyRate; //To get right time
notify_flag = true;
if(vscanReset){
notify_flag = false;
}
if(notify_flag){
SendNotify();
notify_flag = false;
}
}
mode_done();
return;
}
else if (instru.eliteFxn == CURVE_PULSE) {
/** Periodic Event **/
// Default working flow is vscan -> ADC read -> send notify
// We will need a flag to control vscan, ADC and notify
GPT.DeltaGptimerCounter = GPT.GptimerCounter - GPT.GptimerCounter0;
GPT.GptimerCounter0 = GPT.GptimerCounter;
if(mode_init){
GPT.SampleRateCounter = instru.sampleRate - 10;
GPT.VscanRateCounter = instru.VsetRate - 1;
mode_init = false;
batteryADC_flag = false;
record_flag = true;
firstTimeReset = true;
notifyFirst_flag = true;
//pulsemode variable
stiFirstTime = true;
VinADCGainControl(instru.VinADCGainLevel);
IinADCGainControl(instru.ADCGainLevel);
VoutGainControl(instru.VoutGainLevel);
if (Ve1MatchVe2Mode()) {
if (instru.Ve1 == instru.Ve2) {
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLevel, instru.Ve1));
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
} else if (instru.eliteFxn == CURVE_PULSE) {
if(!megaStiEnable){
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
}
}
GPT.LeadTimeCounter = GPT.LeadTimeCounter + GPT.DeltaGptimerCounter;
if(leadTimeReset && GPT.LeadTimeCounter <= 2000){
vscanReset = true;
}else{
if(notifyFirst_flag){
GPT.NotifyCounter = instru.notifyRate - 20;
notifyFirst_flag = false;
}
vscanReset = false;
leadTimeReset = false;
}
//vscan counter
GPT.VscanRateCounter = GPT.VscanRateCounter + GPT.DeltaGptimerCounter;
//pulse mode counter
GPT.StiCounter = GPT.StiCounter + GPT.DeltaGptimerCounter;
if (vscanReset) {
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLevel, 25000));
DAC_outputV(Usercode_Correction_to_DAC(instru.VoutGainLevel, 25000));
//vscanReset = false;
}else{
if (megaStiEnable) {
pulse_vscan();
}
}
// if(GPT.VscanRateCounter >= instru.VsetRate){
// if(GPT.VscanRateCounter >= instru.VsetRate * 2){
// GPT.GptimerMultiple = GPT.VscanRateCounter / instru.VsetRate;
// }else{
// GPT.GptimerMultiple = 1;
// }
// GPT.VscanRateCounter -= instru.VsetRate * GPT.GptimerMultiple; //To get right time
// vscan_flag = true;
// if(vscan_flag){
// vscan_ctrl();
// vscan_flag = false;
// }
// }
//battery counter
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.DeltaGptimerCounter;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.DeltaGptimerCounter;
if(GPT.BatteryCheckCounter >= 50000){
GPT.BatteryCheckCounter -= 50000; //To get right time
batteryCheck_flag = true;
}
uint16_t bat = ((uint16_t)(NotifyVoltBat[2]) << 8 & 0xFF00 ) | ((uint16_t)(NotifyVoltBat[3]) & 0x00FF);
if( bat < 768 && bat > 20){
PIN15_setOutputValue(enable_5v, 0);
}
//ADC counter
GPT.SampleRateCounter = GPT.SampleRateCounter + GPT.DeltaGptimerCounter;
if(GPT.SampleRateCounter >= instru.sampleRate){
GPT.SampleRateCounter = 0; //To get right data, ADC must be delay 1.5ms
ADC_flag = true;
if(ADC_flag){
EliteADCControl();
ADC_flag = false;
}
}
//Notify counter(Notify control, check if we need to send notify)
//please don't put Notify counter before ADC counter, maybe get wrong data
GPT.NotifyCounter = GPT.NotifyCounter + GPT.DeltaGptimerCounter;
if(GPT.NotifyCounter >= instru.notifyRate){
GPT.NotifyCounter -= instru.notifyRate; //To get right time
notify_flag = true;
if(vscanReset){
notify_flag = false;
}
if(notify_flag){
SendNotify();
notify_flag = false;
}
}
mode_done();
}
else if (instru.eliteFxn == CURVE_CALI_DAC) {
DAC_outputV(instru.VoltConstant); //UserCode -> DAC code -> DAC out
wm_deinit();
PeriodicEvent = false;
} else {
}
return;
}
static void EliteADCControl(void)
/*
* EliteADCControl(): use ADC plot, and send what data to controller
* +-----------------+-----------+-----------+-----------+
* | MODE | ch1 | ch2 | ch3 |
* +-----------------+-----------+-----------+-----------+
* | CURVE_IV | Iin | Vout | Vin |
* | CURVE_IV_CY | Iin | Vout | Vin |
* | CURVE_VO | Iin | Vout | Vin |
* | CURVE_RT | Iin | Vout | R |
* | CURVE_VT | Iin | Vin | |
* | CURVE_IT | Iin | Vin | Vout |
* | CURVE_CC | Iin | Vin | Vout |
* | CURVE_CV | Iin | Vout-Vin | Vout |
* | CURVE_LSV | Iin | Vout-Vin | Vout |
* | CURVE_CA | Iin | Vout-Vin | Vout |
* | CURVE_OCP | Iin | Vmon-Vin | Vin |
* | CURVE_UNI_PULSE | pul1_Iin | pul2_Iin | |
* +-----------------+-----------+-----------+-----------+
*/
static void EliteADCControl()
{
void *wm = wm_get();
switch (instru.eliteFxn) {
case CURVE_IV:
case CURVE_RT:
case CURVE_CC:
case CURVE_CV:
case CURVE_CA:
case CURVE_VO:
case CURVE_LSV:
case CURVE_IV_CY:
case CURVE_PULSE:
CC_Plot();
break;
case CURVE_IT:
IT_Plot();
break;
case CURVE_VT:
VT_Plot();
break;
case CURVE_CALI_ADC:
if (instru.AdcChannel == IIN_ADC) cali_IT_plot();
else if (instru.AdcChannel == VIN_ADC) cali_VT_plot();
if (instru.AdcChannel == RIS_ADC_IIN) {
cali_IT_plot();
} else if (instru.AdcChannel == RIS_ADC_VIN) {
cali_VT_plot();
} else if (instru.AdcChannel == RIS_DAC_VOUT) {
cali_Vout_plot();
}
break;
default:
@@ -393,94 +271,4 @@ static void EliteADCControl(void)
}
}
static void mode_done(void)
{
if ((instru.eliteFxn == CURVE_IV) ||
(instru.eliteFxn == CURVE_CV) ||
(instru.eliteFxn == CURVE_LSV) ||
(instru.eliteFxn == CURVE_IV_CY)) {
if (!PeriodicEvent) {
SendNotify();
Eliteinterrupt();
}
}
}
static void vscan_ctrl(void)
{
switch (instru.eliteFxn) {
case CURVE_IV:
iv_vscan();
break;
case CURVE_IV_CY:
iv_cy_vscan();
break;
case CURVE_VO:
vo_vscan();
break;
case CURVE_RT:
rt_vscan();
break;
case CURVE_CV:
cv_vscan();
break;
case CURVE_LSV:
lsv_vscan();
break;
case CURVE_CA:
ca_vscan();
break;
default:{
break;
}
}
}
static uint32_t OldStep2NewStepTime(uint32_t StepTime){
uint8_t StepTimeLevel = 0;
StepTimeLevel = StepTime / 0x12;
switch (StepTimeLevel) {
case 0: { //0.5 sec
return STEPTIME_HALF_SEC;
}
case 1: { //1 sec
return STEPTIME_ONE_SEC;
}
case 2: { //2 sec
return STEPTIME_TWO_SEC;
}
default: { //1 sec
return STEPTIME_ONE_SEC;
}
}
}
static void step2VsetRate(uint32_t step){
/*step = 100 mv, index = 0, n = 2
10 mv, index = 1, n = 10
1 mv, index = 2, n = 100
0.1 mv, index = 3, n = 1000
0.01mv, index = 4, n = 10000 */
if(step >= 10000){
instru.VsetRateIndex = 0;
}else if (step >= 1000){
instru.VsetRateIndex = 1;
}else if (step >= 100){
instru.VsetRateIndex = 2;
}else if (step >= 10){
instru.VsetRateIndex = 3;
}else if (step >= 1){
instru.VsetRateIndex = 4;
}
}
#endif /* IMPEDANCE_METER_H_ */
@@ -0,0 +1,852 @@
#ifndef SCAN_VOLT_H
#define SCAN_VOLT_H
#ifdef __cplusplus
extern "C" {
#endif
#define Vset instru.Vset
static void iv_vscan(void)
{
struct wm_iv_ctx_t *iv = (struct wm_iv_ctx_t *)wm_get();
if (vscanReset) {
if (instru.directionInit == 1) {
iv->_direction_up = true;
iv->_current_direction_up = true;
} else if (instru.directionInit == 0) {
iv->_direction_up = false;
iv->_current_direction_up = false;
}
//Vsetp = x * 20 * N, x=xmV ; N=VscanRate
if (instru.step <= 10) {
iv->_Vstep = instru.step * instru.VsetRate / 5;
} else {
iv->_Vstep = instru.step / 5 * instru.VsetRate;
}
Vset = iv->_Vinit;
}
if (!vscanReset) {
if (iv->_current_direction_up) {
if (Vset >= iv->_Vmax) {
PeriodicEvent = false;
}
} else {
if (Vset <= iv->_Vmin) {
PeriodicEvent = false;
}
}
if (iv->_current_direction_up) {
Vset = Vset + iv->_Vstep * GPT.GptimerMultiple;
} else {
Vset = Vset - iv->_Vstep * GPT.GptimerMultiple;
}
}
return;
}
static void iv_cy_vscan(void)
{
struct wm_iv_cy_ctx_t *iv_cy = (struct wm_iv_cy_ctx_t *)wm_get();
static bool VminCounter;
static bool VmaxCounter;
NotifyCycleNumber = (instru.cycleNumber - iv_cy->_cycleNumber + 1);
if(vscanReset){
VmaxCounter = false;
VminCounter = false;
if(instru.directionInit == 1){
iv_cy->_direction_up = true;
iv_cy->_current_direction_up = true;
}else if(instru.directionInit == 0){
iv_cy->_direction_up = false;
iv_cy->_current_direction_up = false;
}
//Vsetp = x * 20 * N, x=xmV ; N=VscanRate
if(instru.step <= 10){
iv_cy->_Vstep = instru.step * instru.VsetRate / 5;
}else{
iv_cy->_Vstep = instru.step / 5 * instru.VsetRate;
}
if(iv_cy->_Vmin == iv_cy->_Vinit){
VminCounter = true;
}
if(iv_cy->_Vmax == iv_cy->_Vinit){
VmaxCounter = true;
}
Vset = iv_cy->_Vinit;
}
if(!vscanReset){
if (Vset >= iv_cy->_Vmax){
VmaxCounter = true;
}else if (Vset <= iv_cy->_Vmin){
VminCounter = true;
}
if (iv_cy->_current_direction_up){
Vset = Vset + iv_cy->_Vstep * GPT.GptimerMultiple;
}else{
Vset = Vset - iv_cy->_Vstep * GPT.GptimerMultiple;
}
if(VmaxCounter && VminCounter){
if(iv_cy->_direction_up && iv_cy->_current_direction_up){
if(Vset >= iv_cy->_Vinit){
iv_cy->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
}
if(!iv_cy->_direction_up && !iv_cy->_current_direction_up){
if(Vset <= iv_cy->_Vinit){
iv_cy->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
}
}
if (Vset >= iv_cy->_Vmax){
iv_cy->_current_direction_up = false;
}else if (Vset <= iv_cy->_Vmin){
iv_cy->_current_direction_up = true;
}
/*stop condition*/
if(iv_cy->_cycleNumber == 0){
PeriodicEvent = false;
}
}
return;
}
static void it_vscan(void)
{
struct wm_it_ctx_t *it = (struct wm_it_ctx_t *)wm_get();
if (vscanReset) {
Vset = it->_Vinit;
}
if(!vscanReset) {
Vset = it->_Vinit;
}
return;
}
static void rt_vscan(void)
{
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
if (vscanReset) {
Vset = rt->_Vinit;
}
if(!vscanReset) {
Vset = rt->_Vinit;
}
return;
}
static void vo_vscan(void)
{
struct wm_vo_ctx_t *vo = (struct wm_vo_ctx_t *)wm_get();
if (vscanReset) {
Vset = vo->_Vinit;
}
if(!vscanReset) {
Vset = vo->_Vinit;
}
return;
}
#define DELTAVOLTMAX 2000000 //2000000 = 10mV
static void cc_vscan(void)
{
/* Transform setting CC into IUC
*
* User code in CC mode : 0 ~ 3000000
* Real current value : -15.00000 ~ 15.00000 mA
* => user code = 1500000 mapping to 0.00000 mA
*/
struct wm_cc_ctx_t *cc = (struct wm_cc_ctx_t *)wm_get();
struct wm_meas_t *m = &cc->measure;
uint16_t divisionRate;
int32_t deltaI;
int32_t deltaV;
int32_t Iin;
int32_t Vin;
if (vscanReset) {
Vset = 0;
if (cc->_charge == 0) {
cc->_Iset = instru.constantCurrent * 200 * (-1);
//[50pA] //controller UI 15000uA => Elite 1500000 => 1500000 * 10 * 1000 / 50 [50pA];
}
Iin = m->_measureCurrent * 20; //[50pA] nA => 50pA
Vin = m->_measureVin * 200; //[5nV]
Vset = Vin + cc->_Iset; //[5nV]
if (Vset >= 1100000000) { // 5.5V
Vset = 1100000000;
} else if (Vset <= -1000000000) { //-5V
Vset = -1000000000;
}
}
if (!vscanReset) {
Iin = m->_measureCurrent * 20; //[50pA] nA => 50pA
deltaI = Iin - cc->_Iset;
if (deltaI > 2000000 || deltaI < -2000000) { //100uA
divisionRate = 1;
} else {
divisionRate = 20;
}
deltaV = -1 * (deltaI / divisionRate); //-5 * deltaI / 5000 //pV=> 5nV
if (deltaV > DELTAVOLTMAX) { //2000000 = 10mV
deltaV = DELTAVOLTMAX;
} else if (deltaV < (-DELTAVOLTMAX)) {
deltaV = (-DELTAVOLTMAX);
}
Vset = Vset + deltaV; //[5nV]
if (Vset >= 1100000000) { // 5.5V
Vset = 1100000000;
} else if (Vset <= -1000000000) { //-5V
Vset = -1000000000;
}
if (Vset <= cc->_Vmin) {
Vset = cc->_Vmin;
} else if (Vset >= cc->_Vmax) {
Vset = cc->_Vmax;
}
}
return;
}
static void cv_vscan(void)
{
struct wm_cv_ctx_t *cv = (struct wm_cv_ctx_t *)wm_get();
static bool VminCounter;
static bool VmaxCounter;
NotifyCycleNumber = (instru.cycleNumber - cv->_cycleNumber + 1);
if (vscanReset) {
VmaxCounter = false;
VminCounter = false;
if (instru.directionInit == 1) {
cv->_direction_up = true;
cv->_current_direction_up = true;
} else {
cv->_direction_up = false;
cv->_current_direction_up = false;
}
//Vsetp = x * 20 * N, x=xmV ; N=VscanRate
if (instru.step <= 10) {
cv->_Vstep = instru.step * instru.VsetRate / 5;
} else {
cv->_Vstep = instru.step / 5 * instru.VsetRate;
}
if (cv->_Vmin == cv->_Vinit) {
VminCounter = true;
}
if (cv->_Vmax == cv->_Vinit) {
VmaxCounter = true;
}
Vset = cv->_Vinit;
}
if (!vscanReset) {
if ((instru.Vinit < instru.Ve1 && instru.Vinit < instru.Ve2) ||
(instru.Vinit > instru.Ve1 && instru.Vinit > instru.Ve2)
) {
if (cv->_current_direction_up) {
Vset = Vset + cv->_Vstep * GPT.GptimerMultiple;
} else {
Vset = Vset - cv->_Vstep * GPT.GptimerMultiple;
}
if (instru.Vinit < instru.Ve1 && instru.Vinit < instru.Ve2) {
if (Vset == cv->_Vmin) {
VminCounter = true;
instru.Vinit = instru.Vmin;
cv->_Vinit = cv->_Vmin;
}
} else if (instru.Vinit > instru.Ve1 && instru.Vinit > instru.Ve2) {
if (Vset == cv->_Vmax) {
VmaxCounter = true;
instru.Vinit = instru.Vmax;
cv->_Vinit = cv->_Vmax;
}
}
} else {
if (Vset >= cv->_Vmax) {
VmaxCounter = true;
} else if (Vset <= cv->_Vmin) {
VminCounter = true;
}
if (cv->_current_direction_up) {
Vset = Vset + cv->_Vstep * GPT.GptimerMultiple;
} else {
Vset = Vset - cv->_Vstep * GPT.GptimerMultiple;
}
if (VmaxCounter && VminCounter) {
if (cv->_direction_up && cv->_current_direction_up) {
if (Vset >= cv->_Vinit) {
cv->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
}
if (!cv->_direction_up && !cv->_current_direction_up) {
if (Vset <= cv->_Vinit) {
cv->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
}
}
if (Vset >= cv->_Vmax) {
cv->_current_direction_up = false;
} else if (Vset <= cv->_Vmin) {
cv->_current_direction_up = true;
}
/*stop condition*/
if (cv->_cycleNumber == 0) {
PeriodicEvent = false;
}
}
}
return;
}
static void lsv_vscan(void)
{
struct wm_lsv_ctx_t *lsv = (struct wm_lsv_ctx_t *)wm_get();
NotifyCycleNumber = (instru.cycleNumber - lsv->_cycleNumber + 1);
if (vscanReset) {
if (instru.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 (instru.step <= 10) {
lsv->_Vstep = instru.step * instru.VsetRate / 5;
} else {
lsv->_Vstep = instru.step / 5 * instru.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) {
PeriodicEvent = false;
} else if (Vset <= lsv->_Vmin) {
PeriodicEvent = false;
}
}
return;
}
static void ca_vscan(void)
{
struct wm_ca_ctx_t *ca = (struct wm_ca_ctx_t *)wm_get();
if(vscanReset){
Vset = ca->_Vinit;
}
if(!vscanReset){
Vset = ca->_Vinit;
}
return;
}
static void uni_pulse_vscan(uint32_t time)
{
uint32_t t = time;
struct wm_uni_pulse_ctx_t *p = (struct wm_uni_pulse_ctx_t *)wm_get();
uint32_t m;
uint32_t t_min;
uint32_t t_max;
if(vscanReset){
Vset = p->_v0;
return;
}
if(!vscanReset){
if (t == 0) {
m = 0;
} else {
m = t % p->_t_period;
}
if (m < p->_t_pa[0]) {
p->_Vset = p->_v_initial[0] + p->_v_slope[0] * t + p->_v_step[0] * (int32_t)(t / p->_t_period);
Vset = p->_Vset;
t_min = p->_t_pulse_min[0];
t_max = p->_t_pulse_max[0];
if (m > t_min && m < t_max) {
calc_avg_en = true;
} else {
calc_avg_en = false;
}
return;
}
if (m < p->_t_pa[1]) {
p->_Vset = p->_v_initial[1] + p->_v_slope[1] * t + p->_v_step[1] * (int32_t)(t / p->_t_period);
Vset = p->_Vset;
t_min = p->_t_pa[0] + p->_t_pulse_min[1];
t_max = p->_t_pa[0] + p->_t_pulse_max[1];
if (m > t_min && m < t_max) {
calc_avg_en = true;
} else {
calc_avg_en = false;
}
return;
}
if (m < p->_t_pa[2]) {
p->_Vset = p->_v_initial[2] + p->_v_slope[2] * t + p->_v_step[2] * (int32_t)(t / p->_t_period);
Vset = p->_Vset;
t_min = p->_t_pa[1] + p->_t_pulse_min[2];
t_max = p->_t_pa[1] + p->_t_pulse_max[2];
if (m > t_min && m < t_max) {
calc_avg_en = true;
} else {
calc_avg_en = false;
}
return;
}
if (m < p->_t_pa[3]) {
p->_Vset = p->_v_initial[3] + p->_v_slope[3] * t + p->_v_step[3] * (int32_t)(t / p->_t_period);
Vset = p->_Vset;
t_min = p->_t_pa[2] + p->_t_pulse_min[3];
t_max = p->_t_pa[2] + p->_t_pulse_max[3];
if (m > t_min && m < t_max) {
calc_avg_en = true;
} else {
calc_avg_en = false;
}
return;
}
return;
}
return;
}
static void dpv_vscan(uint32_t time)
{
uint32_t t = time;
struct wm_dpv_ctx_t *p = (struct wm_dpv_ctx_t *)wm_get();
uint32_t m;
uint32_t t_min;
uint32_t t_max;
if(vscanReset){
Vset = p->_v0;
return;
}
if(!vscanReset){
if (t == 0) {
m = 0;
} else {
m = t % p->_t_period;
}
if (m < p->_t_pa[0]) {
p->_Vset = p->_v_initial[0] + p->_v_slope[0] * t / 1000 + p->_v_step[0] * (int32_t)dpv_step_cnt; // _v_slope/100 = slope
Vset = p->_Vset;
t_min = p->_t_pulse_min[0];
t_max = p->_t_pulse_max[0];
if (m > t_min && m < t_max) {
calc_avg_en = true;
} else {
calc_avg_en = false;
}
if ((p->_v_curr_direc && Vset >= p->_v_stop) ||
(!p->_v_curr_direc && Vset <= p->_v_stop)) {
PeriodicEvent = false;
}
return;
}
if (m < p->_t_pa[1]) {
p->_Vset = p->_v_initial[1] + p->_v_slope[1] * t / 1000 + p->_v_step[1] * (int32_t)dpv_step_cnt;
Vset = p->_Vset;
t_min = p->_t_pa[0] + p->_t_pulse_min[1];
t_max = p->_t_pa[0] + p->_t_pulse_max[1];
if (m > t_min && m < t_max) {
calc_avg_en = true;
} else {
calc_avg_en = false;
}
return;
}
return;
}
return;
}
static void dpv_advance_vscan(uint32_t time)
{
uint32_t t = time;
struct wm_dpv_advance_ctx_t *p = (struct wm_dpv_advance_ctx_t *)wm_get();
uint32_t m;
uint32_t t_min;
uint32_t t_max;
static bool VminCounter;
static bool VmaxCounter;
if(vscanReset){
if (p->_v_direc_init) {
if (p->_v0 <= p->_v_up && p->_v0 <= p->_v_low && p->_v_2 > p->_v_1) {
VminCounter = true;
}
} else {
if (p->_v0 >= p->_v_up && p->_v0 >= p->_v_low && p->_v_1 > p->_v_2) {
VmaxCounter = true;
}
}
p->_Vset = p->_v0;
Vset = p->_Vset;
return;
}
if(!vscanReset){
if (t == 0) {
m = 0;
} else {
m = t % p->_t_period;
}
if (m < p->_t_pa[0]) {
t_min = p->_t_pulse_min[0];
t_max = p->_t_pulse_max[0];
if (m > t_min && m < t_max) {
calc_avg_en = true;
} else {
calc_avg_en = false;
}
p->_Vset = p->_v_initial[0] + p->_v_slope[0] * t / 1000 + p->_v_step[0] * (int32_t)dpv_step_cnt; // _v_slope/100 = slope
Vset = p->_Vset;
if (VminCounter == true && VmaxCounter == true) {
p->_cycleNumber--;
VminCounter = false;
VmaxCounter = false;
}
if (p->_cycleNumber <= 0) {
if (p->_v_stop_direction == true && p->_Vset >= p->_v_stop - p->_v_amp + p->_v_step[0]) {
PeriodicEvent = false;
} else if (p->_v_stop_direction == false && p->_Vset <= p->_v_stop - p->_v_amp + p->_v_step[0]) {
PeriodicEvent = false;
}
}
if (p->_v_curr_direc && p->_Vset >= p->_v_up - p->_v_amp + p->_v_step[0]) {
if (p->_v_invert_option) {
p->_v_amp = p->_v_amp * (-1);
}
p->_v_initial[0] = p->_Vset;
p->_v_initial[1] = p->_v_initial[0] + p->_v_amp;
dpv_step_cnt = 0;
p->_v_step[0] = (-1) * p->_v_step[0];
p->_v_step[1] = (-1) * p->_v_step[1];
p->_v_curr_direc = false;
VmaxCounter = true;
p->_Vset = p->_v_initial[0] + p->_v_slope[0] * t / 1000 * (int32_t)dpv_step_cnt; // _v_slope/100 = slope
Vset = p->_Vset;
} else if (!p->_v_curr_direc && p->_Vset <= p->_v_low - p->_v_amp + p->_v_step[0]) {
if (p->_v_invert_option) {
p->_v_amp = p->_v_amp * (-1);
}
p->_v_initial[0] = p->_Vset;
p->_v_initial[1] = p->_v_initial[0] + p->_v_amp;
dpv_step_cnt = 0;
p->_v_step[0] = (-1) * p->_v_step[0];
p->_v_step[1] = (-1) * p->_v_step[1];
p->_v_curr_direc = true;
VminCounter = true;
p->_Vset = p->_v_initial[0] + p->_v_slope[0] * t / 1000 * (int32_t)dpv_step_cnt; // _v_slope/100 = slope
Vset = p->_Vset;
}
return;
}
if (m < p->_t_pa[1]) {
p->_Vset = p->_v_initial[1] + p->_v_slope[1] * t / 1000 + p->_v_step[1] * (int32_t)dpv_step_cnt;
Vset = p->_Vset;
t_min = p->_t_pa[0] + p->_t_pulse_min[1];
t_max = p->_t_pa[0] + p->_t_pulse_max[1];
if (m > t_min && m < t_max) {
calc_avg_en = true;
} else {
calc_avg_en = false;
}
return;
}
return;
}
return;
}
static void pulse_vscan(void)
{
struct wm_pulse_ctx_t *pulse = (struct wm_pulse_ctx_t *)wm_get();
static uint16_t lastVolt;
if (stiFirstTime) {
stiFirstTime = false;
lastVolt = 25000;
pulse->_sti_t_flag = 1;
pulse->_sti_v = pulse->_sti_v1;
pulse->_sti_t = pulse->_sti_t1;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if(!stiFirstTime) {
if (GPT.StiCounter >= pulse->_sti_t) {
GPT.StiCounter -= pulse->_sti_t; //to get right time
if (pulse->_sti_lp > 0) {
if (pulse->_sti_cy > 0) {
if (pulse->_sti_t_flag == 1) {
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 2) {
pulse->_sti_t_flag = 3;
pulse->_sti_v = pulse->_sti_v3;
pulse->_sti_t = pulse->_sti_t3;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 3) {
pulse->_sti_cy -- ;
if (pulse->_sti_cy == 0) {
pulse->_sti_t_flag = 4;
pulse->_sti_v = pulse->_sti_v4;
pulse->_sti_t = pulse->_sti_t4;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else {
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
}
}
} else if (pulse->_sti_cy <= 0){
if (pulse->_sti_t_flag == 4) {
pulse->_sti_lp -- ;
if (pulse->_sti_lp > 0) {
pulse->_sti_cy = instru.sti_cy;
pulse->_sti_t_flag = 2;
pulse->_sti_v = pulse->_sti_v2;
pulse->_sti_t = pulse->_sti_t2;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else {
pulse->_sti_t_flag = 5;
pulse->_sti_v = pulse->_sti_v5;
pulse->_sti_t = pulse->_sti_t5;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
}
}
}
} else if (pulse->_sti_lp <= 0) {
if (pulse->_sti_t_flag == 5) {
pulse->_sti_t_flag = 6;
pulse->_sti_v = pulse->_sti_v6;
pulse->_sti_t = pulse->_sti_t6;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 6) {
pulse->_sti_t_flag = 7;
pulse->_sti_v = pulse->_sti_v7;
pulse->_sti_t = pulse->_sti_t7;
if (pulse->_sti_t == 1) {
pulse->_sti_v = lastVolt;
}
} else if (pulse->_sti_t_flag == 7) {
pulse->_sti_v = 25000;
PeriodicEvent = false;
PIN15_setOutputValue(HIGH_Z_MODE, 0); // 0: open highz;
ModeLED(NO_EVENT);
}
}
}
}
if (lastVolt != pulse->_sti_v) {
lastVolt = pulse->_sti_v;
//if (pulse->_sti_v == 25000) {
// PIN15_setOutputValue(HIGH_Z_MODE, 0); // 1 => close high_z mode
//} else {
// PIN15_setOutputValue(HIGH_Z_MODE, 1); // 1 => close high_z mode
//}
DAC_outputV(Usercode_Correction_to_DAC(VOUT_GAIN_240K, pulse->_sti_v));
DAC_outputV(Usercode_Correction_to_DAC(VOUT_GAIN_240K, pulse->_sti_v));
}
return;
}
static void chg_vo_para(uint16_t parameter, int32_t value)
{
uint16_t pa = parameter;
int32_t val = value;
struct wm_vo_ctx_t *vo = (struct wm_vo_ctx_t *)wm_get();
if (pa == DAC_VOLT) {
vo->_Vinit = val;
}
return;
}
static void chg_it_para(uint16_t parameter, int32_t value)
{
uint16_t pa = parameter;
int32_t val = value;
struct wm_it_ctx_t *it = (struct wm_it_ctx_t *)wm_get();
if (pa == DAC_VOLT) {
it->_Vinit = val;
}
return;
}
static void chg_rt_para(uint16_t parameter, int32_t value)
{
uint16_t pa = parameter;
int32_t val = value;
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
if (pa == DAC_VOLT) {
rt->_Vinit = val;
}
return;
}
#endif
@@ -621,6 +621,12 @@ static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1) {
}
EliteKeyPress(key);
GPT.DeltaGptimerCounter = GPT.GptimerCounter - GPT.GptimerCounter0;
GPT.GptimerCounter0 = GPT.GptimerCounter;
GPT.BatteryADCCounter = GPT.BatteryADCCounter + GPT.DeltaGptimerCounter;
GPT.BatteryCheckCounter = GPT.BatteryCheckCounter + GPT.DeltaGptimerCounter;
if(key != 0){ //detect Elite battery power when no periodic event
measureBat();
}
@@ -919,16 +925,16 @@ static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState)
numActive = linkDB_NumActive();
// uint16_t cxnHandle;
//
// // requestedPDUSize = LL payload = L2CAP_header + ATT header + BLE_NOT_BUFF_SIZE = 7 + BLE_NOT_BUFF_SIZE //roy
// uint16_t requestedPDUSize = 251; //251 roy
// uint16_t requestTxTime = 2120; // (LL payload + 14) * 8 //2120 roy
// GAPRole_GetParameter(GAPROLE_CONNHANDLE, &cxnHandle);
//
// if (SUCCESS == HCI_LE_SetDataLenCmd(cxnHandle, requestedPDUSize, requestTxTime)) {
//// LED_color(DARKLED, 0xFF, 0x00, 0xFF);
// }
uint16_t cxnHandle;
// requestedPDUSize = LL payload = L2CAP_header + ATT header + BLE_NOT_BUFF_SIZE = 7 + BLE_NOT_BUFF_SIZE //roy
uint16_t requestedPDUSize = 251; //251 roy
uint16_t requestTxTime = 2120; // (LL payload + 14) * 8 //2120 roy
GAPRole_GetParameter(GAPROLE_CONNHANDLE, &cxnHandle);
if (SUCCESS == HCI_LE_SetDataLenCmd(cxnHandle, requestedPDUSize, requestTxTime)) {
// LED_color(DARKLED, 0xFF, 0x00, 0xFF);
}
// Use numActive to determine the connection handle of the last
// connection
@@ -85,7 +85,7 @@ extern "C"
// Length of Characteristic 5 in bytes
#define SIMPLEPROFILE_CHAR5_LEN 5
#define SIMPLEPROFILE_CHAR4_LEN 20
#define SIMPLEPROFILE_CHAR4_LEN 120
#define SIMPLEPROFILE_CHAR3_LEN 20
#define SIMPLEPROFILE_CHAR2_LEN 20