481 lines
19 KiB
C
481 lines
19 KiB
C
/*
|
||
*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; //清零计数
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|