optical/SEW-EXA1/Users/App/sewhead/sewhead.c
2025-09-04 09:45:08 +08:00

2192 lines
43 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//-------------------------------------------------------------------------------
// File Name: sewhead.c
// Brief:
// Version: 1.0.0
// Create Date: 2024/10/11
// Create by: W.X
// Copyright:
// TIANJIN GETONAGAIN TECHNOLOGY CO., LIMITED
// All rights reserved.
//
// Modify by: W.X
// Modify Date: 2024/10/17
//-------------------------------------------------------------------------------
#define _IN_HEADBOARD_C
#include "sewhead.h"
#if (BOARD_USE_FOR == SEW_HEAD)
#include "trigger.h"
#include "inout.h"
#include "debug.h"
#include "workctrl.h"
#include "shell.h"
#include "delay.h"
#include "modbus_def.h"
#include "modbus_s.h"
#include "modbus_m.h"
#include "canwork.h"
#include "para.h"
typedef void (*PwmFunc)(void);
PwmFunc D29PwmProc = NULL;
void RefreshOutputSta(void);
void OutputCtrl(u8 num, u8 onof);
void PwmCtrlTask(void);
void InitSTM32PwmTimer(void);
void InitSoftPwmCtrl(PwmFunc proc);
void SoftPwmIntProc(void);
void InOutStaRefreshTask(void);
#if(CONTROL_BUS == COMM_485)
void InOutWorkTask(Rs485Cmd * pCmd);
#endif
void ModBusCmdProcTask(Rs485Cmd * pCmd);
void RefreshElasticMoto(void);
void TopThreadBreakCheck(void);
void ModBusReceiveProc(Rs485Cmd *cmd);
int MotoMoveAsOfst(int mode, int ofst, spdCtrl *spd, int block);
void FootMotoDis(void);
void FootMotoEn(void);
void FollowEcdOutPulseOn(void);
void FollowEcdOutPulseOff(void);
void FollowEcdOutDirOn(void);
void FollowEcdOutDirOff(void);
void FootMotoToZero(void);
void CheckParasValue(void);
void PFootCtrlUp(void);
void PFootCtrlDown(void);
void PFootCtrlBack(void);
void SetMotoPosValue(u16 pos,u16 value);
void TestAction(char * para1, char * para2);
#define CHK_TIME_GAP 10 // 发送时间间隔, 单位 100us
#define MODRSV_TIMEOUT 820 // 读取超时时间, 单位为 CHK_TIME_GAP * 100us
#define MODSEND_GAP 50 // 发送和读取的间隔, 单位为 CHK_TIME_GAP * 100us
//-------------------------------------------------------------------------------
#define BUF_TAB_SIZE 1000 // 缓冲区大小
typedef struct
{
u8 boardId;
u8 outputSta;
u8 inputSta;
u8 outputCtrl;
u8 pwmOutputFlag;
u8 softLockSta;
// u16 d29cmdReg[MODBUS_REG_MAX-MODBUS_REG_MIN];
u16 pwmCtrl; // 输出占空比 0~100
u16 pwmFreq; // 定时器PWM频率
u16 pwmCount;
u32 timeCount;
u32 pwmPulsTime;
u32 startTime; // 启动时间
u32 chgTime; // 变化次数
u32 cmprbuf; // 分频系数缓存
int workingSta;
u32 tabIdx; // 缓存表索引
u32 chgTimeTab[BUF_TAB_SIZE]; // 变更次数缓存表
u32 curTimeTab[BUF_TAB_SIZE]; // 变更次数缓存表
u8 pwmTab[BUF_TAB_SIZE]; // PWM缓存缓存表
u8 outsta;
u8 outOtFlag;
u8 workFlag;
u16 enable;
u16 adcvalue;
u16 thrdBreakFlag;
u16 mtWkSta[8];
u32 outTime;
u32 enflag;
u32 stopAngle;
u32 encoderValue;
s32 footMtPos;
u32 followRunNum;
int followStartPPos;
int followStartNPos;
u32 followConPAng;
u32 followConNAng;
u32 pfootFlLowPos;
u32 followEcdEn;
u32 followCountr;
u32 followStepNum;
u32 followNumLow;
u32 followNumHigh;
int followTableIdx;
int followEcdDir;
int followEcdCheck;
int followChangeFlag;
u32 followChangeNum;
int setParasFlag;
u32 setParasTime;
int pfootSta;
u32 pfootRunHighPos;
u32 pfootFlowPAng; // 压脚跟踪上升位
u32 pfootFlowNAng; // 压脚跟踪下降位
u32 pfootFlowPuls; // 压脚跟踪脉冲数
u32 pfootRunLowPos; // 压脚运行低位
u32 pfootRunBackPos; // 压脚运行回针位
s32 ecOfstValue; // 编码器差值
u32 pfootRunConAng; // 跟随持续角度
//------------
void (*FollowMotoPulseOn)(void);
void (*FollowMotoPulseOff)(void);
void (*FollowMotoSignOn)(void);
void (*FollowMotoSignOff)(void);
//------------
u32 thrdBreakCount;
u32 motocoordinate;
u16 headCmdReg[MODBUS_REG_MAX-MODBUS_REG_MIN];
}HeadCtrl;
HeadCtrl g_headCtrl;
//-------------------------------------------------------------------------------
u8 GetBoardSwitchValue(void)
{
u8 val = 0;
if(GetSwitch1Status() == SENSOR_ON)
{
val |= 0x01;
}
if(GetSwitch2Status() == SENSOR_ON)
{
val |= 0x02;
}
if(GetSwitch3Status() == SENSOR_ON)
{
val |= 0x04;
}
if(GetSwitch4Status() == SENSOR_ON)
{
val |= 0x08;
}
return val;
}
// 初始化
void InitSewHeadBoard(void)
{
memset(&g_headCtrl, 0, sizeof(HeadCtrl));
g_headCtrl.boardId = GetBoardSwitchValue();
if((g_headCtrl.boardId & 0x04) == 0)
{
InitSoftPwmCtrl(PwmCtrlTask);
#if(PWM_TIMER_CTRL == 1)
g_headCtrl.pwmOutputFlag = 1;
#endif
printf("initsoftpwmctrl.");
}
#if(CONTROL_BUS == COMM_485)
#if(COM_485_RTU == 1)
InitModbusS(COMM_USART2, B115200, '8', 'N', '1','R'); // 初始化485
#else
if((g_headCtrl.boardId & 0x08) != 0)
{
InitModbusS(COMM_USART2, B115200, '8', 'N', '1','R'); // 初始化485
}
else
{
InitModbusS(COMM_USART2, B115200, '8', 'N', '1','A'); // 初始化485
}
#endif
//InitModbusS(COMM_USART1,B115200, '9', 'E', '1', 'A'); // 串口3,115200波特率
InitModbusReg(MODBUS_REG_MIN, &g_headCtrl.d29cmdReg[0], (MODBUS_REG_MAX-MODBUS_REG_MIN));
InitModbusSCtrl(D29_BOARD_ID,30); // 配置modbus(收包超时时间:2ms)
RegModbusSCmdProc(ModBusCmdProcTask); // 外部函数
#endif
InitModbus_m(0,COMM_USART3, B115200, '8', 'N', '1','R'); // 初始化485
InitRs485Ctrl(MODRSV_TIMEOUT);
RegRsCmdProc(ModBusReceiveProc);
CheckParasValue();
g_headCtrl.pfootFlLowPos = g_headCtrl.pfootRunLowPos;
g_headCtrl.enflag = EN_FALG;
g_headCtrl.FollowMotoPulseOn = FollowEcdOutPulseOn;
g_headCtrl.FollowMotoPulseOff = FollowEcdOutPulseOff;
g_headCtrl.FollowMotoSignOn = FollowEcdOutDirOn;
g_headCtrl.FollowMotoSignOff = FollowEcdOutDirOff;
DelayRef(500);
FootMotoToZero();
SetEn485OutOff();
AddShellCmd("KEY", "test action", TestAction);
}
void InitSTM32PwmTimer(void)
{
#if(PWM_TIMER_CTRL == 1)
#else
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_TimeOCStructure;
/* 中断配置 */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; /* 通道 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /* 抢占式中断优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* 响应式中断优先级 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 使能中断 */
NVIC_Init(&NVIC_InitStructure);
/*IO配置*/
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(OUT7_RCC_APB2Periph, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
GPIO_InitStructure.GPIO_Pin = OUT6_GPIO_Pin | OUT7_GPIO_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_InitStructure.GPIO_Pin = OUT7_GPIO_Pin;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(OUT7_GPIO_PORT, &GPIO_InitStructure);
///* 定时器配置 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* 启动定时器时钟 */
TIM_DeInit(TIM3); /* 重新将Timer设置为缺省值 */
///* 时基配置 */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = (72-1); /* 预分频 */
TIM_TimeBaseStructure.TIM_Period = (3334-1); /* 自动装载值 500us中断*/
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /* 采样时钟 */
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* 向上计数模式 */
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* 初始化TIMx */
TIM_TimeOCStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_TimeOCStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_TimeOCStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_TimeOCStructure.TIM_Pulse = 0;
TIM_OC1Init(TIM3,&TIM_TimeOCStructure);
TIM_OC2Init(TIM3,&TIM_TimeOCStructure);
TIM_CtrlPWMOutputs(TIM3,DISABLE);
TIM_OC1PreloadConfig(TIM3,ENABLE);
TIM_OC2PreloadConfig(TIM3,ENABLE);
TIM_ARRPreloadConfig(TIM3,ENABLE);
//TIM_ClearFlag(TIM3, TIM_FLAG_Update); /* 清除溢出中断标志 */
//TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); /* 开启中断 */
TIM_Cmd(TIM3, ENABLE); /* 开启定时器 */
#endif
}
void SoftPwmIntProc(void)
{
#if(PWM_TIMER_CTRL == 1)
if (D29PwmProc != NULL)
{
D29PwmProc();
}
#else
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
if (D29PwmProc != NULL)
{
D29PwmProc();
}
}
#endif
}
void InitSoftPwmCtrl(PwmFunc proc)
{
// InitSTM32PwmTimer();
#if(PWM_TIMER_CTRL == 1)
// Tim1IntProc = SoftPwmIntProc;
D29PwmProc = proc;
g_headCtrl.pwmFreq = 100;
g_headCtrl.pwmCount = 0;
g_headCtrl.pwmCtrl = 0; // 初始占空比为0
#else
Tim3IntProc = SoftPwmIntProc;
D29PwmProc = proc;
g_headCtrl.pwmCtrl = 0;
g_headCtrl.pwmFreq = 3334;
#endif
}
void PwmCtrlTask(void)
{
#if(PWM_TIMER_CTRL == 1)
if(g_headCtrl.pwmCount < g_headCtrl.pwmCtrl)
{
g_headCtrl.pwmCount ++;
// if((g_headCtrl.pwmIOSta & 0x20) != 0)
{
SetOutputPWM1On();
SetOutputPWM2On();
}
}
else if(g_headCtrl.pwmCount < g_headCtrl.pwmFreq)
{
g_headCtrl.pwmCount ++;
if(g_headCtrl.pwmCount >= g_headCtrl.pwmFreq)
{
g_headCtrl.pwmCount = 0;
if(g_headCtrl.timeCount != 0)
{
if(g_headCtrl.timeCount == 1)
{
g_headCtrl.pwmPulsTime = GetUsSoftTimer();
}
g_headCtrl.timeCount ++;
if(g_headCtrl.timeCount >= 11)
{
g_headCtrl.timeCount = 0;
// printf("puls Freq:%d.\r\n",10000000/(GetUsSoftTimer() - g_headCtrl.pwmPulsTime));
}
}
}
SetOutputPWM1Off();
SetOutputPWM2Off();
}
else
{
g_headCtrl.pwmCount = 0;
// SetOutput6Off();
// SetOutput7Off();
}
// g_headCtrl.timeCount ++;
// if(g_headCtrl.timeCount > 20000)
// {
// u32 ntime = 0;
// ntime = GetMsSoftTimer();
// g_headCtrl.timeCount = 0;
//
// printf("timer init 1s,pwmCount = %d,time:%d.\r\n",g_headCtrl.pwmCount,ntime);
// }
#else
// g_headCtrl.timeCount ++;
// if(g_headCtrl.timeCount > 1000000/g_headCtrl.pwmFreq)
// {
// u32 ntime = 0;
// ntime = GetMsSoftTimer();
// g_headCtrl.timeCount = 0;
//
// printf("timer 1s,time:%d,pwm频率 = %dHz,pwm占空比 %d.\r\n",ntime,1000000/g_headCtrl.pwmFreq,g_headCtrl.pwmCtrl);
// }
#endif
}
void SysLedTask(void)
{
static u32 ledsta = 0;
static u32 ledtime = 0;
if(GetMsSoftTimer10() - ledtime >= 1000)
{
if(ledsta == 0)
{
SetSysLedOn();
ledsta = 1;
}
else
{
SetSysLedOff();
ledsta = 0;
}
ledtime = GetMsSoftTimer10();
}
}
void SewHeadBoardTask(void)
{
//SetParasTask();
Rs485Task();
#if(CONTROL_BUS == COMM_485)
ModbusSTask();
#endif
InOutStaRefreshTask();
SysLedTask();
}
void ModBusReceiveProc(Rs485Cmd *cmd)
{
if (cmd == NULL)
{
return;
}
memcpy(g_headCtrl.mtWkSta,cmd->rddat,16);
}
void SendMotoCtrlCmd(u16 cmd,u16 act)
{
Rs485Cmd ccmd;
memset(&ccmd,0,sizeof(Rs485Cmd));
ccmd.index = 10;
ccmd.cmd = MODBUS_WR;
ccmd.addr = cmd;
ccmd.wrdat[0] = act;
ccmd.wlen = 1;
ccmd.rlen = 0;
AddRs485Cmd(&ccmd);
}
void FootMotoCmdRst(void)
{
SendMotoCtrlCmd(MOTO_CTRL_CMD,MOTO_CMD_RST);
}
void FootMotoToZero(void)
{
SendMotoCtrlCmd(MOTO_CTRL_CMD,MOTO_TO_ZERO);
// SetSTM32Moto1RealPos(0);
}
void FootMotoDis(void)
{
SendMotoCtrlCmd(MOTO_CTRL_CMD,MOTO_DIS);
}
void FootMotoEn(void)
{
SendMotoCtrlCmd(MOTO_CTRL_CMD,MOTO_EN);
}
void FootMotoReset(void)
{
SendMotoCtrlCmd(MOTO_CTRL_CMD,MOTO_RESET);
}
void OutputStepOn(void)
{
if(g_headCtrl.followEcdDir == 1)
{
g_headCtrl.footMtPos ++;
}
else
{
g_headCtrl.footMtPos --;
}
SetMoto1StepOn();
}
#define FOLLOW_TAB_NUM 6
int FOLLOW_TABLE[FOLLOW_TAB_NUM] =
{
20,
16,
12,
8,
6,
3,
};
void GetFollowTableValue(u32 angle,u32 puls)
{
int i, temp,value,followec,sum = 0;
followec = angle*1000/360;
value = followec/puls;
for(i = 0; i<FOLLOW_TAB_NUM-1; i++)
{
FOLLOW_TABLE[i] = value + (4*(FOLLOW_TAB_NUM -2 - i));
sum += FOLLOW_TABLE[i];
}
temp = puls-((FOLLOW_TAB_NUM-1)*2);
FOLLOW_TABLE[FOLLOW_TAB_NUM-1] = (followec - sum*2)/temp;
}
void FollowEcdOutPulseOn(void)
{
if (g_headCtrl.followEcdEn != 0)
{
g_headCtrl.followCountr++;
if (g_headCtrl.followCountr >= g_headCtrl.followStepNum)
{
if(g_headCtrl.followNumHigh > g_headCtrl.followRunNum)
{
g_headCtrl.followNumHigh = 0;
g_headCtrl.followNumLow = 0;
g_headCtrl.followEcdEn = 0;
return;
}
OutputStepOn();
g_headCtrl.followCountr = 0;
g_headCtrl.followNumHigh++;
// 加速
if (g_headCtrl.followTableIdx < FOLLOW_TAB_NUM && g_headCtrl.followNumHigh < FOLLOW_TAB_NUM)
{
g_headCtrl.followTableIdx++; // 跟随运动的索引
g_headCtrl.followStepNum = FOLLOW_TABLE[g_headCtrl.followTableIdx]; // 装载新的值
}
// 降速
if(g_headCtrl.followNumHigh >= g_headCtrl.followRunNum - FOLLOW_TAB_NUM)
{
if(g_headCtrl.followTableIdx <= 0)
{
g_headCtrl.followTableIdx = 0;
}
g_headCtrl.followStepNum = FOLLOW_TABLE[g_headCtrl.followTableIdx]; // 装载新的值
g_headCtrl.followTableIdx--; // 跟随运动的索引
}
}
}
}
void FollowEcdOutPulseOff(void)
{
if (g_headCtrl.followEcdEn != 0)
{
if (g_headCtrl.followCountr * 2 + 1 >= g_headCtrl.followStepNum)
{
OutputStepOff();
g_headCtrl.followNumLow++;
}
}
}
void FollowEcdOutDirOn(void)
{
if (g_headCtrl.followEcdCheck != 0)
{
if (g_headCtrl.followEcdDir == 1)
{
OutputDirOn();
}
else
{
OutputDirOff();
}
}
}
void FollowEcdOutDirOff(void)
{
if (g_headCtrl.followEcdCheck != 0)
{
if (g_headCtrl.followEcdDir == 1)
{
OutputDirOff();
}
else
{
OutputDirOn();
}
}
}
void CheckParasValue(void)
{
g_headCtrl.followRunNum = g_headCtrl.pfootFlowPuls;
if(g_headCtrl.followRunNum == 0)
{
g_headCtrl.followRunNum = 40;
}
g_headCtrl.followStepNum = 3;
g_headCtrl.followStartPPos = g_headCtrl.pfootFlowPAng*1000/360 + g_headCtrl.ecOfstValue;
if(g_headCtrl.followStartPPos >= 1000)
{
g_headCtrl.followStartPPos -= 1000;
}
if(g_headCtrl.followStartPPos < 0)
{
g_headCtrl.followStartPPos += 1000;
}
if(g_headCtrl.followStartPPos == 0)
{
g_headCtrl.followStartPPos = 100;
}
g_headCtrl.followStartNPos = g_headCtrl.pfootFlowNAng*1000/360 + g_headCtrl.ecOfstValue;
if(g_headCtrl.followStartNPos >= 1000)
{
g_headCtrl.followStartNPos -= 1000;
}
if(g_headCtrl.followStartNPos < 0)
{
g_headCtrl.followStartNPos += 1000;
}
if(g_headCtrl.followStartNPos == 0)
{
g_headCtrl.followStartNPos = 600;
}
g_headCtrl.pfootRunLowPos = g_headCtrl.pfootRunLowPos;
if(g_headCtrl.pfootRunLowPos == 0)
{
g_headCtrl.pfootRunLowPos = 10;
}
g_headCtrl.pfootRunBackPos = g_headCtrl.pfootRunBackPos;
if(g_headCtrl.pfootRunBackPos == 0)
{
g_headCtrl.pfootRunBackPos = 10;
}
g_headCtrl.pfootRunHighPos = g_headCtrl.pfootRunLowPos + g_headCtrl.followRunNum;
if(g_headCtrl.pfootRunHighPos == 0)
{
g_headCtrl.pfootRunHighPos = 50;
}
g_headCtrl.followConPAng = g_headCtrl.pfootRunConAng;
if(g_headCtrl.followConPAng == 0)
{
g_headCtrl.followConPAng = 140;
}
else if(g_headCtrl.followConPAng >160)
{
g_headCtrl.followConPAng = 160;
}
GetFollowTableValue(g_headCtrl.followConPAng,g_headCtrl.followRunNum);
//GetFollowTableValue(g_headCtrl.followConNAng,g_headCtrl.followRunNum);
}
void SetMotoPosValue(u16 pos,u16 value)
{
SendMotoCtrlCmd(pos,value);
}
void PFootCtrlUp(void)
{
//MotoMoveAsOfst(1,100,NULL,0);
//SendMotoCtrlCmd(MOTO_CTRL_TOPOS,PFOOT_HIGH_POS);
SendMotoCtrlCmd(MOTO_CTRL_TOZPOS,g_headCtrl.pfootRunHighPos);
g_headCtrl.pfootSta = 1;
}
void PFootCtrlDown(void)
{
//MotoMoveAsOfst(1,30,NULL,0);
//SendMotoCtrlCmd(MOTO_CTRL_TOPOS,PFOOT_LOW_POS);
SendMotoCtrlCmd(MOTO_CTRL_TOZPOS,g_headCtrl.pfootRunLowPos);
g_headCtrl.pfootSta = 2;
g_headCtrl.followRunNum = g_headCtrl.pfootRunHighPos - g_headCtrl.pfootRunLowPos;
// g_headCtrl.followChangeNum = g_headCtrl.pfootRunHighPos - g_headCtrl.pfootRunLowPos;
// if(g_headCtrl.followChangeNum != g_headCtrl.followRunNum)
// {
// g_headCtrl.followChangeFlag = 1;
// g_headCtrl.pfootFlLowPos = g_headCtrl.pfootRunLowPos;
// }
}
void PFootCtrlBack(void)
{
//MotoMoveAsOfst(1,g_headCtrl.pfootRunBackPos,NULL,0);
SendMotoCtrlCmd(MOTO_CTRL_TOZPOS,g_headCtrl.pfootRunBackPos);
g_headCtrl.pfootSta = 2;
g_headCtrl.followRunNum = g_headCtrl.pfootRunHighPos - g_headCtrl.pfootRunBackPos;
// g_headCtrl.followChangeNum = g_headCtrl.pfootRunHighPos - g_headCtrl.pfootRunBackPos;
// if(g_headCtrl.followChangeNum != g_headCtrl.followRunNum)
// {
// g_headCtrl.followChangeFlag = 1;
// g_headCtrl.pfootFlLowPos = g_headCtrl.pfootRunBackPos;
// }
}
#if(CONTROL_BUS == COMM_485)
void ModBusCmdProcTask(Rs485Cmd * pCmd)
{
Rs485Cmd rCmd;
if (pCmd == NULL)
{
return;
}
memcpy(&rCmd, pCmd, sizeof(Rs485Cmd));
InOutWorkTask(pCmd);
if (rCmd.cmd == MODBUS_06WR)
{
switch (rCmd.addr)
{
case 0:
{
break;
}
case 1:
{
if (rCmd.wrdat[0] == 1)
{
g_headCtrl.followStepNum = FOLLOW_TABLE[0];
g_headCtrl.followEcdCheck = 1;
g_headCtrl.followEcdDir = 1;
g_headCtrl.footMtPos = GetSTM32Moto1RealPos();
g_headCtrl.followEcdEn = 0;
}
else
{
g_headCtrl.followEcdCheck = 0;
//g_headCtrl.pfootSta = 0;
}
break;
}
case 5:
{
g_headCtrl.followStepNum = FOLLOW_TABLE[0];
g_headCtrl.followEcdCheck = 1;
g_headCtrl.followEcdDir = 1;
g_headCtrl.footMtPos = GetSTM32Moto1RealPos();
//if(g_headCtrl.pfootSta == 0)
{
PFootCtrlDown();
}
g_headCtrl.followEcdEn = 0;
break;
}
case 2: // 压脚升降
{
if (rCmd.wrdat[0] == 1)
{
PFootCtrlUp();
}
else if (rCmd.wrdat[0] == 2)
{
PFootCtrlDown();
}
else if (rCmd.wrdat[0] == 3)
{
PFootCtrlBack();
}
g_headCtrl.followEcdEn = 0;
break;
}
case 3:
{
g_headCtrl.followStartNPos = rCmd.wrdat[0];
break;
}
case 4:
{
g_headCtrl.followStartPPos = rCmd.wrdat[0];
break;
}
case 11:
{
MotoMoveAsOfst(0,(s16)rCmd.wrdat[0],NULL,0);
break;
}
case 12:
{
MotoMoveAsOfst(1,(s16)rCmd.wrdat[0],NULL,0);
break;
}
case 20:
{
if(rCmd.wrdat[0] == 0)
{
FootMotoToZero();
}
else if(rCmd.wrdat[0] == 1)
{
FootMotoDis();
}
else if(rCmd.wrdat[0] == 2)
{
FootMotoEn();
}
else if(rCmd.wrdat[0] == 10)
{
FootMotoReset();
}
else
{
FootMotoCmdRst();
}
break;
}
case 50: // 设定压脚工作下位
{
if(rCmd.wrdat[0] == 0)
{
g_headCtrl.followChangeNum = g_headCtrl.followRunNum;
//g_headCtrl.followChangeFlag = 1;
}
else
{
g_headCtrl.followChangeNum = g_headCtrl.pfootRunHighPos - rCmd.wrdat[0];
g_headCtrl.pfootFlLowPos = rCmd.wrdat[0];
if(g_headCtrl.followChangeNum != g_headCtrl.followRunNum)
{
g_headCtrl.followChangeFlag = 1;
}
}
break;
}
case 100: // 校正编码器位置
{
int lpos;
lpos = rCmd.wrdat[0]*1000/36000;
g_headCtrl.ecOfstValue = g_headCtrl.encoderValue - lpos;
CheckParasValue();
SaveD32McPara();
break;
}
case 200: // 校正电机位置
{
break;
}
case 1000: // 配置参数
{
break;
}
case 10:
{// 输出
if (rCmd.wrdat[0] == 1)
{
SetOutput1On();
}
else// if (rCmd.wrdat[0] == 2)
{
SetOutput1Off();
}
if (rCmd.wrdat[0] == 1)
{
SetOutput1On();
}
else// if (rCmd.wrdat[0] == 2)
{
SetOutput1Off();
}
break;
}
default:
break;
}
}
else if (rCmd.cmd == MODBUS_10WR)
{
g_headCtrl.pfootFlowPAng = rCmd.wrdat[0];
g_headCtrl.pfootFlowNAng = rCmd.wrdat[1];
g_headCtrl.pfootFlowPuls = rCmd.wrdat[2];
g_headCtrl.pfootRunLowPos = rCmd.wrdat[3];
g_headCtrl.pfootRunConAng = rCmd.wrdat[4];
g_headCtrl.pfootRunBackPos = rCmd.wrdat[5];
CheckParasValue();
//g_headCtrl.setParasFlag = 1;
//SaveD32McPara();
}
}
#elif (CONTROL_BUS == COMM_CAN)
//-------------------------------------------------------------------------------
// CAN 命令处理
void CanCmdProc(void)
{
u32 exid;
int dev, tid, sid, cmd;
if (g_workCtrl.curBdCtrl.cmdFlag != 0)
{
g_workCtrl.curBdCtrl.cmdFlag = 0;
exid = g_workCtrl.curBdCtrl.ctrlCmd.cancomm.exId.id;
dev = GET_PRT_FROM_EXID(exid);
tid = GET_TID_FROM_EXID(exid);
sid = GET_SID_FROM_EXID(exid);
cmd = GET_CMD_FROM_EXID(exid);
if (cmd == BN_CMD_TRAVERSE) // 遍历命令
{
if (dev != BN_PROTOCOL_ALL || tid != BN_ID_BROADCAST)
{
return;
}
g_workCtrl.hostId = sid;
// ......功能待开发
}
else if (cmd == BN_CMD_EXCTRL) // 控制命令
{
SewHeadCommand * pCmd = (SewHeadCommand *)(&(g_workCtrl.curBdCtrl.ctrlCmd.cancomm.data.buff));
// printf("exctrl cmd=0x%x\r\n", pCmd->headCtrl.cmd);
switch(pCmd->headCtrl.cmd)
{
#if (BOARD_USE_FOR == SEW_HEAD)
case CTRL_CMD_SEW_HEAD_CTRL:
#endif
{
switch(pCmd->headCtrl.subcmd)
{
case CTRL_SUBCMD_SEW_DISABLE : // 机头控制功能关闭
{
printf("ctrl func close\r\n");
g_headCtrl.softLockSta = 1;
break;
}
case CTRL_SUBCMD_SEW_ENABLE : // 机头控制功能打开
{
printf("ctrl func en\r\n");
g_headCtrl.softLockSta = 0;
break;
}
case CTRL_SUBCMD_SEW_WORK_STA: // 工作状态刷新
{
u8 pwmval;
pwmval = pCmd->headCtrl.para[0];
#if (PWM_TIMER_CTRL == 1)
if(pwmval > 0 && pwmval <= 100)
{
if(g_headCtrl.pwmCtrl != pwmval)
{
if(pwmval <= 10 && g_headCtrl.workingSta == 1)
{
printf("little clip level in working.lv:%d\r\n",pwmval);
return;
}
g_headCtrl.pwmCount = 0;
g_headCtrl.pwmCtrl = pwmval;
// if (g_headCtrl.cmprbuf != pwmval)
// {// 打印是否丢包
// g_headCtrl.chgTime++;
// g_headCtrl.cmprbuf = pwmval;
// printf("[%d][%d]\tpwm:%d\r\n",g_headCtrl.chgTime,(GetMsSoftTimer10() - g_headCtrl.startTime + 40),pwmval);
//
// // 将变化次数加入到缓冲区中
// g_headCtrl.tabIdx = g_headCtrl.tabIdx % BUF_TAB_SIZE;
// g_headCtrl.chgTimeTab[g_headCtrl.tabIdx] = g_headCtrl.chgTime;
// g_headCtrl.curTimeTab[g_headCtrl.tabIdx] = GetMsSoftTimer10() - g_headCtrl.startTime + 40;
// g_headCtrl.pwmTab[g_headCtrl.tabIdx] = pwmval;
// g_headCtrl.tabIdx++;
// }
}
}
#endif
u8 sta = pCmd->headCtrl.para[1];
OutputCtrl(0,sta);
break;
}
case CTRL_SUBCMD_SEW_OUTPUT_CTRL: // IO输出控制
{
u8 ionum,sta;
ionum = pCmd->headCtrl.para[0];
//sta = rCmd.wrdat[1];
sta = pCmd->headCtrl.para[1];
OutputCtrl(ionum,sta);
break;
}
case CTRL_SUBCMD_SEW_ELCLIP_CTRL: // 电子夹线控制
{
#if(PWM_TIMER_CTRL == 1)
if(pCmd->headCtrl.para[0] > 0 && pCmd->headCtrl.para[0] <= g_headCtrl.pwmFreq)
{
g_headCtrl.pwmCtrl = pCmd->headCtrl.para[0];
g_headCtrl.pwmCount = 0;
}
else
{
g_headCtrl.pwmCtrl = 0;
SetOutputPWM1Off();
SetOutputPWM2Off();
}
#endif
break;
}
case CTRL_SUBCMD_SEW_IN_WORK: // 进入工作状态
{
if(pCmd->headCtrl.para[0] == 0)
{
g_headCtrl.workingSta = 0;
}
else
{
g_headCtrl.workingSta = 1;
}
break;
}
case CTRL_SUBCMD_SEW_PFOOT_CTRL: // 压脚电机控制
{
u8 pfoot_cmd= pCmd->headCtrl.para[0];
if(pfoot_cmd == CTRL_PFOOT_CMD_TO_ZERO)
{
FootMotoToZero();
}
else if(pfoot_cmd == CTRL_PFOOT_CMD_DIS)
{
FootMotoDis();
}
else if(pfoot_cmd == CTRL_PFOOT_CMD_EN)
{
FootMotoEn();
}
else if(pfoot_cmd == CTRL_PFOOT_CMD_RESET)
{
FootMotoReset();
}
else if (pfoot_cmd == CTRL_PFOOT_CMD_UP)
{
PFootCtrlUp();
g_headCtrl.followEcdEn = 0;
}
else if (pfoot_cmd == CTRL_PFOOT_CMD_DOWN)
{
PFootCtrlDown();
g_headCtrl.followEcdEn = 0;
}
else if (pfoot_cmd == CTRL_PFOOT_CMD_BACK)
{
PFootCtrlBack();
g_headCtrl.followEcdEn = 0;
}
else
{
FootMotoCmdRst();
}
break;
}
case CTRL_SUBCMD_SEW_PFOOT_FOLLOW_CTRL: // 压脚电机跟随
{
if (pCmd->headCtrl.para[0] == 1)
{
g_headCtrl.followStepNum = FOLLOW_TABLE[0];
g_headCtrl.followEcdCheck = 1;
g_headCtrl.followEcdDir = 1;
// g_headCtrl.footMtPos = GetSTM32Moto1RealPos();
if (pCmd->headCtrl.para[1] != 0)
{
PFootCtrlDown();
}
g_headCtrl.followEcdEn = 0;
}
else
{
g_headCtrl.followEcdCheck = 0;
//g_headCtrl.pfootSta = 0;
}
break;
}
case CTRL_SUBCMD_SEW_PFOOT_SET_POS: // 设定压脚工作下位
{
if(pCmd->headCtrl.para[0] == 0)
{
g_headCtrl.followChangeNum = g_headCtrl.followRunNum;
//g_headCtrl.followChangeFlag = 1;
}
else
{
g_headCtrl.followChangeNum = g_headCtrl.pfootRunHighPos - pCmd->headCtrl.para[0];
g_headCtrl.pfootFlLowPos = pCmd->headCtrl.para[0];
if(g_headCtrl.followChangeNum != g_headCtrl.followRunNum)
{
g_headCtrl.followChangeFlag = 1;
}
}
break;
}
case CTRL_SUBCMD_SEW_PFOOT_SET_ECD: // 校正编码器位置
{
int lpos;
lpos = pCmd->headCtrl.para[0]*1000/36000;
g_headCtrl.ecOfstValue = g_headCtrl.encoderValue - lpos;
CheckParasValue();
break;
}
default:break;
}
break;
}
case CTRL_CMD_SEW_HEAD_PARA: // 缝纫机头板参数设置
{
// g_pHeadPara->pfootFlowPAng = pCmd->headPara.para[0];
// g_pHeadPara->pfootFlowNAng = pCmd->headPara.para[1];
// g_pHeadPara->pfootFlowPuls = pCmd->headPara.para[2];
// g_pHeadPara->pfootRunLowPos = pCmd->headPara.para[3];
// g_pHeadPara->pfootRunConAng = pCmd->headPara.para[4];
// g_pHeadPara->pfootRunBackPos = pCmd->headPara.para[5];
g_HeadPara.buf[pCmd->headPara.pataId] = pCmd->headPara.paraVal;
if (pCmd->headPara.cmd != 0)
{
CheckParasValue();
}
}
default:break;
}
}
else
{
}
}
}
#endif
#if (0)
int MotoNormalStop(u32 para1, u32 para2)
{
int rslt = 0;
return rslt;
}
int MotoQuickStop(u32 para1, u32 para2)
{
int rslt = 0;
return rslt;
}
int MotoMoveAsOfst(int mode, int ofst, spdCtrl *spd, int block)
{
int rslt;
MotoCtrl mtcfg;
rslt = 0;
memset(&mtcfg, 0, sizeof(MotoCtrl));
if(mode == 1)
{
ofst = ofst - GetSTM32Moto1RealPos();
}
// 速度
if(spd == NULL)
{
mtcfg.startPPS = 100;
mtcfg.runPPS = 200;
mtcfg.addPPSG = 10;
mtcfg.brkPPSG = 50;
}
else
{
mtcfg.startPPS = spd->stspd;
mtcfg.runPPS = spd->runspd;
mtcfg.addPPSG = spd->add;
mtcfg.brkPPSG = spd->brkadd;
}
mtcfg.movement = ofst;// 位移量
mtcfg.GetNormalStop = MotoNormalStop;
mtcfg.GetQuickStop = MotoQuickStop;
mtcfg.condPara1 = 0;
mtcfg.condPara2 = 0;
mtcfg.blockRunflag = block;
mtcfg.funTestTime = 1;
mtcfg.ExecWhenRun = NULL;
mtcfg.ExecWhenStart = NULL;
mtcfg.ExecWhenStop = NULL;
STM32Moto1Stop();
DelayRef(50);
STM32Moto1Start(&mtcfg);
return rslt;
}
#endif
// 得到主轴角度单位0.01度
int GetAngleFromEncoder(void)
{
int ang = g_headCtrl.encoderValue * 36000 / ENCODER_PNUM + g_headCtrl.stopAngle;
// 转化为 0 -- 35999
while (ang >= 36000)
{
ang -= 36000;
}
while (ang <= -36000)
{
ang += 36000;
}
return ang;
}
#if(CONTROL_BUS == COMM_485)
// 输入输出工作任务
void InOutWorkTask(Rs485Cmd * pCmd)
{
Rs485Cmd rCmd;
int sendstacmd = 0;
if (pCmd == NULL)
{
return;
}
memcpy(&rCmd, pCmd, sizeof(Rs485Cmd));
rCmd.index &= 0x7f;
if (rCmd.index != D29_BOARD_ID && rCmd.index != D29_ALL_BOARD_ID)
{
return;
}
if (rCmd.cmd == MODBUS_WR)
{
if(rCmd.addr != 0)
{
printf("get modbus cmd:%d,data:%d.\r\n",rCmd.addr,rCmd.wrdat[0]);
}
if(rCmd.addr == 0) // 多IO控制
{
u8 ionum,sta;
ionum = 0;
#if (STM32_MOTOS_NUM == 0 && STM32_SOFT_PWM != 0)
if (D29_BOARD_ID == 1)
{// 同步刷新PWM占空比
u8 pwmval;
pwmval = (rCmd.wrdat[0] & 0xFF00) >> 8;
if ((pwmval & 0x80) == 0x80) // 收到PWM占空比标志
{
pwmval = pwmval & 0x7F;
#if (PWM_TIMER_CTRL == 1)
if(pwmval > 0 && pwmval <= 100)
{
if(g_headCtrl.pwmCtrl != pwmval)
{
if(pwmval <= 10 && g_headCtrl.workingSta == 1)
{
printf("little clip level in working.lv:%d\r\n",pwmval);
return;
}
//g_headCtrl.pwmCtrl = g_headCtrl.pwmFreq;
g_headCtrl.pwmCount = 0;
// TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); /* 开启中断 */
// TIM_Cmd(TIM1, ENABLE);
g_headCtrl.pwmCtrl = pwmval;
if (g_headCtrl.cmprbuf != pwmval)
{// 打印是否丢包
g_headCtrl.chgTime++;
g_headCtrl.cmprbuf = pwmval;
printf("[%d][%d]\tpwm:%d\r\n",g_headCtrl.chgTime,(GetMsSoftTimer10() - g_headCtrl.startTime + 40),pwmval);
// 将变化次数加入到缓冲区中
g_headCtrl.tabIdx = g_headCtrl.tabIdx % BUF_TAB_SIZE;
g_headCtrl.chgTimeTab[g_headCtrl.tabIdx] = g_headCtrl.chgTime;
g_headCtrl.curTimeTab[g_headCtrl.tabIdx] = GetMsSoftTimer10() - g_headCtrl.startTime + 40;
g_headCtrl.pwmTab[g_headCtrl.tabIdx] = pwmval;
g_headCtrl.tabIdx++;
}
}
}
//printf("P:%d\tF:%d\t",g_headCtrl.pwmCtrl,1000000/g_headCtrl.pwmFreq);
#else
#if (0)
if (pwmval >= 0 && pwmval <= 100)
{
PWMoutputTask(pwmval,1);
}
#else
if ((pwmval >= 0 && pwmval <= 100) &&
//(g_headCtrl.pwmCtrl != pwmval) &&
1 )
{
u32 cmpr;
if(g_headCtrl.pwmCtrl != pwmval)
{
if(pwmval <= 10 && g_headCtrl.workingSta == 1)
{
printf("little clip level in working.lv:%d\r\n",pwmval);
return;
}
cmpr = g_headCtrl.pwmFreq * pwmval / 100;
TIM_SetCompare1(TIM3,cmpr);
TIM_SetCompare2(TIM3,cmpr);
g_headCtrl.pwmCtrl = pwmval;
}
if (g_headCtrl.cmprbuf != cmpr)
{// 打印是否丢包
g_headCtrl.chgTime++;
g_headCtrl.cmprbuf = cmpr;
printf("[%d][%d]\tpwm:%d\tcmpr:%d (0)\r\n",g_headCtrl.chgTime,(GetMsSoftTimer10() - g_headCtrl.startTime + 40),pwmval,cmpr);
// 将变化次数加入到缓冲区中
g_headCtrl.tabIdx = g_headCtrl.tabIdx % BUF_TAB_SIZE;
g_headCtrl.chgTimeTab[g_headCtrl.tabIdx] = g_headCtrl.chgTime;
g_headCtrl.curTimeTab[g_headCtrl.tabIdx] = GetMsSoftTimer10() - g_headCtrl.startTime + 40;
g_headCtrl.pwmTab[g_headCtrl.tabIdx] = pwmval;
g_headCtrl.tabIdx++;
}
//printf("P:%d\tF:%d\t",g_headCtrl.pwmCtrl,1000000/g_headCtrl.pwmFreq);
}
#endif
#endif
}
}
#endif
sta = (rCmd.wrdat[0]>>(8*(D29_BOARD_ID-1))) & 0x00FF;
OutputCtrl(ionum,sta);
}
else if(rCmd.addr == 1) // IO控制ON
{
u8 ionum,sta;
ionum = rCmd.wrdat[0];
//sta = rCmd.wrdat[1];
sta = 1;
OutputCtrl(ionum,sta);
}
else if(rCmd.addr == 2) // IO控制OFF
{
u8 ionum,sta;
ionum = rCmd.wrdat[0];
//sta = rCmd.wrdat[1];
sta = 0;
OutputCtrl(ionum,sta);
}
#if (STM32_MOTOS_NUM == 0 && STM32_SOFT_PWM != 0)
else if(rCmd.addr == 3 || rCmd.addr == 30) //PWM控制
{
#if(PWM_TIMER_CTRL == 1)
if(rCmd.wrdat[0] > 0 && rCmd.wrdat[0] <= g_headCtrl.pwmFreq)
{
g_headCtrl.pwmCtrl = rCmd.wrdat[0];
g_headCtrl.pwmCount = 0;
//TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); /* 开启中断 */
//TIM_Cmd(TIM1, ENABLE);
}
else
{
g_headCtrl.pwmCtrl = 0;
//TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE); /* 开启中断 */
//TIM_Cmd(TIM1, DISABLE); // 关闭定时器
SetOutput6Off();
SetOutput7Off();
//SetOutput8Off();
}
#else
if (rCmd.wrdat[0] >= 0 && rCmd.wrdat[0] <= 100)
{
#if (0)
PWMoutputTask(pwmval,1);
#else
u32 cmpr;
u16 pwmval;
pwmval = rCmd.wrdat[0];
if(g_headCtrl.pwmCtrl != pwmval)
{
if(pwmval <= 10 && g_headCtrl.workingSta == 1)
{
printf("little clip level in working.lv:%d\r\n",pwmval);
return;
}
cmpr = g_headCtrl.pwmFreq * pwmval / 100;
if(rCmd.addr == 3)
{
TIM_SetCompare1(TIM3,cmpr);
}
TIM_SetCompare2(TIM3,cmpr);
g_headCtrl.pwmCtrl = pwmval;
}
if (g_headCtrl.cmprbuf != cmpr)
{// 打印是否丢包
g_headCtrl.chgTime++;
g_headCtrl.cmprbuf = cmpr;
printf("[%d][%d]\tpwm:%d\tcmpr:%d (3)\r\n",g_headCtrl.chgTime,(GetMsSoftTimer10() - g_headCtrl.startTime + 40),rCmd.wrdat[0],cmpr);
// 将变化次数加入到缓冲区中
g_headCtrl.tabIdx = g_headCtrl.tabIdx % BUF_TAB_SIZE;
g_headCtrl.chgTimeTab[g_headCtrl.tabIdx] = g_headCtrl.chgTime;
g_headCtrl.curTimeTab[g_headCtrl.tabIdx] = GetMsSoftTimer10() - g_headCtrl.startTime + 40;
g_headCtrl.pwmTab[g_headCtrl.tabIdx] = rCmd.wrdat[0];
g_headCtrl.tabIdx++;
}
g_headCtrl.pwmCtrl = rCmd.wrdat[0];
//printf("pwm:%d,Freq:%dHz\r\n",g_headCtrl.pwmCtrl,1000000/g_headCtrl.pwmFreq);
//printf("占空比:%d,频率:%d Hz\r\n",g_headCtrl.pwmCtrl,1000000/g_headCtrl.pwmFreq);
#endif
}
else
{// 通讯异常,不响应
}
#endif
}
#endif
else if(rCmd.addr == 4) // 计时器复位
{
printf("startTime reset\r\n");
g_headCtrl.chgTime = 0;
g_headCtrl.startTime = GetMsSoftTimer10();
}
else if(rCmd.addr == 5) // 进入工作状态
{
if(rCmd.wrdat[0] == 0)
{
g_headCtrl.workingSta = 0;
}
else
{
g_headCtrl.workingSta = 1;
}
}
else if(rCmd.addr == 100) // 更改IO配置
{
if(rCmd.wrdat[0] == 1)
{
TIM_Cmd(TIM3, DISABLE); // 关闭定时器
GPIO_InitTypeDef GPIO_InitStructure;
OUT_OD_CONFIG(OUT6);
OUT_OD_CONFIG(OUT7);
g_headCtrl.pwmOutputFlag = 0;
}
else
{
InitSTM32PwmTimer();
g_headCtrl.pwmOutputFlag = 1;
}
}
else
{
// RefreshOutputSta();
// sendstacmd = 1;
}
}
if(sendstacmd == 1)
{
}
}
#endif
// 刷新输出状态
void RefreshOutputSta(void)
{
if(GetOutput1Status() == SENSOR_ON)
{
g_headCtrl.outputSta |= 0x01;
}
else
{
g_headCtrl.outputSta &= ~0x01;
}
if(GetOutput2Status() == SENSOR_ON)
{
g_headCtrl.outputSta |= 0x02;
}
else
{
g_headCtrl.outputSta &= ~0x02;
}
if(GetOutput3Status() == SENSOR_ON)
{
g_headCtrl.outputSta |= 0x04;
}
else
{
g_headCtrl.outputSta &= ~0x04;
}
if(GetOutput4Status() == SENSOR_ON)
{
g_headCtrl.outputSta |= 0x08;
}
else
{
g_headCtrl.outputSta &= ~0x08;
}
if(GetOutput5Status() == SENSOR_ON)
{
g_headCtrl.outputSta |= 0x10;
}
else
{
g_headCtrl.outputSta &= ~0x10;
}
if(GetOutput6Status() == SENSOR_ON)
{
g_headCtrl.outputSta |= 0x20;
}
else
{
g_headCtrl.outputSta &= ~0x20;
}
if(GetOutput7Status() == SENSOR_ON)
{
g_headCtrl.outputSta |= 0x40;
}
else
{
g_headCtrl.outputSta &= ~0x40;
}
if(GetOutput8Status() == SENSOR_ON)
{
g_headCtrl.outputSta |= 0x80;
}
else
{
g_headCtrl.outputSta &= ~0x80;
}
}
// 刷新输入输出状态
void InOutStaRefreshTask(void)
{
if(GetInput1Status() == SENSOR_ON)
{
g_headCtrl.inputSta |= 0x01;
}
else
{
g_headCtrl.inputSta &= ~0x01;
}
if(GetInput2Status() == SENSOR_ON)
{
g_headCtrl.inputSta |= 0x02;
}
else
{
g_headCtrl.inputSta &= ~0x02;
}
if(GetInput3Status() == SENSOR_ON)
{
g_headCtrl.inputSta |= 0x04;
}
else
{
g_headCtrl.inputSta &= ~0x04;
}
if(GetInput4Status() == SENSOR_ON)
{
g_headCtrl.inputSta |= 0x08;
}
else
{
g_headCtrl.inputSta &= ~0x08;
}
if(GetInput5Status() == SENSOR_ON)
{
g_headCtrl.inputSta |= 0x10;
}
else
{
g_headCtrl.inputSta &= ~0x10;
}
if(GetInput6Status() == SENSOR_ON)
{
g_headCtrl.inputSta |= 0x20;
}
else
{
g_headCtrl.inputSta &= ~0x20;
}
if(GetInput7Status() == SENSOR_ON)
{
g_headCtrl.inputSta |= 0x40;
}
else
{
g_headCtrl.inputSta &= ~0x40;
}
if(GetInput8Status() == SENSOR_ON)
{
g_headCtrl.inputSta |= 0x80;
}
else
{
g_headCtrl.inputSta &= ~0x80;
}
g_headCtrl.headCmdReg[0] = g_headCtrl.inputSta;
}
// 输出控制
void OutputCtrl(u8 num, u8 onof)
{
if(num == 0)
{
if((onof & 0x01) != 0)
{
SetOutput1On();
}
else
{
SetOutput1Off();
}
if((onof & 0x02) != 0)
{
SetOutput2On();
}
else
{
SetOutput2Off();
}
if((onof & 0x04) != 0)
{
SetOutput3On();
}
else
{
SetOutput3Off();
}
if((onof & 0x08) != 0)
{
SetOutput4On();
}
else
{
SetOutput4Off();
}
if((onof & 0x10) != 0)
{
SetOutput5On();
}
else
{
SetOutput5Off();
}
//#if (STM32_MOTOS_NUM == 0 && STM32_SOFT_PWM != 0)
//#else
if(g_headCtrl.pwmOutputFlag == 0)
{
if((onof & 0x20) != 0)
{
SetOutput6On();
}
else
{
SetOutput6Off();
}
if((onof & 0x40) != 0)
{
SetOutput7On();
}
else
{
SetOutput7Off();
}
}
//#endif
if((onof & 0x80) != 0)
{
SetOutput8On();
}
else
{
SetOutput8Off();
}
}
else if(num == 1)
{
if(onof == 1)
{
SetOutput1On();
}
else
{
SetOutput1Off();
}
}
else if(num == 2)
{
if(onof == 1)
{
SetOutput2On();
}
else
{
SetOutput2Off();
}
}
else if(num == 3)
{
if(onof == 1)
{
SetOutput3On();
}
else
{
SetOutput3Off();
}
}
else if(num == 4)
{
if(onof == 1)
{
SetOutput4On();
}
else
{
SetOutput4Off();
}
}
else if(num == 5)
{
if(onof == 1)
{
SetOutput5On();
}
else
{
SetOutput5Off();
}
}
//#if (STM32_MOTOS_NUM == 0 && STM32_SOFT_PWM != 0)
//#else
else if(num == 6)
{
if(g_headCtrl.pwmOutputFlag == 0)
{
if(onof == 1)
{
SetOutput6On();
}
else
{
SetOutput6Off();
}
}
}
else if(num == 7)
{
if(g_headCtrl.pwmOutputFlag == 0)
{
if(onof == 1)
{
SetOutput7On();
}
else
{
SetOutput7Off();
}
}
}
//#endif
else if(num == 8)
{
if(onof == 1)
{
SetOutput8On();
}
else
{
SetOutput8Off();
}
}
//printf("N:%d\tO:%d\r\n",num,onof);
}
void TestOutputTask(void)
{
static u32 thistime = 0;
static int outsta = 0;
if(GetMsSoftTimer10() - thistime >= 500)
{
if(outsta != 1)
{
outsta = 1;
}
else
{
outsta = 0;
}
thistime = GetMsSoftTimer10();
}
if(outsta == 1)
{
SetOutput1On();
SetOutput2On();
SetOutput3On();
SetOutput4On();
SetOutput5On();
SetOutput6On();
SetOutput7On();
SetOutput8On();
}
else
{
SetOutput1Off();
SetOutput2Off();
SetOutput3Off();
SetOutput4Off();
SetOutput5Off();
SetOutput6Off();
SetOutput7Off();
SetOutput8Off();
}
}
//-------------------------------------------------------------------------------
// AP中断
void APIntProc(void)
{
if (g_headCtrl.enflag != EN_FALG)
{
return;
}
#if (TRIGGER_TYPE == TRG_ECD_AP || TRIGGER_TYPE == TRG_ECD_AB2)
if (GetInputAPStatus() == SENSOR_ON) // 下降沿触发
{
if (GetInputBPStatus() == SENSOR_OFF)
{
g_headCtrl.encoderValue++;
if(g_headCtrl.followEcdCheck == 1)
{
if(g_headCtrl.encoderValue == g_headCtrl.followStartPPos) // 上升
{
if(g_headCtrl.pfootSta == 2 || g_headCtrl.pfootSta == 3)
{
g_headCtrl.pfootSta = 3;
g_headCtrl.followEcdDir = 1;
g_headCtrl.followEcdEn = 1;
g_headCtrl.followTableIdx = 0;
g_headCtrl.followStepNum = FOLLOW_TABLE[0];
g_headCtrl.followNumHigh = 0;
g_headCtrl.followNumLow = 0;
}
}
else if(g_headCtrl.encoderValue == g_headCtrl.followStartNPos) // 下降
{
if(g_headCtrl.pfootSta == 1 || g_headCtrl.pfootSta == 3)
{
g_headCtrl.pfootSta = 3;
g_headCtrl.followEcdDir = -1;
g_headCtrl.followEcdEn = 1;
g_headCtrl.followTableIdx = 0;
g_headCtrl.followStepNum = FOLLOW_TABLE[0];
g_headCtrl.followNumHigh = 0;
g_headCtrl.followNumLow = 0;
if(g_headCtrl.followChangeFlag == 1)
{
g_headCtrl.followRunNum = g_headCtrl.followChangeNum;
g_headCtrl.followChangeFlag = 0;
GetFollowTableValue(g_headCtrl.followConPAng,g_headCtrl.followRunNum);
}
}
}
}
g_headCtrl.FollowMotoSignOn();
}
else
{
g_headCtrl.encoderValue--;
g_headCtrl.FollowMotoSignOff();
}
g_headCtrl.FollowMotoPulseOn();
}
else
{
g_headCtrl.FollowMotoPulseOff();
}
#elif (TRIGGER_TYPE == TRG_ECD_AB4)
if (GetInputAPStatus() == GetInputBPStatus())
{
g_headCtrl.encoderValue++;
g_headCtrl.FollowMotoSignOn();
}
else
{
g_headCtrl.encoderValue--;
g_headCtrl.FollowMotoSignOff();
}
g_headCtrl.FollowMotoPulseOn();
#endif
// printf("AP, evalue=%d\r\n", g_headCtrl.encoderValue);
}
void BPIntProc(void)
{
if (g_headCtrl.enflag != EN_FALG)
{
return;
}
#if (TRIGGER_TYPE == TRG_ECD_BP || TRIGGER_TYPE == TRG_ECD_AB2)
if (GetInputBPStatus() == SENSOR_ON) // 下降沿触发
{
if (GetInputAPStatus() == SENSOR_OFF)
{
g_headCtrl.encoderValue--;
g_headCtrl.FollowMotoSignOff();
}
else
{
g_headCtrl.encoderValue++;
g_headCtrl.FollowMotoSignOn();
}
g_headCtrl.FollowMotoPulseOn();
}
else
{
g_headCtrl.FollowMotoPulseOff();
}
#elif (TRIGGER_TYPE == TRG_ECD_AB4)
if (GetInputAPStatus() == GetInputBPStatus())
{
g_headCtrl.encoderValue--;
g_headCtrl.FollowMotoSignOff();
}
else
{
g_headCtrl.encoderValue++;
g_headCtrl.FollowMotoSignOn();
}
g_headCtrl.FollowMotoPulseOff();
#endif
// printf("BP\r\n");
}
// ZP中断
void ZPIntProc(void)
{
if (g_headCtrl.enflag != EN_FALG)
{
return;
}
// printf("zp, evalue=%d\r\n", g_headCtrl.encoderValue);
g_headCtrl.encoderValue = 0;
}
void TestAction(char * para1, char * para2)
{
int p1, p2;
if (para1 == NULL || para2 == NULL)
{
return;
}
printf("para1=%s, para2=%s\r\n", para1, para2);
if (strcmp(para1, "") == 0 || strcmp(para2, "") == 0)
{
return;
}
p1 = atoi(para1);
p2 = atoi(para2);
if (p1 == p2)
{
}
//--------------------------------
//--------------------------------
#if(PWM_TIMER_CTRL == 0)
if (p1 == 0)
{ // 打印历史数据
int i,j;
j = g_headCtrl.tabIdx;
for (i = 0; i<BUF_TAB_SIZE;i++)
{
if ((i % 5) == 0)
{
DelayRef(10);
}
j = j % BUF_TAB_SIZE;
printf("[%d][%d]\tpwm:%d\r\n",g_headCtrl.chgTimeTab[j],g_headCtrl.curTimeTab[j],g_headCtrl.pwmTab[j]);
j++;
}
}
else if (p1 == 1) // 设置占空比
{
int cmpr;
if(p2 < 0 || p2 > 100)
{
return;
}
cmpr = g_headCtrl.pwmFreq * p2 / 100;
g_headCtrl.pwmCtrl = p2;
TIM_SetCompare1(TIM3,cmpr);
TIM_SetCompare2(TIM3,cmpr);
TIM_Cmd(TIM3, ENABLE);
printf("占空比:%d,频率:%d Hz\r\n",p2,1000000/g_headCtrl.pwmFreq);
}
else if (p1 == 2)
{
int freq,cmpr;
TIM_Cmd(TIM3, DISABLE);
DelayRef(100);
freq = (1000000/p2)-1;
g_headCtrl.pwmFreq = freq+1;
cmpr = g_headCtrl.pwmFreq * g_headCtrl.pwmCtrl / 100;
TIM_SetCompare1(TIM3,cmpr);
TIM_SetCompare2(TIM3,cmpr);
TIM_SetAutoreload(TIM3,freq);
TIM_Cmd(TIM3, ENABLE);
printf("占空比:%d,频率:%d Hz\r\n",g_headCtrl.pwmCtrl,1000000/g_headCtrl.pwmFreq);
}
else if (p1 == 3) // 关闭
{
if(p2 == 1)
{
TIM_SetCompare1(TIM3,0);
}
else if(p2 == 2)
{
TIM_SetCompare2(TIM3,0);
}
}
else if (p1 == 4) // 开
{
u32 cmpr;
cmpr = g_headCtrl.pwmFreq * g_headCtrl.pwmCtrl / 100;
if(p2 == 1)
{
TIM_SetCompare1(TIM3,cmpr);
}
else if(p2 == 2)
{
TIM_SetCompare2(TIM3,cmpr);
}
}
else if (p1 == 5)
{
}
else if (p1 == 6)
{
}
else if (p1 == 10) // 开
{
if(p2 == 1)
{
TIM_Cmd(TIM3, ENABLE);
}
else
{
TIM_Cmd(TIM3, DISABLE);
}
}
#else
else if(p1 == 1)
{
g_headCtrl.pwmCtrl = p2;
LL_TIM_EnableCounter(TIM1);
printf("占空比:%d \r\n",g_headCtrl.pwmCtrl);
}
else if(p1 == 2)
{
LL_TIM_EnableIT_UPDATE(TIM1); /* 开启中断 */
LL_TIM_DisableCounter(TIM1); // 关闭定时器
printf("关闭定时器 \r\n");
SetOutput7Off();
SetOutput6Off();
}
else if(p1 == 3)
{
g_headCtrl.pwmFreq = p2;
}
else if(p1 == 4)
{
g_headCtrl.timeCount = 1;
}
#endif
else if(p1 == 11)
{
if(p2 == 1)
{
SetOutput1On();
}
else if(p2 == 2)
{
SetOutput2On();
}
else if(p2 == 6)
{
SetOutput6On();
}
else if(p2 == 7)
{
SetOutput7On();
}
else if(p2 == 8)
{
SetOutput8On();
}
}
else if(p1 == 12)
{
if(p2 == 1)
{
SetOutput1Off();
}
else if(p2 == 2)
{
SetOutput2Off();
}
else if(p2 == 6)
{
SetOutput6Off();
}
else if(p2 == 7)
{
SetOutput7Off();
}
else if(p2 == 8)
{
SetOutput8Off();
}
}
}
#endif