📄 movementcontrol_function.c.bak
字号:
#include "includes.h"
#include "movement_control.h"
#include "MovementDefine.h"
#include "MovementControl_Function.h"
//Automatic Prototypes
void ZeroPosition_Execute(void);
void ZeroPosition_Status(void);
void SID_Execute(void);
void ImageLinkage_Execute(void);
void ImageLinkage_Status(void);
void Longitud_Execute(void);
void Longitud_Status(void);
void TubeLongitud_Execute(void);
void TubeLongitud_Status(void);
void Tabletop_LateralExecute(void);
void Tabletop_LateralStatus(void);
void Table_TilitExecute(void);
void Table_TilitStatus(void);
void InitHardware(void);
void PORT_Init(void);
void SYSCLK_Init (void);
void InitTimer0(void);
//初始化定时器0 ------ 系统时钟
void InitTimer0(void)
{
TMOD |= 0x01; //定时器0:模式1(16位定时器),仅受TR0控制
TH0 = 0xBE; //定义Tick=100次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(20M)
TL0 = 0xE4; //OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
ET0=1; //允许T0中断
TR0=1;
}
/***********************************************************************************
FUNCTON NAME: SYSCLK_Init
FUNCTION VERSION:
CREATED ON:
FUNCTION DESCRIPTION: This routine initializes the system clock to use an 20MHz crystal as its clock source.
INPUT PARAMETER: None
RETURN VALUE: None
MODIFY RECORD:
***********************************************************************************/
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
//------------------------------------------------------------------------------------
/*************************************************************************************
FUNCTON NAME: PORT_Init
FUNCTION VERSION:
CREATED ON:
FUNCTION DESCRIPTION: intialize the port input and output
INPUT PARAMETER:None
RETURN VALUE:None
MODIFY RECORD:
*************************************************************************************/
void PORT_Init(void)
{
}
//------------------------------------------------------------------------------------
/******************************************************************************************************************
FUNCTON NAME : init_devices
FUNCTION VERSION :
CREATED ON :
FUNCTION DESCRIPTION : 设置硬件寄存器的初始值。
初始化定时器0,作为ucOS-II的系统时钟。
还有其他的与硬件相关的初始化也可以放在这里。
INPUT PARAMETER : None
RETURN VALUE : None
MODIFY RECORD :
******************************************************************************************************************/
void InitHardware(void)
{
WDTCN = 0xde; //禁止看门狗
WDTCN = 0xad;
SYSCLK_Init ();
PORT_Init ();
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P1MDOUT = 0xFF;
}
//----------------------------------------------------------------------------------------------------------------
/******************************************************************************************************************
FUNCTON NAME : Table_TilitStatus
FUNCTION VERSION :
CREATED ON :
FUNCTION DESCRIPTION :
INPUT PARAMETER : None
RETURN VALUE : None
MODIFY RECORD :
REMARK : _________________
断开延时定时器: Control Signal: _____| |________________
________________________
Timer Flag : _____| |_________
******************************************************************************************************************/
void Table_TilitStatus(void)
{
//19--
//注:Q_正倾 上升沿 || Q_负倾 上升沿
// --->> 开启 床体倾斜 断开延时 定时器
if(IS_POS_EDGE(Output_1,Q_T_TilitPOS) || IS_POS_EDGE(Output_1,Q_T_TilitNEG))
{
SOFT_TIMER_RUN(Tilit_Timer,TOF,1000);
}
//注:Q_正倾 下降沿 || Q_负倾 下降沿
// --->> 停止 床体倾斜 断开延时 定时器 (使其开始计时1S)
if(IS_NEG_EDGE(Output_1,Q_T_TilitPOS) || IS_NEG_EDGE(Output_1,Q_T_TilitNEG))
{
SOFT_TIMER_STOP(Tilit_Timer);
}
//21--从正90度到正角度区
//注:I_正90度限位 下降沿
// --->> 置位A_正角度区域 、 清位A_水平区域 、 清位A_负角度区域
if(IS_NEG_EDGE(Tilit_Switch,I_T_P90))
{
SET_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_ZERO);
CLR_STATUS(Tilit_Switch,A_Table_NEG);
}
//22--水平位置位(抗齿轮间隙扰动) A_Table_POS(正角度区域标志)A_Table_NEG(负角度区域标志)条件避免再次置位
//注:I_0度限位 上升沿 并且 A_正角度区域标志 && V_床体倾斜断开延时定时器 计时到 标志
// --->> 置位A_水平区域 、 清位A_正角度区域 、 清位A_负角度区域
if(IS_POS_EDGE(Tilit_Switch,I_T_0))
{
if(CHECK_STATUS(Tilit_Switch,A_Table_POS) && CHECK_STATUS(Soft_Timer[Tilit_Timer],Timer_Flag))
{
SET_STATUS(Tilit_Switch,A_Table_ZERO);
CLR_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_NEG);
}
}
//注:I_0度限位 下降沿 并且 A_负角度区域标志 && V_床体倾斜断开延时定时器 计时到 标志
// --->> 置位A_水平区域 、 清位A_正角度区域 、 清位A_负角度区域
if(IS_NEG_EDGE(Tilit_Switch,I_T_0))
{
if(CHECK_STATUS(Tilit_Switch,A_Table_NEG) && CHECK_STATUS(Soft_Timer[Tilit_Timer],Timer_Flag))
{
SET_STATUS(Tilit_Switch,A_Table_ZERO);
CLR_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_NEG);
}
}
//--从零度到正角度区(置标志位)床体位置是其它位置标志的条件(加入 I_T_0 的常闭条件用以防止在水平限位开关有效时搬动床体运动手柄对床体旋转的扰动)
//注:A_水平区域 && !I_0度限位开关 && Q_正倾
// --->> 置位A_正角度区域 、 清位A_水平区域
if(CHECK_STATUS(Tilit_Switch,A_Table_ZERO) && !CHECK_STATUS(Tilit_Switch,I_T_0) && CHECK_STATUS(Output_1,Q_T_TilitPOS))
{
SET_STATUS(Tilit_Switch,A_Table_POS);
CLR_STATUS(Tilit_Switch,A_Table_ZERO);
}
//--从零度到负角度区
//注:A_水平区域 && !I_0度限位开关 && Q_负倾
// --->> 置位A_负角度区域 、 清位A_水平区域
if(CHECK_STATUS(Tilit_Switch,A_Table_ZERO) && !CHECK_STATUS(Tilit_Switch,I_T_0) && CHECK_STATUS(Output_1,Q_T_TilitNEG))
{
SET_STATUS(Tilit_Switch,A_Table_NEG);
CLR_STATUS(Tilit_Switch,A_Table_ZERO);
}
//--到限位位置清区域位置标志位
//注:I_负90度限位 || I_正90度限位
// --->> 清位A_正角度区域 、 清位A_负角度区域
if(CHECK_STATUS(Tilit_Switch,I_T_N90) || CHECK_STATUS(Tilit_Switch,I_T_P90))
{
CLR_STATUS(Tilit_Switch,A_Table_NEG);
CLR_STATUS(Tilit_Switch,A_Table_POS);
}
//27--从负90度到达负角度区
//注:I_负90度 下降沿
// --->> 置位A_负角度区域 、 清位A_正角度区域
if(IS_NEG_EDGE(Tilit_Switch,I_T_N90))
{
SET_STATUS(Tilit_Switch,A_Table_NEG);
CLR_STATUS(Tilit_Switch,A_Table_POS);
}
//69--PHILIPS控制台负倾允许在水平位切换;床体在水平位置时,逆时针运动命令的上升沿则置位负倾允许标志
if(CHECK_STATUS(Local_Flag_2,V_GIM_PMS))
{
if(IS_POS_EDGE(Control_1,C_T_TilitNEG) && CHECK_STATUS(Tilit_Switch,A_Table_ZERO))
{
SET_STATUS(Local_Flag_1,V_Tilit_EnENG);
}
if(!CHECK_STATUS(Tilit_Switch,A_Table_ZERO))
{
CLR_STATUS(Local_Flag_1,V_Tilit_EnENG);
}
}
//边沿更新
UPDATE_EDGE(Output_1);
UPDATE_EDGE(Tilit_Switch);
}
//---------------------------------------------------------------------------------------------------------------
/****************************************************************************************************************
FUNCTON NAME : Table_TilitExecute
FUNCTION VERSION :
CREATED ON :
FUNCTION DESCRIPTION :
INPUT PARAMETER :
RETURN VALUE :
MODIFY RECORD :
*****************************************************************************************************************/
void Table_TilitExecute(void)
{
//1--正转输出控制
//注:C_正倾 && !C_负倾 && !Q_负倾
// --->> 启动 Q_正倾
if(CHECK_STATUS(Control_1,C_T_TilitPOS) && !CHECK_STATUS(Control_1,C_T_TilitNEG) && !CHECK_STATUS(Output_1,Q_T_TilitNEG))
{
SET_STATUS(Output_1,Q_T_TilitPOS);
}
//注:!C_正倾 || C_负倾 || I_正90限位
// --->> 停止 Q_正倾
if(!CHECK_STATUS(Control_1,C_T_TilitPOS) || CHECK_STATUS(Control_1,C_T_TilitNEG) || CHECK_STATUS(Tilit_Switch,I_T_P90))
{
CLR_STATUS(Output_1,Q_T_TilitPOS);
}
//3--反转输出控制
//注:C_负倾 && !C_正倾 && !Q_正倾 并且 I_正90度限位 || A_正角度区域性
// --->> 启动 Q_负倾
if(CHECK_STATUS(Control_1,C_T_TilitNEG) && !CHECK_STATUS(Control_1,C_T_TilitPOS) && !CHECK_STATUS(Output_1,Q_T_TilitPOS))
{
if(CHECK_STATUS(Tilit_Switch,I_T_P90) || CHECK_STATUS(Tilit_Switch,A_Table_POS))
{
SET_STATUS(Output_1,Q_T_TilitNEG);
}
}
//注:!C_负倾 || A_水平区域
// --->> 停止 Q_负倾
if(!CHECK_STATUS(Control_1,C_T_TilitNEG) || CHECK_STATUS(Tilit_Switch,A_Table_ZERO))
{
CLR_STATUS(Output_1,Q_T_TilitNEG);
}
//5--
//注:C_负倾 && A_水平区域 && !Q_正倾 并且 V_负倾允许标志
// --->> 启动 Q_负倾
if(CHECK_STATUS(Control_1,C_T_TilitNEG) && CHECK_STATUS(Tilit_Switch,A_Table_ZERO) && !CHECK_STATUS(Output_1,Q_T_TilitPOS))
{
if(CHECK_STATUS(Local_Flag_1,V_Tilit_EnENG))
{
SET_STATUS(Output_1,Q_T_TilitNEG);
}
}
//6--
//注:C_负倾 && A_负角度区域 && !Q_正倾
// --->> 启动 Q_负倾
if(CHECK_STATUS(Control_1,C_T_TilitNEG) && CHECK_STATUS(Tilit_Switch,A_Table_NEG) && !CHECK_STATUS(Output_1,Q_T_TilitPOS))
{
SET_STATUS(Output_1,Q_T_TilitNEG);
}
//注:!C_负倾 && I_负90度限位
// --->> 停止 Q_负倾
if(!CHECK_STATUS(Control_1,C_T_TilitNEG) || CHECK_STATUS(Tilit_Switch,I_T_N90) )
{
CLR_STATUS(Output_1,Q_T_TilitNEG);
}
//输出保护
//注:I_正90度限位
// --->> 停止 Q_正倾
if(CHECK_STATUS(Tilit_Switch,I_T_P90))
{
CLR_STATUS(Output_1,Q_T_TilitPOS);
}
//注:I_负90度限位
// --->> 停止 Q_负倾
if(CHECK_STATUS(Tilit_Switch,I_T_N90))
{
CLR_STATUS(Output_1,Q_T_TilitNEG);
}
//注:Q_正倾 && Q_负倾
// --->> 停止 Q_正倾 停止 Q_负倾
if(CHECK_STATUS(Output_1,Q_T_TilitPOS) && CHECK_STATUS(Output_1,Q_T_TilitNEG))
{
CLR_STATUS(Output_1,Q_T_TilitPOS);
CLR_STATUS(Output_1,Q_T_TilitNEG);
}
}
//---------------------------------------------------------------------------------------------------------------
/****************************************************************************************************************
FUNCTON NAME : Tabletop_LateralStatus
FUNCTION VERSION :
CREATED ON :
FUNCTION DESCRIPTION :
INPUT PARAMETER :
RETURN VALUE :
MODIFY RECORD :
******************************************************************************************************************/
void Tabletop_LateralStatus(void)
{
if(IS_POS_EDGE(Output_1,Q_La_MoveOutside) || IS_POS_EDGE(Output_1,Q_La_MoveInside))
{
SOFT_TIMER_RUN(Lateral_Timer,TOF,1000);
}
if(IS_NEG_EDGE(Output_1,Q_La_MoveOutside) || IS_NEG_EDGE(Output_1,Q_La_MoveInside))
{
SOFT_TIMER_STOP(Lateral_Timer);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -