初级会员

- 积分
- 67
- 金钱
- 67
- 注册时间
- 2016-12-7
- 在线时间
- 22 小时
|

楼主 |
发表于 2016-12-7 17:48:01
|
显示全部楼层
在主函数里调用MOTOR_Run(1000,MOTOR_FALL,MOTOR_Forward),运行正常。
在通信函数里调用MOTOR_Run(1000,MOTOR_FALL,MOTOR_Forward),运行就不正常,就多了一次函数嵌套就不行了
void MOTOR_Run(u16 RUN_Len,MOTOR_TypeFlag MotorType,MOTOR_DirectFlag MorotDirect)
{
float MOTOR_RUN_PwmNum;
MOTOR_TYPE_CURRENT=MotorType; //保存电机运行方式
MOTOR_DIRECT_CURRENT=MorotDirect;
//MOTOR_TIM8_Channel(MotorType);
//MOTOR_TIM8_PwmInit(17999,0,8999,MotorType); //TIM8电机PWM初始化 每秒走5mm 丝杠导程=2mm
CHECK_ReadMotorPlace();
if(MotorType==MOTOR_LEVEL)
{
MOTOR_RUN_PwmNum=(float)((RUN_Len/100)/0.00375); //0.12mm/32细分=0.00375
MOTOR_PWM_Num=MOTOR_RUN_PwmNum;
MOTOR_RUN_PwmNum-=MOTOR_PWM_Num;
if(MOTOR_RUN_PwmNum>=0.5)
MOTOR_PWM_Num++;
MOTOR_TIM8_PwmInit(11249,0,5624,MotorType); //TIM8电机PWM初始化 每秒走12mm 丝杠导程=12mm
}
else
{
MOTOR_PWM_Num=RUN_Len*8; //本次运行总脉冲数 0.01mm对应8个PWM脉冲
MOTOR_TIM8_PwmInit(17999,0,8999,MotorType); //TIM8电机PWM初始化 每秒走5mm 丝杠导程=2mm
}
delay_ms(10);
MOTOR_PWM_Count=0; //脉冲计数清零
if(MorotDirect==MOTOR_Forward) //正向
{
if(MotorType==MOTOR_RISE)
TIM5->CNT=0;
if(MotorType==MOTOR_LEVEL)
TIM1->CNT=0;
if(MotorType==MOTOR_DROP)
TIM4->CNT=0;
if(MotorType==MOTOR_FALL)
TIM3->CNT=0;
}
else //反向
{
if(MotorType==MOTOR_RISE)
TIM5->CNT=64000;
if(MotorType==MOTOR_LEVEL)
TIM1->CNT=64000;
if(MotorType==MOTOR_DROP)
TIM4->CNT=64000;
if(MotorType==MOTOR_FALL)
TIM3->CNT=64000;
}
MOTOR_PSC_Config();
MOTOR_ChipEnable(MotorType,DISABLE); //电机不使能
MOTOR_UpDown(MotorType,MorotDirect); //电机运行方向
MOTOR_ChipEnable(MotorType,ENABLE); //电机使能
TIM_Cmd(TIM8,ENABLE); //运行电机
}
int main(void)
{
u8 i;
u16 t;
u16 len;
/**************************延时初始化*******************************/
delay_init();
delay_ms(3000);
/******************************中断优先级设置******************************/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
/******************************定时************************************/
TIMER_TIM6_Init(10000,72); //72分频 定时10MS
/**********************************************************************/
uart3_init(9600); //CCD通信
uart4_init(9600); //采样器通信
uart5_init(9600); //主机通信
/******************************传感器初始化*****************************/
SENSER_Init();
/******************************编码器************************************/
ENCODER_RISE_TIM5_Init(); //CLK3上升电机编码器初始化
ENCODER_LEVEL_TIM1_Init(); //CLK1水平电机编码器初始化
ENCODER_DROP_TIM4_Init(); //CLK2点样电机编码器初始化
ENCODER_FALL_TIM3_Init(); //CLK4下落电机编码器初始化
/********************************电机***********************************/
MOTOR_Rise_ControlInit();
MOTOR_LEVEL_ControlInit();
MOTOR_DROP_ControlInit();
MOTOR_FALL_ControlInit();
MOTOR_PSC_Config();
MOTOR_TIM8_NVIC_CHX_Init();
MOTOR_Run(0,MOTOR_DROP,MOTOR_Forward);
//MOTOR_TIM8_Channel(MOTOR_LEVEL);
//MOTOR_TIM8_PwmInit(17999,0,8999,MOTOR_RISE); //TIM8电机PWM初始化 每秒走5mm 丝杠导程=2mm
/*******************************自检复位**********************************************/
//CHECK_SelfInspect();
/****************************自检完成后蜂鸣器响*************************************************/
BEEP_TIM2_Init(400,72,200); //72分频 72MHz/72=1M 2500Hz=1MHz/400
TIM_Cmd(TIM2,ENABLE); //开启蜂鸣器
delay_ms(200);
TIM_Cmd(TIM2,DISABLE); //关闭蜂鸣器
delay_ms(200);
TIM_Cmd(TIM2,ENABLE); //开启蜂鸣器
delay_ms(800);
TIM_Cmd(TIM2,DISABLE); //关闭蜂鸣器
while(1)
{
if(USART5_RX_STA&0x8000)//主机通信
{
COMM_UART5_MostComm(); //通信运行电机
}
if(COMM_CheckStart==0xaa)//启动检测
{
COMM_CheckStart=0x00;
CHEAK_Start(CHECK_MODE);
}
if(SENSER_RisePlace==1) //传感器
{
MOTOR_Run(1000,MOTOR_FALL,MOTOR_Forward); //电机运行 10.00mm
delay_ms(500);
}
delay_ms(1);
}
}
void COMM_UART5_MostComm(void)
{
u8 ReturnLen;
u16 Run_Len;
u32 Card_NUM;
//u8 ReturnData[12]={0x5a,0xa5,0x00,0x00,0x00,0x35,0x53,0x00,0x00,0x00,0x35,0x53};
u8 ReturnData_7BY[7]={0x5a,0xa5,0x81,0x11,0x11,0x35,0x53};
USART5_RX_STA=0;
if(USART5_RX_BUF[0]==0x5A&&USART5_RX_BUF[1]==0xA5)
{
if(USART5_RX_BUF[2]==0x51)
{
if(USART5_RX_BUF[3]==0xA0&&USART5_RX_BUF[4]==0x0A) //蜂鸣器响
{
BEEP_TIME=40; //报警计时 响400Ms 定时器5定时10MS
TIM_Cmd(TIM2,ENABLE); //开启蜂鸣器
TIM_Cmd(TIM6,ENABLE); //开启蜂鸣器计时
}
else if(USART5_RX_BUF[3]==0xA1&&USART5_RX_BUF[4]==0x1A)//自动模式
{
COMM_CheckStart=0xaa;
CHECK_MODE=MOTOR_AUTO_MODE;
}
else if(USART5_RX_BUF[3]==0xA2&&USART5_RX_BUF[4]==0x2A)//手动模式
{
COMM_CheckStart=0xaa;
CHECK_MODE=MOTOR_MANU_MODE;
}
else if(USART5_RX_BUF[3]==0xA3&&USART5_RX_BUF[4]==0x3A)//检测器复位
{
///////////////////////////////////////////////////////////////
if(SENSER_LevelStart==1)
{
MOTOR_Run(40000,MOTOR_LEVEL,MOTOR_Reversal); //水平电机反转400mm
while(SENSER_LevelStart==1);
TIM_Cmd(TIM8,DISABLE);
MOTOR_ChipEnable(MOTOR_LEVEL,DISABLE); //至复位位置关闭水平电机
STMFLASH_DataTemp[STMFLASH_LevelPlace_BYTE3]=0;
STMFLASH_DataTemp[STMFLASH_LevelPlace_BYTE2]=0;
STMFLASH_DataTemp[STMFLASH_LevelPlace_BYTE1]=0;
STMFLASH_DataTemp[STMFLASH_LevelPlace_BYTE0]=0;
STMFLASH_Write(STMFLASH_FLASH_SAVE_ADDR,(u16*)STMFLASH_DataTemp,STMFLASH_DataTemp_SIZE); // 保存水平电机复位位置
}
/////////////////////////////////////////////////////////////////
if(SENSER_RisePlace==0)
{
while(SENSER_RisePlace==0&&SENSER_RiseTop!=0) //卡没送进槽,托盘没运行到顶部
{
MOTOR_Run(800,MOTOR_RISE,MOTOR_Reversal); //反转上升电机8mm向上推盘
while((TIM8->CR1&0x0001)==1); //等待电机停
}
}
if(SENSER_RisePlace==1)
{
MOTOR_Run(800,MOTOR_RISE,MOTOR_Forward); //正转上升电机8mm向下推盘
while((TIM8->CR1&0x0001)==1); //等待电机停
}
///////////////////////////////////////////////////////////////
if(SENSER_FallPlace==0)
{
while(SENSER_FallPlace==0&&SENSER_FallTop!=0) //卡没送存卡槽,托盘没运行到顶部
{
MOTOR_Run(800,MOTOR_FALL,MOTOR_Reversal); //反转存盘电机8mm向上推盘
while((TIM8->CR1&0x0001)==1); //等待电机停
}
}
if(SENSER_FallPlace==1)
{
MOTOR_Run(800,MOTOR_RISE,MOTOR_Forward); //正转存盘电机8mm向下推盘
while((TIM8->CR1&0x0001)==1); //等待电机停
}
///////////////////////////////////////////////////////
}
else if(USART5_RX_BUF[3]==0xA4&&USART5_RX_BUF[4]==0x4A)//加盘
{
if(SENSER_RiseBottom==1)
{
MOTOR_Run(20000,MOTOR_RISE,MOTOR_Forward); //推盘电机正转到复位位置
while(SENSER_RiseBottom==1); //等待到达推盘电机复位传感器
TIM_Cmd(TIM8,DISABLE);
MOTOR_ChipEnable(MOTOR_RISE,DISABLE);
STMFLASH_DataTemp[STMFLASH_RisePlace_BYTE3]=0;
STMFLASH_DataTemp[STMFLASH_RisePlace_BYTE2]=0;
STMFLASH_DataTemp[STMFLASH_RisePlace_BYTE1]=0;
STMFLASH_DataTemp[STMFLASH_RisePlace_BYTE0]=0;
STMFLASH_Write(STMFLASH_FLASH_SAVE_ADDR,(u16*)STMFLASH_DataTemp,STMFLASH_DataTemp_SIZE); // 保存推盘电机复位位置
}
}
else if(USART5_RX_BUF[3]==0xA5&&USART5_RX_BUF[4]==0x5A)//取盘
{
if(SENSER_FallBottom==1)
{
MOTOR_Run(20000,MOTOR_FALL,MOTOR_Forward); //推存盘电机正转到复位位置
while(SENSER_FallBottom==1);
TIM_Cmd(TIM8,DISABLE);
MOTOR_ChipEnable(MOTOR_FALL,DISABLE); //至复位位置关闭水平电机
STMFLASH_DataTemp[STMFLASH_FallPlace_BYTE3]=0;
STMFLASH_DataTemp[STMFLASH_FallPlace_BYTE2]=0;
STMFLASH_DataTemp[STMFLASH_FallPlace_BYTE1]=0;
STMFLASH_DataTemp[STMFLASH_FallPlace_BYTE0]=0;
STMFLASH_Write(STMFLASH_FLASH_SAVE_ADDR,(u16*)STMFLASH_DataTemp,STMFLASH_DataTemp_SIZE); // 保存存盘电机复位位置
}
}
for(ReturnLen=0;ReturnLen<7;ReturnLen++)
{
USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据
while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
delay_us(10);
}
}
else if(USART5_RX_BUF[2]==0x59) //读取待检测盘数
{
CHECK_ReadMotorPlace();
Card_NUM=CHEAK_RiseMotorCurPlase/800;
if(CHEAK_RiseMotorCurPlase%800>=790)
Card_NUM++;
ReturnData_7BY[2]=0x89; //命令
ReturnData_7BY[3]=Card_NUM%0x100; //盘数
ReturnData_7BY[4]=Card_NUM%0x100; //盘数
for(ReturnLen=0;ReturnLen<7;ReturnLen++)
{
USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据
while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
delay_us(10);
}
}
else if(USART5_RX_BUF[2]==0x5B) //读取已检测盘数
{
CHECK_ReadMotorPlace();
Card_NUM=CHEAK_FallMotorCurPlase/800;
if(CHEAK_FallMotorCurPlase%800>=790)
Card_NUM++;
ReturnData_7BY[2]=0x8B; //命令
ReturnData_7BY[3]=Card_NUM%0x100; //盘数
ReturnData_7BY[4]=Card_NUM%0x100; //盘数
for(ReturnLen=0;ReturnLen<7;ReturnLen++)
{
USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据
while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
delay_us(10);
}
}
else if(USART5_RX_BUF[2]==0x5C) //读取自检结果
{
ReturnData_7BY[2]=0x8B; //命令
for(ReturnLen=0;ReturnLen<3;ReturnLen++)
{
USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据 //5A A5 8B
while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
delay_us(10);
}
for(ReturnLen=0;ReturnLen<16;ReturnLen++)
{
USART_SendData(UART5,CHECK_SelfInspectData[ReturnLen]);//向串口5发送数据 //自检16个字节数据
while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
delay_us(10);
}
for(ReturnLen=5;ReturnLen<7;ReturnLen++)
{
USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据 //0D 0A
while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
delay_us(10);
}
}
else if(USART5_RX_BUF[2]==0x5D) //电机运行
{
MOTOR_Run(1000,MOTOR_FALL,MOTOR_Forward); //电机运行 10.00mm
// Run_Len=USART5_RX_BUF[5]*256+USART5_RX_BUF[6];
// MOTOR_Run(Run_Len,(MOTOR_TypeFlag)USART5_RX_BUF[3],(MOTOR_DirectFlag)USART5_RX_BUF[4]);
//
// for(ReturnLen=0;ReturnLen<7;ReturnLen++)
// {
// USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据
// while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
// delay_us(10);
// }
}
}
} |
|