Electricity/FWLIB/source/ENS_CURRENT_CALIBRATION.c

481 lines
19 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*Copyright ,2023 , NANOCHAP
*File name: ENS1_CURRENT_CALIBRATION.C
*Author:
*Version: V1.0
*Date: 2023-11-
*Description:
*Function List:
History:
1.V1.0
Date:
Author:
Modification: 初版
*/
#include "ENS_CURRENT_CALIBRATION.h"
#include "ENS1_MTP.h"
#include "ENS1_UART.h"
#include "ENS1_TIMER.h"
/*--------------------------------波形参数的初始化幅值结构体-----------------------------*/
STRUCT_WAVEFORM_PARA ParaSet_waveform[4] =
{
/*通道1 -- ST0 ST1 */
{
.Type = SQUARE_WAVE , //波形种类选择
.PositivePulseWidth = 100 , //正半周期脉宽-微秒
.DeadTime = 10, //死区时间-微秒
.NegativePulseWidth = 100 , //负半周期脉宽-微秒
.ClientTime = 1000 , //静默时间-微秒
.DelayOutputTime_US = 0, //延迟输出时间-微秒
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
},
/*通道2 -- ST2 ST3 */
{
.Type = TRIANGULAR_WAVE , //波形种类选择
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
.DeadTime = 0, //死区时间-微秒
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
.ClientTime = 0 , //静默时间-微秒
.DelayOutputTime_US = 0, //延迟输出时间-微秒
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
},
/*通道3 -- ST4 ST5 */
{
.Type = TRIANGULAR_WAVE , //波形种类选择
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
.DeadTime = 0, //死区时间-微秒
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
.ClientTime = 0 , //静默时间-微秒
.DelayOutputTime_US = 0, //延迟输出时间-微秒
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
},
/*通道4 -- ST6 ST7 */
{
.Type = TRIANGULAR_WAVE , //波形种类选择
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
.DeadTime = 0, //死区时间-微秒
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
.ClientTime = 0 , //静默时间-微秒
.DelayOutputTime_US = 0, //延迟输出时间-微秒
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
},
};
/*-------------------------------------------------------------------------------------*/
/*-------------------------获取到FT测试后的实际测量单元电流值---------------------------*/
uint16_t FT_CURRENT_SAVE[4]={0,0,0,0}; //用于保存FT读取出的数据
uint8_t CUSTOM_UNIT_CURRENT[4]={33,33,33,33}; //用于自定义单元电流值
uint8_t unit_current[4] ={0,0,0,0}; //保存计算好的实际单元电流值
uint8_t GET_FT_CURRENT(void) //电流设置208*4
{
//当需要使用FT后的芯片时打开注释 此时自动计算单元电流
//当手动校准时修改CUSTOM_UNIT_CURRENT[4] 数组中的数据并将下面4行注释掉
// flash_read(DATA_SAVE_ADDR ,&FT_CURRENT_SAVE[0]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
// flash_read(DATA_SAVE_ADDR+2 ,&FT_CURRENT_SAVE[1]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
// flash_read(DATA_SAVE_ADDR+4 ,&FT_CURRENT_SAVE[2]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
// flash_read(DATA_SAVE_ADDR+6 ,&FT_CURRENT_SAVE[3]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
for(int i = 0 ;i<4;i++)
{
if(FT_CURRENT_SAVE[i] != 0)
unit_current[i] = (uint8_t)(FT_CURRENT_SAVE[i] /( 208 * 4 )) ; //计算实际单元电流
else
unit_current[i] = CUSTOM_UNIT_CURRENT[i] ;
}
return 0;
}
/*-------------------------------------输出电流大小设置--------------------------------*/
//正弦波计算数据填充值
double sin_cal(uint8_t angle) //0-180
{
double radian = angle*PI/180;
return sin(radian);
}
//计算不同波形下的的64个点的值当前有方波正弦波三角波
uint16_t unit_t[4]; //保存计算后的单元电流系数0-7 共四个通道
uint32_t isel_t[4][64]; //保存计算后得到的电流挡位0-255共四个通道
BasicWaveformType wavePara_type[4];
uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType type, uint16_t* unit , uint32_t (*isel)[64]) // uint16_t read_current_data
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
if(CHANNEL_X == CHANNEL_0) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK0;
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
if(!mA)
{
for(uint8_t i = 0 ;i<4;i++){
unit_t[i] = 0;
for(uint8_t j = 0;j<64;j++)
{
isel_t[i][j] = 0;
}
}
}
else
{
if(type == SQUARE_WAVE)
{
//保存计算结果,用于给电流相关的寄存器赋值
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
for(int i = 0 ;i<64;i++)
{
*(isel[0]+CHANNEL_X*64+i) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X)+1)*unit_current[CHANNEL_X])); // 0 - 255
}
}
else if(type== SINE_WAVE)
{
//保存计算结果,用于给电流相关的寄存器赋值
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
for(int i = 0 ;i<64;i++)
{
*(isel[0]+CHANNEL_X*64+i) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X) + 1)*unit_current[CHANNEL_X])*sin_cal(i*2.85714)); // 0 - 255
}
}
else //三角波赋值(type == TRIANGULAR_WAVE )
{
//保存计算结果,用于给电流相关的寄存器赋值
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
*(isel[0]+CHANNEL_X*64) = 0;
*(isel[0]+CHANNEL_X*64+63) = 0;
for(int j = 1 ; j<32 ; j++)
{
*(isel[0]+CHANNEL_X*64+j) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X)+1)*unit_current[CHANNEL_X]) * 0.033258*j); // 0 - 255
// printf("%d\n",*(isel[0]+CHANNEL_X*64+j));
}
for(int k = 32 ; k<63 ; k++)
{
*(isel[0]+CHANNEL_X*64+k) =*(isel[0]+CHANNEL_X*64+(63-k)) ;
// printf("%d\n",*(isel[0]+CHANNEL_X*64+k));
}
}
}
return 0;
}
/*初始化设置*/
/*CONFIG寄存器设置*/
uint8_t ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
if(CHANNEL_X == CHANNEL_0) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK0;
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
if(BIT == DISABLE_ALL_BIT)
{
WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG = 0x00;
return (uint8_t)WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG ;
}
if(BIT == ENABLE_ALL_BIT)
{
WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG = ENABLE_ALL_BIT;
return (uint8_t)WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG ;
}
if((BIT != DISABLE_ALL_BIT) && (BIT != ENABLE_ALL_BIT))
{
WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG |= BIT;
}
return (uint8_t)WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG ;
}
uint8_t ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
if(CHANNEL_X == CHANNEL_0) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK0;
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
if(BIT == DISABLE_ALL_BIT)
{
WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG = 0x00;
return (uint8_t)WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG ;
}
if(BIT == ENABLE_ALL_BIT)
{
WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG = ENABLE_ALL_BIT;
return (uint8_t)WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG ;
}
if((BIT != DISABLE_ALL_BIT) && (BIT != ENABLE_ALL_BIT))
{
WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG &=~ BIT;
}
return (uint8_t)WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG ;
}
/*---------------------------电刺激有关的寄存器的初始化--------------------------------*/
uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
{
//uint32_t WaveformFreq=0;
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
if(CHANNEL_X == CHANNEL_0) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK0;
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
//config 设置
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,DISABLE_ALL_BIT);
//1 、 死区时间不为0波形不为sine波 ,使能REST
if((ParaSet_waveform[CHANNEL_X].DeadTime > 0)){
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,REST_BIT);
}
else
{
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,REST_BIT);
}
//2 、 负半周期脉宽大于0 使能 NEGATIVE_BIT 和 SOURCE_B_BIT
if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth > 0)
{
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SOURCE_B_BIT ); //SOURCEB不使能则负半周期的数据无效=0
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,NEGATIVE_BIT );
}
//3、静默时间不为0开启SILENT_BIT
if(ParaSet_waveform[CHANNEL_X].ClientTime>0)
{
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SILENT_BIT);
}
else
{
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SILENT_BIT);
}
//4、交替模式ALTERNATING_POSITIVE_BIT
if(ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ > 0 )
{
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,ALTERNATING_POSITIVE_BIT);
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SOURCE_B_BIT);
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,NEGATIVE_BIT);
//交替时间与主频有关,输入的参数为交替频率需要转化为时钟个数时钟个数不能超过2^16
WAVE_GEN_BLK ->WAVE_GEN_DRV_ALT_LIM_REG =(uint16_t)(ParaSet_waveform[CHANNEL_X].PositivePulseWidth / (uint16_t)ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ * (uint16_t)(APB_Clock_Freq/1000000)) ;
ParaSet_waveform[CHANNEL_X].NegativePulseWidth = 0;
}
else
{
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,ALTERNATING_POSITIVE_BIT);
}
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,CONTINUE_REPEATING_BIT);
//延迟输出时间计算 单位us
WAVE_GEN_BLK->WAVE_GEN_DRV_DELAY_LIM_REG = (uint8_t)(APB_Clock_Freq/1000000)*ParaSet_waveform[CHANNEL_X].DelayOutputTime_US;
//根据初始化后的STRUCT_WAVEFORM_PARA结构体给对应的寄存器赋值
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].NegativePulseWidth;
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].PositivePulseWidth;
WAVE_GEN_BLK->WAVE_GEN_DRV_CLK_FREQ_REG = (uint32_t)(APB_Clock_Freq/1000000); //
WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = ParaSet_waveform[CHANNEL_X].ClientTime;
WAVE_GEN_BLK->WAVE_GEN_DRV_REST_T_REG = ParaSet_waveform[CHANNEL_X].DeadTime;
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_SCALE_REG = 1; //寄存器默认为0 必须写大于0的数
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_OFFSET_REG = 0;
//WaveformFreq = (uint32_t)(1000000 / (wavePara.ClientTime + wavePara.DeadTime +wavePara.NegativePulseWidth + wavePara.PositivePulseWidth));
//保存波形类型数据
wavePara_type[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].Type;
TOTAL_TIME_THRESHOLD_VALUE[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TotalOutputTime_S * 1000;
if( (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS > 0) || (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups >0))
{
TRIGGER_TIME_COUNT[CHANNEL_X] = 0; //间隔时间清零
TRIGGER_TIME_THRESHOLD_VALUE[CHANNEL_X]=ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS ;
NUM_OF_PULSES_THRESHOLD[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups ;
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001;
}
uint8_t returnValue = cal_output_current_mA(CHANNEL_X,0, wavePara_type[CHANNEL_X], unit_t , isel_t) ;
return (uint32_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG); //返回波形的频率
}
/*--------------------------------------启动输出-----------------------------------------*/
volatile uint8_t statics_config=0; //明确当前有几个通道在输出 0 / 1 / 2 /4 / 8
void StartStimulatorOut(CHANNEL_NUM CHANNEL_X)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
if(CHANNEL_X == CHANNEL_0) {WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK0; statics_config |= (1<<0); }
else if(CHANNEL_X == CHANNEL_1) {WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1; statics_config |= (1<<1);}
else if(CHANNEL_X == CHANNEL_2) {WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2; statics_config |= (1<<2);}
else {WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3; statics_config |= (1<<3) ;}
if(statics_config > 1)
{
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,MULTI_ELECTRODE_BIT); //多电极使能
}
WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG = 1;
}
/*--------------------------------------停止输出----------------------------------------*/
void StopStimulatorOut(CHANNEL_NUM CHANNEL_X)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
if(CHANNEL_X == CHANNEL_0) {WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK0; statics_config &=~(1<<0); }
else if(CHANNEL_X == CHANNEL_1) {WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1; statics_config &=~(1<<1); }
else if(CHANNEL_X == CHANNEL_2) {WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2; statics_config &=~(1<<2); }
else {WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3; statics_config &=~(1<<3); }
WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG = 0;
if(statics_config < 2)
{
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,MULTI_ELECTRODE_BIT);
}
}
/*-----------------------------电刺激过程中的电流、频率设置-------------------------------*/
/*输出电流大小修改*/
uint8_t CURRENT_AMPLITUDE_MODIFY(CHANNEL_NUM CHANNEL_X , float mA)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
if(CHANNEL_X == CHANNEL_0) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK0;
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
NVIC_DisableIRQ(WG_DRV_IRQn);
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0;
StopStimulatorOut(CHANNEL_X);
cal_output_current_mA(CHANNEL_X,mA, wavePara_type[CHANNEL_X], unit_t , isel_t) ;
WAVE_GEN_BLK ->WAVE_GEN_DRV_ISEL_REG = unit_t[CHANNEL_X]; //范围 0x00 - 0x07 单元电流
for(int i=0; i<64; i++){
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_REG = isel_t[CHANNEL_X][i]; //最大0xff 电流挡位
}
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001;
NVIC_EnableIRQ(WG_DRV_IRQn);
StartStimulatorOut(CHANNEL_X);
return (uint8_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG); //返回状态
}
/*输出波形频率的实时修改,输出时,波形频率=(1000000/(正半周期脉宽 + 负半周期脉宽 + 死区时间 + 静默时间))*/
uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq)
{
uint32_t Pulse_Width = 0;
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
if(CHANNEL_X == CHANNEL_0) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK0;
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
if(freq > 50000 )
freq = 50000;
else if(freq < 10)
freq = 10;
//死区数值不改动如果静默时间不为0 ,则通过修改静默时间修改波形频率 如果静默时间为0则修改正半周期/负半周期脉宽修改频率
if(ParaSet_waveform[CHANNEL_X].ClientTime > 0)
{
Pulse_Width/*静默时间*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime - ParaSet_waveform[CHANNEL_X].PositivePulseWidth - ParaSet_waveform[CHANNEL_X].NegativePulseWidth);
WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = Pulse_Width;
return Pulse_Width;
}
else if(ParaSet_waveform[CHANNEL_X].ClientTime == 0)
{
Pulse_Width/*正+负脉宽*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime) ;
if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth == 0)
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = Pulse_Width;
else
{
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = (uint32_t) (Pulse_Width / 2) ;
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = (uint32_t) (Pulse_Width / 2) ;
}
return Pulse_Width;
}
else
{
return 0;
}
}
//电刺激时间计时
uint32_t StimuTimeCount_S(CHANNEL_NUM CHANNEL_X , TIME_COUNT_MODE MODE)
{
uint32_t count_time = 0;
if(MODE == TOTAL_TIME_MODE)
{
count_time = *(CHANNEL_TIME_COUNT+CHANNEL_X) ;
}
else //MODE == TRIGGER_TIME_MODE 间隔时间
{
count_time = *(TRIGGER_TIME_COUNT+CHANNEL_X);
}
return count_time;
}
//返回当前波形发生了多少次(需要开启波形发生器的中断)
uint32_t waveformOccurreCount(CHANNEL_NUM CHANNEL_X)
{
return (uint32_t)(wave_gen_irq_occurred[CHANNEL_X]/4);
}
/*-------------------------------电刺激驱动器中断处理函数-----------------------*/
volatile uint32_t NUM_OF_PULSES_THRESHOLD[4]={0,0,0,0};
volatile uint32_t wave_gen_irq_occurred[4]={0,0,0,0};
void WG_DRV_Handler(void)
{
CMSDK_WAVE_GEN_TypeDef *DRVA;
for(int i =0; i<4;i++)
{
if(i==0){ DRVA= WAVE_GEN_DRVA_BLK0; }
else if(i==1){ DRVA= WAVE_GEN_DRVA_BLK1; }
else if(i==2){ DRVA= WAVE_GEN_DRVA_BLK2; }
else if(i==3){ DRVA= WAVE_GEN_DRVA_BLK3; }
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_DRIVER_NUM_Msk) == i) //判断哪个通道发生了中断
{
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk) == CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk)//第一中断点发生中断
{
if(((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Msk)>>CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Pos) == 0)
{
if((NUM_OF_PULSES_THRESHOLD[i] > 0) && (wave_gen_irq_occurred[i] > (NUM_OF_PULSES_THRESHOLD[i]*4 - 2)))
DRVA->WAVE_GEN_DRV_INT_REG = (63 << CMSDK_WAVE_GEN_DRV_INT_SECOND_ADDR_Pos) | (0 << CMSDK_WAVE_GEN_DRV_INT_FIRST_ADDR_Pos) | CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
else
DRVA->WAVE_GEN_DRV_INT_REG = (63 << CMSDK_WAVE_GEN_DRV_INT_SECOND_ADDR_Pos) | (32 << CMSDK_WAVE_GEN_DRV_INT_FIRST_ADDR_Pos) | CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
}
else if(((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Msk)>>CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Pos) == 32)
{
DRVA->WAVE_GEN_DRV_INT_REG = (31 << CMSDK_WAVE_GEN_DRV_INT_SECOND_ADDR_Pos) | (0 << CMSDK_WAVE_GEN_DRV_INT_FIRST_ADDR_Pos) | CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
}
if((NUM_OF_PULSES_THRESHOLD[i] > 0)) //需要脉冲计数功能才开启计数
wave_gen_irq_occurred[i]++;
}
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_SECONDADDR_STS_Msk) == CMSDK_WAVE_GEN_DRV_INT_SECONDADDR_STS_Msk)
{
StopStimulatorOut((CHANNEL_NUM)i);
DRVA->WAVE_GEN_DRV_INT_REG = CMSDK_WAVE_GEN_DRV_INT_SECONDADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
NVIC_DisableIRQ(WG_DRV_IRQn);
DRVA->WAVE_GEN_DRV_INT_REG = 0;
TRIGGER_TIME_COUNT_FLAG |= (1<<i); //脉冲群标志置1
wave_gen_irq_occurred[i] = 0; //清零计数
}
}
}
}