⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mass.h

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -