📄 mass.h
字号:
#define USER_DEBUG
//#define SIM_DEBUG
#define PWM_PERIOD 80 //PWM周期(us)
#define PUBLIC_PERIOD 1 //公用定時器周期(ms)
//應保證((1<<CNT_AN_DMA_WORDS_ORDER)*CNT_AN_NUMBER<<1)<=0x800,即不超出DMA總空間
#define CNT_AN_NUMBER 5 //須采樣的模擬信號路數
#define CNT_AN_DMA_WORDS_ORDER 6 //為每路模擬信號采樣分配的DMA空間字數的2的冪數(即使用的DMA空間字數為1<<5=32WORDS)
//#define CNT_AN_DMA_WORDS_ORDER 8 //CNT_AN_NUMBER為4時的最大值
#define CNT_AN_COL_NUM 256 //為每路模擬信號采樣至少256次計算一次AD值(實際次數應為每次DMA中斷采樣次數的倍數)
//進行一次計算的周期為256*74.403us=19.047ms
#define CNT_CURRENT_LIMIT 2000 //電流傳感器量程(mA)
//#define SOFT_CLEAR_TI //如果MCU需要软件清除字节发送结束标识位(如具有8051核的MCU),则须定义SOFT_CLEAR_TI
#define CNT_SEND_MAX_NUM 30 //封包發送最大字節數
#define CNT_SEND_DATA_START_BYTE ':' //封包起始字节
#define CNT_SEND_DEBUG_START_BYTE '#' //封包起始字节
#define CNT_SEND_END_BYTE '\n' //封包終止字节
//定义环境相关标识符,在不同的项目或硬件环境中需要设置与环境一致的内容
//#define SW_SOFT_CLEAR_RCIF //如果MCU需要软件清除字节接收中断标识位(如具有8051核的MCU),则须定义該開關
#define SW_SOFT_CLEAR_OERR //如果MCU需要软件清除接收缓冲器溢出错误状态位(如具有PIC核的MCU),则须定义該開關
#define CNT_RECV_MAX_NUM 30 //封包接收最大字節數
#define CNT_RECV_START_BYTE ':' //封包起始字节
#define CNT_RECV_END_BYTE '\r' //封包終止字节
#define CNT_RX_ERR_JUDGE_TIME 2000 //通訊失敗判斷延时门限(ms)
#define CNT_CMD_PARAM_LENGTH 15 //指令参数长度(数值的字节数)
#define CNT_PWM_NUM 1 //间隔多少PWM周期进行占空比寄存器的缓变
#define CNT_OCRS_STEP 5 //test占空比寄存器在PWM周期中断中的缓变步长
//定义各动作的占空比寄存器
#define SFR_OCRS_TATAKI OC1RS
#define SFR_OCRS_FRONT OC2RS
#define SFR_OCRS_BACK OC3RS
#define SFR_OCRS_MOMICW OC5RS
#define SFR_OCRS_MOMICCW OC6RS
#define SFR_OCRS_UP OC7RS
#define SFR_OCRS_DOWN OC8RS
#define SFR_OCRS_TEST OC4RS
#define CNT_TATAKI_PERIOD_LIMIT 1000 //IC1:定义捶打周期检测极限(超出後报错)
#define CNT_UPDOWN_PERIOD_LIMIT 1000 //IC4:定义升降计数周期检测极限(超出後报错)
#define CNT_FRNTBCK_PERIOD_LIMIT 1000 //IC5:定义出退计数周期检测极限(超出後报错)
#define CNT_MOMI_PERIOD_LIMIT 3000 //IC6:定义揉捏周期检测极限(超出後报错)
//mm转时间片
#define TICKS(mm) (INT16U)((INT32U)(mm)*OS_TICKS_PER_SEC/1000)
//下降距离(mm)转脉冲数
#define PD(mm) (mm*1000UL/CNT_UD_PULSE_HEIGHT)
//部位点高度值(自下限点(座垫面))(mm)转从原点(上限点)计数脉冲数
#define PB(mm) ((CNT_UD_LIMIT_HEIGHT-(mm))*1000UL/CNT_UD_PULSE_HEIGHT)
//前伸距离(mm)转脉冲数
#define PF(mm) (mm*1000UL/CNT_FB_PULSE_DIST)
#define CNT_NECK_LENGTH 100 //定义默认颈长(mm)
#define CNT_SHOULDER_HEIGHT 390 //定义默认肩高(从下限点(座垫面)到肩膀的高度)(mm)
#define CNT_UD_PULSE_HEIGHT 3520//定义一个高度反馈脉冲对应的升降高度(um)
#define CNT_UD_LIMIT_HEIGHT 520 //定义升降全程高度(上下限位高度)(mm)
#define CNT_FB_PULSE_DIST 2400//定义一个出退反馈脉冲对应的出退距离(um)
#define CNT_FB_LIMIT_DIST 84//定义出退全程距离(前后限位长度)(mm)
#define CNT_SHDR_RST 83//定义肩压时升降归位点离肩膀的距离(mm)
#define CNT_SHDR_SUP 19//定义肩压起始点离肩膀的距离(mm)
#define CNT_SHDR_DTCT_MIN 100//定义肩膀检测最低高度(mm)
#define CNT_UD_ERROR PD(5) //定义升降误差(mm转脉冲数)
#define CNT_FB_ERROR PF(3) //定义出退误差(mm转脉冲数)
#define PARAM_VOID 0xFF//定义函数参数无关量的数值
#define SHDR_KEP_TIME 100//定义肩压时到达肩位的保持时间(ms)
#define VALID_LEVEL(lvl) ((lvl>=0x01)&&(lvl<=0x0A))
//定义升降全程的最大部位分界点数量(包括上下限位)
#define CNT_PART_POINT_NUM 6
//各部位点定义,与下数组序号对应
#define CNT_UD_BACE 0x01
#define CNT_UD_NECK 0x02
#define CNT_UD_SHOULDER 0x03
#define CNT_UD_BACK 0x04
#define CNT_UD_WAIST 0x05
#define CNT_UD_LIMIT 0x06
#ifdef YZ_TASK
//肩膀点备份值
INT8U ShdrPointBak=PB(CNT_SHOULDER_HEIGHT);
//定义各部位点(依次为A~F点)高度的脉冲数,以便于将来人为修改具体值(0x00和0xFF为限位专用值,故原点应设为1)
INT8U BodyPointHeight[CNT_PART_POINT_NUM]=
{
0x01,
PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH),
PB(CNT_SHOULDER_HEIGHT),
PB(CNT_SHOULDER_HEIGHT*2/3),
PB(CNT_SHOULDER_HEIGHT/3),
PB(0)
};
#else
extern INT8U ShdrPointBak;
extern INT8U BodyPointHeight[];
#endif
//定义一部位的最大分割点数量,影响下列相关数组大小,且内容必须重新设置
#define CNT_PART_DIVIS_NUM 5
#ifdef YZ_TASK
//各分割点计数值,在手技处理时根据按摩范围设置
INT8U DivisPoint[(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM+1]=
{
PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH),
PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH*4/5),
PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH*3/5),
PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH*2/5),
PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH*1/5),
PB(CNT_SHOULDER_HEIGHT),
PB(CNT_SHOULDER_HEIGHT*14/15),
PB(CNT_SHOULDER_HEIGHT*13/15),
PB(CNT_SHOULDER_HEIGHT*12/15),
PB(CNT_SHOULDER_HEIGHT*11/15),
PB(CNT_SHOULDER_HEIGHT*2/3),
PB(CNT_SHOULDER_HEIGHT*9/15),
PB(CNT_SHOULDER_HEIGHT*8/15),
PB(CNT_SHOULDER_HEIGHT*7/15),
PB(CNT_SHOULDER_HEIGHT*6/15),
PB(CNT_SHOULDER_HEIGHT/3),
PB(CNT_SHOULDER_HEIGHT*4/15),
PB(CNT_SHOULDER_HEIGHT*3/15),
PB(CNT_SHOULDER_HEIGHT*2/15),
PB(CNT_SHOULDER_HEIGHT*1/15),
PB(0)
};
#endif
#ifdef YZ_TASK
//定义各分割点处体型面的默认出退计数值(从原点开始的脉冲个数),以便于将来人为修改具体值
//用于保存体型检测结果
//若体型检测设置的一部位分割点数改变,则部位的数据个数及数值也应改变
//每元素的格式为{升降位置(从上限点的计数值),体型面位置(从後限点的计数值)}
//默认或上一次的检测结果,用于本次检测取消时对上次检测的恢复
INT8U AllSurPstDistBak[(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM+1][2]=
{
{PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH), PF(30)},
{PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH*4/5), PF(30)},
{PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH*3/5), PF(30)},
{PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH*2/5), PF(30)},
{PB(CNT_SHOULDER_HEIGHT+CNT_NECK_LENGTH*1/5), PF(30)},
{PB(CNT_SHOULDER_HEIGHT), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*14/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*13/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*12/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*11/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*2/3), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*9/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*8/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*7/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*6/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT/3), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*4/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*3/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*2/15), PF(30)},
{PB(CNT_SHOULDER_HEIGHT*1/15), PF(30)},
{PB(0), PF(30)}
};
//保存本次的检测结果
INT8U AllSurPstDist[(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM+1][2];
//按摩强度定义(脉冲数)
const INT8U StrDistTab[10]={PF(5),PF(10),PF(14),PF(19),PF(24),PF(29),PF(34),PF(38),PF(43),PF(48)};
#endif
#ifdef YZ_TASK
//肩压强度定义(脉冲数)
const INT8U ShdrPrsStrDistTab[10]={PD(6),PD(11),PD(17),PD(22),PD(28),PD(33),PD(39),PD(44),PD(50),PD(55)};
#endif
//定義發送宏,不在Mass_TxStart函數中進行OSMboxPend等待是為了防止多任務對Mass_TxStart的可重入嵌套,而造成堆棧的過多使用
#define MASS_TXSTART(x) \
OSMboxPend(MboxTx_Finish,CNT_RX_ERR_JUDGE_TIME,&Err); \
Mass_TxStart(x);
#define APP_TASK_START_PRIO 5
#define MASS_TECH_TASK_PRIO 6
#define YZ_TASK_PRIO 7
#define MOMI_TASK_PRIO 8
#define TATAKI_TASK_PRIO 9
#define APP_TASK_START_STK_SIZE 256
#define MASS_TECH_TASK_STK_SIZE 256
#define YZ_TASK_STK_SIZE 256
#define MOMI_TASK_STK_SIZE 256
#define TATAKI_TASK_STK_SIZE 256
#define CNT_STAT_PARAM_LENGTH 5 //取得状态指令返回参数长度(ASCII的字符数)
typedef struct
{
INT8U TatakiCurLmit:1;
INT8U ZCurLmit:1;
INT8U MomiCurLmit:1;
INT8U YCurLmit:1;
INT8U FrontLmit:1;
INT8U BackLmit:1;
INT8U :2;
INT8U TatakiRun:1;
INT8U ZRun:1;
INT8U MomiRun:1;
INT8U YRun:1;
INT8U MassPart:3;
INT8U MassRun:1;
INT8U CmdNum:4;
}MASS_STAT_STRUCT;
//下面三个预定义若被修正必须同步修正
#define CNT_SPEED_PARAM_LENGTH 7 //速度调整指令参数长度(ASCII的字符数)
#define SPEED_ELEMENT\
INT8U KeepTime:4;\
INT8U FrontBackSpeed:4;\
INT8U UpDownSpeed:4;\
INT8U TatakiLSpeed:4;\
INT8U TatakiHSpeed:4;\
INT8U TatakiMode:4;\
INT8U MomiSpeed:4;
#define COPY_SPEED(dest,src)\
dest.KeepTime=src.KeepTime;\
dest.FrontBackSpeed=src.FrontBackSpeed;\
dest.UpDownSpeed=src.UpDownSpeed;\
dest.TatakiLSpeed=src.TatakiLSpeed;\
dest.TatakiHSpeed=src.TatakiHSpeed;\
dest.TatakiMode=src.TatakiMode;\
dest.MomiSpeed=src.MomiSpeed;
typedef struct
{
SPEED_ELEMENT;
} MASS_SPED_STRUCT;
#define CNT_TECH_PARAM_LENGTH 14 //手技指令参数长度(ASCII的字符数)
typedef struct
{
INT8U RepeatNum:4;//升降反復次數
//0:無關,1~14:有限次數,15:無限循環
INT8U AreaDivNum:4;//每部位的分割点数
//0:無關 1~5:有效分割點數
INT8U ActStrength:4;//作動強度
//0:無關 1~A:有效段 B:出退原點 C:體型面 D:出退前限點
//按摩速度
SPEED_ELEMENT;
// INT8U KeepTime:4;//單一有效作動保持時間 0:無關,1~A:適用於指壓和捶打手技速度設置中的保持時間段
// INT8U FrontBackSpeed:4;//出退速度 0: 無關 1~A:有效段 F:停止
// INT8U UpDownSpeed:4;//升降速度 0: 無關 1~A:有效段 F:停止
// INT8U TatakiLSpeed:4;//捶打雙速或循環多速時的最低速度段,或單一速度時的速度段:0: 無關 1~A:有效段 F:停止
// INT8U TatakiHSpeed:4;//捶打雙速或循環多速時的最高速度段:0: 無關 1~A:有效段;F:停止 單一速度時為F
// INT8U TatakiMode:4;//捶打控速方式 0: 無關 1:單一速度 2:雙速交替 3:循環多速 F:停止
// INT8U MomiSpeed:4;//揉捏速度,0: 無關,1~A:有效段,F:停止
INT8U ActWidth:2;//作動寬度
//0:無關,1:寬,2:中,3:窄
INT8U YEnd:3;//按摩范圍終點
//0:無關,1~6:A~F
INT8U YBegin:3;//按摩范圍起點
//0:無關,1~6:A~F
INT8U RepeatMode:2;//升降反復形式
//0:無關,1:單向升降,2:雙向升降
INT8U FollowMode:2;//作動形式
//0:無關,1:升降同步作動,2:定距間隔作動
INT8U MassMode:4;//手技形式
//0:無關,1:揉捏正轉,2:揉捏反轉,3:捶打,4:指壓,5:撫摸,6:上下滾輪,7:有感肩壓,8:揉捏捶打,9:揉捏指壓,10:出退指壓,11:無感肩壓,12:部位移动,15:體型感知
}MASS_TECH_STRUCT;
//*********************************************手技内容定义**************************************
//手技变量MassTech中的无效值定义
#define TECH_VOID 0x00
//手技形式MassTech.MassMode内容
#define TECH_MODE_MOMI_CW 0x01
#define TECH_MODE_MOMI_CCW 0x02
#define TECH_MODE_TATAKI 0x03
#define TECH_MODE_PRS 0x04
#define TECH_MODE_RUB 0x05
#define TECH_MODE_ROLL 0x06
#define TECH_MODE_SHDR_PRS_WTH_DTCT 0x07
#define TECH_MODE_MOMI_TATAKI 0x08
#define TECH_MODE_MOMI_PRS 0x09
#define TECH_MODE_FB_PRS 0x0A
#define TECH_MODE_SHDR_PRS 0x0B
#define TECH_MODE_POSIT_MOVE 0x0C
#define TECH_MODE_BODY_DTCT 0x0F
//作動形式MassTech.FollowMode内容
#define TECH_FLW_SYNCH 0x01
#define TECH_FLW_ALTER 0x02
//升降反復形式MassTech.RepeatMode内容
#define TECH_RPT_DIRECT 0x01
#define TECH_RPT_BIDIRECT 0x02
//按摩范圍设置MassTech.YBegin和MassTech.YEnd内容
#define TECH_BOUND_BASE 0x01
#define TECH_BOUND_EAR 0x02
#define TECH_BOUND_SHDR 0x03
#define TECH_BOUND_BACK 0x04
#define TECH_BOUND_WAIST 0x05
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -