Parcourir la source

2025.08.15

实现第一段脉冲的加速和脉冲段之间的加减速
简单设计了EXT信号的段切换
master
Chiri il y a 21 heures
Parent
révision
a8a2a152cb
14 fichiers modifiés avec 1049 ajouts et 1002 suppressions
  1. +4
    -0
      Core/Inc/main.h
  2. +1
    -0
      Core/Inc/stm32f4xx_it.h
  3. +3
    -0
      Core/Inc/tim.h
  4. +8
    -8
      Core/Src/gpio.c
  5. +151
    -92
      Core/Src/main.c
  6. +22
    -8
      Core/Src/stm32f4xx_it.c
  7. +73
    -3
      Core/Src/tim.c
  8. +725
    -725
      EWARM/PLSR.dep
  9. +20
    -20
      EWARM/settings/PLSR.dbgdt
  10. +5
    -4
      EWARM/settings/PLSR.dnx
  11. +3
    -3
      EWARM/settings/Project.wsdt
  12. +9
    -122
      Hardware/PLSR.c
  13. +0
    -6
      Hardware/PLSR.h
  14. +25
    -11
      PLSR.ioc

+ 4
- 0
Core/Inc/main.h Voir le fichier

@@ -72,6 +72,10 @@ void Error_Handler(void);
#define Y13_GPIO_Port GPIOH
#define Y12_Pin GPIO_PIN_9
#define Y12_GPIO_Port GPIOH
#define X5_Pin GPIO_PIN_12
#define X5_GPIO_Port GPIOG
#define X4_Pin GPIO_PIN_5
#define X4_GPIO_Port GPIOB

/* USER CODE BEGIN Private defines */



+ 1
- 0
Core/Inc/stm32f4xx_it.h Voir le fichier

@@ -56,6 +56,7 @@ void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM2_IRQHandler(void);
void TIM3_IRQHandler(void);
void USART1_IRQHandler(void);
void DMA2_Stream2_IRQHandler(void);
void DMA2_Stream7_IRQHandler(void);


+ 3
- 0
Core/Inc/tim.h Voir le fichier

@@ -34,6 +34,8 @@ extern "C" {

extern TIM_HandleTypeDef htim2;

extern TIM_HandleTypeDef htim3;

extern TIM_HandleTypeDef htim10;

extern TIM_HandleTypeDef htim11;
@@ -47,6 +49,7 @@ extern TIM_HandleTypeDef htim14;
/* USER CODE END Private defines */

void MX_TIM2_Init(void);
void MX_TIM3_Init(void);
void MX_TIM10_Init(void);
void MX_TIM11_Init(void);
void MX_TIM13_Init(void);


+ 8
- 8
Core/Src/gpio.c Voir le fichier

@@ -61,17 +61,17 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

/*Configure GPIO pin : PG12 */
GPIO_InitStruct.Pin = GPIO_PIN_12;
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = X5_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(X5_GPIO_Port, &GPIO_InitStruct);

/*Configure GPIO pin : PB5 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = X4_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(X4_GPIO_Port, &GPIO_InitStruct);

}



+ 151
- 92
Core/Src/main.c Voir le fichier

@@ -41,9 +41,9 @@ int32_t AllPulseCNT = 0;
int32_t BaseCNT = 0;
int32_t CNT_Only[10] = {0};

uint8_t AccITCount = 0;

uint8_t EXT_Flag = 0;
uint8_t PulseStartFlag = 0;
uint8_t ArrTimes = 0;

extern uint8_t Register_H[16384]; ///<寄存器的高字节
extern uint8_t Register_L[16384]; ///<寄存器的低字节
@@ -68,7 +68,7 @@ extern uint8_t Register_L[16384]; ///<
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void PVD_Init(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
@@ -78,31 +78,36 @@ void PVD_Init(void);
#define TASK_Y1Direction 6
#define TASK_PulseStart 5
#define TASK_DirOutput 6
#define TASK_PulseGetCount 6
#define TASK_PulseGetCount 5
#define TASK_EXTSet 6

/* 任务堆栈大小 */
#define Task_Y1Direction_SIZE 256
#define Task_PulseStart_SIZE 512
#define Task_DirOutput_SIZE 256
#define Task_PulseGetCount_SIZE 256
#define Task_EXTSet_SIZE 256

/* 任务控制块 */
OS_TCB Y1Direction_Tsk;
OS_TCB PulseStart_Tsk;
OS_TCB DirOutput_Tsk;
OS_TCB PulseGetCount_Tsk;
OS_TCB EXTSet_Tsk;
/* 任务栈 */
CPU_STK Task_Y1Direction_STK[Task_Y1Direction_SIZE];
CPU_STK Task_PulseStart_STK[Task_PulseStart_SIZE];
CPU_STK Task_DirOutput_STK[Task_DirOutput_SIZE];
CPU_STK Task_PulseGetCount_STK[Task_PulseGetCount_SIZE];
CPU_STK Task_EXTSet_STK[Task_EXTSet_SIZE];

/* 任务函数 */
void Y1Direction(void *p_arg);
void PulseStartTsk(void *p_arg);
void DirOutput(void *p_arg);
void PulseGetCount(void *p_arg);
void EXTSet(void *p_arg);

/* USER CODE END 0 */

@@ -143,14 +148,9 @@ int main(void)
MX_TIM11_Init();
MX_TIM13_Init();
MX_TIM14_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */

// PulseBaseInit(0, 0, 200);//设置为第0段脉冲开始,相对模式, 最大脉冲为0
// PulseInit(0, 1, 5, 0); //第几段脉冲,频率,数量,下一段脉冲
// AddPulse(1, 100, 200, 0);
// AddPulse(2, 1, 55, 0);
// Options.AccUpTime = 50;
BSP_Init();
@@ -215,6 +215,20 @@ int main(void)
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
/* 任务5 */
OSTaskCreate((OS_TCB * )&EXTSet_Tsk,
(CPU_CHAR* )"EXTSet_Tsk",
(OS_TASK_PTR)EXTSet,
(void * )0,
(OS_PRIO )TASK_EXTSet,
(CPU_STK * )&Task_EXTSet_STK[0],
(CPU_STK_SIZE)Task_EXTSet_SIZE/10,
(CPU_STK_SIZE)Task_EXTSet_SIZE,
(OS_MSG_QTY)0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
/* 掉电数据读取 */
ModbusLoadSRAM();
@@ -293,41 +307,7 @@ void Y1Direction(void *p_arg)
while(1)
{
/* 获取加减速所需要的脉冲数 */
GetAddCount();
/* 段切换时的脉冲加减速 */
if (ArrFlag == 1)
{
/* 脉冲加速 */
if (Acc > 0)
{
if (TIM2->CNT <= AccUpCount)
{
SetFrequency(Options.SentPost, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc);
if (TIM2->CNT == 0) PulseStart(); /* 开始产生脉冲 */
}
else
{
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency);
ArrFlag = 0;
}
}
/* 脉冲减速 */
else if (Acc <= 0)
{
if (TIM2->CNT <= AccDownCount)
{
SetFrequency(Options.SentPost, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc);
if(TIM2->CNT == 0) PulseStart(); /* 开始产生脉冲 */
}
else
{
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency);
ArrFlag = 0;
}
}
}

OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍
}
}
@@ -342,59 +322,24 @@ void PulseStartTsk(void *p_arg)
OS_ERR err;
uint8_t EN = 1;
while(1)
{
PLSRPluseLoad(); //读取脉冲设置
PLSROptionLoad(); //读取脉冲基础设置
if(Register_L[0x3000] == 0x01 && EN == 1)
if (Register_L[0x3000] == 0x01 && EN == 1)
{
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency);
PulseStart();
EN = 0;
PulseStartFlag = 1;
PulseStart();
HAL_TIM_Base_Start_IT(&htim3); /* 启动定时器3和中断 */
}
else if(Register_L[0x3000] == 0x02 && EN == 0)
else if (Register_L[0x3000] == 0x02 && EN == 0)
{
EN = 1;
}

ModbusSaveSRAM();

/* 第一段脉冲的加速 */
if (NowPulse == Options.StartPulse && PulseStartFlag == 1)
{
Acc = (float)PulseOutput[NowPulse].Frequency / (float)AccUpCount;/* 计算加速度 */
if (AccUpCount < PulseOutput[NowPulse].PulseCount)//如果能够完成加速
{
if(TIM2->CNT < AccUpCount)
{
SetFrequency(Options.SentPost, TIM2->CNT * Acc);
}
else
{
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency);
PulseStartFlag = 0;
}
}
else //不能完成加速
{
}
}
/* 最后一段脉冲的减速 */
if (NowPulse == Options.AllPulse - 1)
{
Acc = - (float)PulseOutput[NowPulse].Frequency / (float)AccDownCount;/* 计算加速度 */
if (TIM2->CNT > PulseOutput[NowPulse].PulseCount - AccUpCount - AccDownCount) /* 当达到脉冲减速的位置开始减速 */
{
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency + TIM2->CNT * Acc);
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err); // 延时 10 个节拍
}
}
@@ -480,14 +425,6 @@ void PulseGetCount(void *p_arg)
{
Options.Dir = 0;
}
// if(Options.Dir == 0)
// {
// AllPulseCNT = BaseCNT + TIM2->CNT;
// }
// else if(Options.Dir == 1)
// {
// AllPulseCNT = BaseCNT - TIM2->CNT;
// }
if(TIM2->CNT != 0)
{
@@ -509,6 +446,128 @@ void PulseGetCount(void *p_arg)
}
}

/**
* @brief 任务4,EXT
* @return 无
*/
void EXTSet(void *p_arg)
{
p_arg = p_arg;
OS_ERR err;
uint8_t X4_Sta, X5_Sta;
while(1)
{
if(HAL_GPIO_ReadPin(GPIOB, X4_Pin) == GPIO_PIN_SET)
{
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
if(HAL_GPIO_ReadPin(GPIOB, X4_Pin) == GPIO_PIN_SET)
{
X4_Sta = 1;
}
}
if(HAL_GPIO_ReadPin(GPIOB, X5_Pin) == GPIO_PIN_RESET)
{
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
if(HAL_GPIO_ReadPin(GPIOB, X5_Pin) == GPIO_PIN_RESET)
{
X5_Sta = 1;
}
}
if(X4_Sta == 1 && Options.EXT == 0)
{
EXT_Flag = 1;
X4_Sta = 0;
}
if(X5_Sta == 1 && Options.EXT == 1)
{
EXT_Flag = 1;
X5_Sta = 0;
}
if(EXT_Flag == 1)
{
EXT_Flag = 0;
HAL_TIM_GenerateEvent(&htim2, TIM_EVENTSOURCE_UPDATE);
}
OSTimeDly(100, OS_OPT_TIME_DLY, &err);
}
}

/**
* @brief 定时器中断回调函数,用来实现脉冲加减速(定时时间1ms)
* @return 无
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == (&htim3))
{
if (ArrFlag == 1)
{
/* 脉冲加速 */
if (Acc > 0)
{
if (ArrTimes <= Options.AccUpTime)
{
SetFrequency(Options.SentPost, PulseOutput[PrePulse].Frequency + ArrTimes * Acc);
if(ArrTimes == 0) PulseStart(); /* 开始产生脉冲 */
ArrTimes++;
}
else
{
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency);
ArrTimes = 0;
ArrFlag = 0;
HAL_TIM_Base_Stop_IT(&htim3); // 停止定时器并禁用中断
}
}
/* 脉冲减速 */
else if (Acc <= 0)
{
if (ArrTimes <= Options.AccDownTime)
{
SetFrequency(Options.SentPost, PulseOutput[PrePulse].Frequency + ArrTimes * Acc);
if (ArrTimes == 0) PulseStart(); /* 开始产生脉冲 */
ArrTimes++;
}
else
{
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency);
ArrTimes = 0;
ArrFlag = 0;
HAL_TIM_Base_Stop_IT(&htim3); // 停止定时器并禁用中断
}
}
}
/* 第一段脉冲的加速 */
if (NowPulse == Options.StartPulse && PulseStartFlag == 1)
{
Acc = PulseOutput[NowPulse].Frequency / Options.AccUpTime;/* 计算加速度 */
if(ArrTimes <= Options.AccUpTime)
{
ArrTimes++;
SetFrequency(Options.SentPost, ArrTimes * Acc);
if (ArrTimes == 1) PulseStart(); /* 开始产生脉冲 */
}
else
{
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency);
HAL_TIM_Base_Stop_IT(&htim3); // 停止定时器并禁用中断
PulseStartFlag = 0;
ArrTimes = 0;
}
}
/* 最后一段脉冲的减速 */
if(Options.AllPulse == PulseNum)
{
Acc = - PulseOutput[NowPulse].Frequency / Options.AccUpTime;/* 计算加速度 */
/* 思路: 在中断内计算正常情况下减速时间对应多少脉冲,在给最后一段脉冲赋值时减去对应的值,同时使能减速标志位
在此函数内实现最后一段脉冲的减速过程。 */
}
}
}
/* USER CODE END 4 */

/**


+ 22
- 8
Core/Src/stm32f4xx_it.c Voir le fichier

@@ -61,6 +61,7 @@

/* External variables --------------------------------------------------------*/
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;
extern UART_HandleTypeDef huart1;
@@ -217,7 +218,9 @@ void TIM2_IRQHandler(void)
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
//HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
TIM2->CNT = 0;
PulseNum ++; /* 脉冲段数增加 */

@@ -235,8 +238,6 @@ void TIM2_IRQHandler(void)
{
NowPulse = PulseOutput[NowPulse].NextPulse - 1; /* 进入下一段脉冲 */
}
BaseCNT += PulseOutput[PrePulse].PulseCount;
/* 准备加减速 */
if(PulseOutput[PrePulse].Frequency <= PulseOutput[NowPulse].Frequency)
{
@@ -248,8 +249,10 @@ void TIM2_IRQHandler(void)
Acc = GetAcc(PulseOutput[PrePulse].Frequency,
PulseOutput[NowPulse].Frequency, Options.AccDownTime); /* 计算加速度 */
}
ArrFlag = 1;
SetNextPulse();/* 设置下一次进入中断的脉冲数 */
ArrFlag = 1;
SetNextPulse();/* 设置下一次进入中断的脉冲数 */
HAL_TIM_Base_Start_IT(&htim3); /* 启动定时器3和中断 */
}
/* 如果之后没有脉冲 */
@@ -257,7 +260,6 @@ void TIM2_IRQHandler(void)
{
PulseCount = 0;
ArrFlag = 0;
BaseCNT += PulseOutput[NowPulse].PulseCount;
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
}
}
@@ -287,9 +289,7 @@ void TIM2_IRQHandler(void)
Acc = GetAcc(PulseOutput[PrePulse].Frequency,
PulseOutput[NowPulse].Frequency, Options.AccUpTime); /* 计算加速度 */
ArrFlag = 1;
SetNextPulse();/* 设置下一次进入中断的脉冲数 */
PulseStart(); /* 开始产生脉冲 */
}
/* 如果之后没有脉冲 */
else
@@ -305,6 +305,20 @@ void TIM2_IRQHandler(void)
/* USER CODE END TIM2_IRQn 1 */
}

/**
* @brief This function handles TIM3 global interrupt.
*/
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */

/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */

/* USER CODE END TIM3_IRQn 1 */
}

/**
* @brief This function handles USART1 global interrupt.
*/


+ 73
- 3
Core/Src/tim.c Voir le fichier

@@ -25,6 +25,7 @@
/* USER CODE END 0 */

TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim10;
TIM_HandleTypeDef htim11;
TIM_HandleTypeDef htim13;
@@ -73,6 +74,46 @@ void MX_TIM2_Init(void)
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END TIM2_Init 2 */

}
/* TIM3 init function */
void MX_TIM3_Init(void)
{

/* USER CODE BEGIN TIM3_Init 0 */

/* USER CODE END TIM3_Init 0 */

TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};

/* USER CODE BEGIN TIM3_Init 1 */

/* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 72-1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
__HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);
/* USER CODE END TIM3_Init 2 */

}
/* TIM10 init function */
void MX_TIM10_Init(void)
@@ -88,9 +129,9 @@ void MX_TIM10_Init(void)

/* USER CODE END TIM10_Init 1 */
htim10.Instance = TIM10;
htim10.Init.Prescaler = 72;
htim10.Init.Prescaler = 1;
htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
htim10.Init.Period = 65535;
htim10.Init.Period = 1;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
@@ -102,7 +143,7 @@ void MX_TIM10_Init(void)
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 32767;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
@@ -273,6 +314,21 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)

/* USER CODE END TIM2_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspInit 0 */

/* USER CODE END TIM3_MspInit 0 */
/* TIM3 clock enable */
__HAL_RCC_TIM3_CLK_ENABLE();

/* TIM3 interrupt Init */
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspInit 1 */

/* USER CODE END TIM3_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM10)
{
/* USER CODE BEGIN TIM10_MspInit 0 */
@@ -430,6 +486,20 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)

/* USER CODE END TIM2_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspDeInit 0 */

/* USER CODE END TIM3_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM3_CLK_DISABLE();

/* TIM3 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspDeInit 1 */

/* USER CODE END TIM3_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM10)
{
/* USER CODE BEGIN TIM10_MspDeInit 0 */


+ 725
- 725
EWARM/PLSR.dep
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 20
- 20
EWARM/settings/PLSR.dbgdt
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 5
- 4
EWARM/settings/PLSR.dnx Voir le fichier

@@ -20,15 +20,15 @@
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
</StLinkDriver>
<DebugChecksum>
<Checksum>2527891484</Checksum>
<Checksum>3780237782</Checksum>
</DebugChecksum>
<Exceptions>
<StopOnUncaught>_ 0</StopOnUncaught>
<StopOnThrow>_ 0</StopOnThrow>
</Exceptions>
<Disassembly>
<InstrCount>0</InstrCount>
<MixedMode>1</MixedMode>
<InstrCount>0</InstrCount>
</Disassembly>
<CodeCoverage>
<Enabled>0</Enabled>
@@ -75,8 +75,9 @@
<Fmt0>{W}1:AccITCount 3 0</Fmt0>
<Fmt1>{W}1:AllPulseCNT 3 0</Fmt1>
<Fmt2>{W}1:DatL 3 0</Fmt2>
<Fmt3>{W}1:c 4 0</Fmt3>
<Fmt4>{W}1:datCount 3 0</Fmt4>
<Fmt3>{W}1:arr 3 0</Fmt3>
<Fmt4>{W}1:c 4 0</Fmt4>
<Fmt5>{W}1:datCount 3 0</Fmt5>
</watch_formats>
<Trace2>
<Enabled>0</Enabled>


+ 3
- 3
EWARM/settings/Project.wsdt
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 9
- 122
Hardware/PLSR.c Voir le fichier

@@ -42,37 +42,6 @@ void SetFrequency(uint8_t SentPost, uint32_t Frequency)
}

/**
* @brief 设置脉冲基本参数
* @param[in] Pulse 第几段脉冲
* @param[in] Ferquency 脉冲的频率
* @param[in] Count 脉冲的数量
* @param[in] EXT EXT信号
* @param[in] NextPulse 下一段脉冲
* @return 无
*/
void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t EXT, int8_t NextPulse)
{
PulseOutput[Pulse].Frequency = Ferquency;
PulseOutput[Pulse].PulseCount = Count;
PulseOutput[Pulse].EXT = EXT;
PulseOutput[Pulse].NextPulse = NextPulse;
}

/**
* @brief 脉冲初始化
* @param[in] StartPulse 起始脉冲段
* @param[in] PulseMod 绝对1/相对0
* @return 无
*/
void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse)
{
Options.StartPulse = StartPulse;
Options.RunMod = PulseMod;
NowPulse = StartPulse;
MAX_Pulse = MAX_Pulse;
}

/**
* @brief 脉冲开始
* @param[in] StartPulse 起始脉冲段
@@ -91,13 +60,14 @@ void PulseStart(void)
switch(Options.SentPost)
{
case 0: HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1); break;
case 1: HAL_TIM_PWM_Start_IT(&htim11, TIM_CHANNEL_1); break;
case 2: HAL_TIM_PWM_Start_IT(&htim13, TIM_CHANNEL_1); break;
case 3: HAL_TIM_PWM_Start_IT(&htim14, TIM_CHANNEL_1); break;
case 0: HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); break;
case 1: HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1); break;
case 2: HAL_TIM_PWM_Start(&htim13, TIM_CHANNEL_1); break;
case 3: HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1); break;
}
}

/**
* @brief 获取加速度
* @param[in] Start 起始脉冲频率
@@ -110,54 +80,6 @@ float GetAcc(int32_t Start, int32_t End, int32_t AccCount)
return ((float)End - (float)Start) / (float)AccCount;
}

/**
* @brief 添加新的脉冲(只允许按顺序添加)
* @param[in] Pulse 第几段脉冲
* @param[in] Ferquency 脉冲的频率
* @param[in] Count 脉冲的数量
* @param[in] NextPulse 下一段脉冲
* @return 无
*/
void AddPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse)
{
if(Pulse == Options.AllPulse)
{
if(Count > 0)
{
SetPulse(Pulse, Ferquency, Count, 0, NextPulse);
}
else
{
SetPulse(Pulse, Ferquency, -Count, 1, NextPulse);
}
Options.AllPulse ++;
}

}

/**
* @brief 脉冲初始化
* @param[in] Pulse 第几段脉冲
* @param[in] Ferquency 脉冲的频率
* @param[in] Count 脉冲的数量
* @param[in] Direction 脉冲的方向
* @param[in] NextPulse 下一段脉冲
* @return 无
*/
void PulseInit(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse)
{
if(Count > 0)
{
SetPulse(Pulse, Ferquency, Count, 0, NextPulse);
}
else
{
SetPulse(Pulse, Ferquency, -Count, 1, NextPulse);
}
Options.AllPulse = 1;
}

/**
* @brief 设置结果脉冲数
* @param[in] PulseCount 要设定的脉冲数
@@ -208,28 +130,6 @@ void SetNextPulse(void)
}
}

/**
* @brief 获取与CNT相加的基础值
* @param[in] NowPulseNUM 当前的脉冲段数
* @return 基础值
*/
uint32_t GetBase(uint8_t NowPulseNUM)
{
uint32_t temp = 0;
if(NowPulseNUM == 0)
{
temp = 0;
}
else
{
for(int i = 0; i < NowPulseNUM; i++)
{
temp += PulseOutput[i].PulseCount;
}
}
return temp;
}

/**
* @brief 从寄存器读取设置参数
* @return 无
@@ -259,6 +159,10 @@ void PLSROptionLoad(void)

}

/**
* @brief 从寄存器读取脉冲参数
* @return 无
*/
void PLSRPluseLoad(void)
{
uint32_t temp_Frequency, temp_PulseCount;
@@ -304,20 +208,3 @@ void CountSave(void)
Register_L[0x2000] = (DatL & 0x00ff);
}

/**
* @brief 获取加减速的脉冲数
* @return 无
*/
void GetAddCount(void)
{
if(NowPulse == Options.StartPulse)
{
AccUpCount = Options.AccUpTime * PulseOutput[NowPulse].Frequency / 1000;
}
else
{
AccUpCount = Options.AccUpTime * (PulseOutput[NowPulse].Frequency - PulseOutput[PrePulse].Frequency) / 1000;
AccDownCount = Options.AccDownTime * (PulseOutput[PrePulse].Frequency - PulseOutput[NowPulse].Frequency) / 1000;
}
}

+ 0
- 6
Hardware/PLSR.h Voir le fichier

@@ -46,19 +46,13 @@ extern int32_t NextPulseEND;

/* º¯ÊýÉùÃ÷ */
void SetFrequency(uint8_t SentPost, uint32_t Frequency);
void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t Direction, int8_t NextPulse);
void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse);
void PulseStart(void);
float GetAcc(int32_t Start, int32_t End, int32_t AccCount);
void AddPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse);
void PulseInit(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse);
void SetNextPulse(void);
void PLSROptionLoad(void);
void PLSRPluseLoad(void);
void CountSave(void);
void GetAddCount(void);

uint32_t GetBase(uint8_t NowPulseNUM);


#endif

+ 25
- 11
PLSR.ioc Voir le fichier

@@ -32,15 +32,16 @@ Mcu.CPN=STM32F407IGT6
Mcu.Family=STM32F4
Mcu.IP0=DMA
Mcu.IP1=NVIC
Mcu.IP10=USART1
Mcu.IP2=RCC
Mcu.IP3=SYS
Mcu.IP4=TIM2
Mcu.IP5=TIM10
Mcu.IP6=TIM11
Mcu.IP7=TIM13
Mcu.IP8=TIM14
Mcu.IP9=USART1
Mcu.IPNb=10
Mcu.IP5=TIM3
Mcu.IP6=TIM10
Mcu.IP7=TIM11
Mcu.IP8=TIM13
Mcu.IP9=TIM14
Mcu.IPNb=11
Mcu.Name=STM32F407I(E-G)Tx
Mcu.Package=LQFP176
Mcu.Pin0=PF6
@@ -53,11 +54,12 @@ Mcu.Pin14=PA15
Mcu.Pin15=PG12
Mcu.Pin16=PB5
Mcu.Pin17=VP_SYS_VS_Systick
Mcu.Pin18=VP_TIM10_VS_ClockSourceINT
Mcu.Pin19=VP_TIM11_VS_ClockSourceINT
Mcu.Pin18=VP_TIM3_VS_ClockSourceINT
Mcu.Pin19=VP_TIM10_VS_ClockSourceINT
Mcu.Pin2=PF8
Mcu.Pin20=VP_TIM13_VS_ClockSourceINT
Mcu.Pin21=VP_TIM14_VS_ClockSourceINT
Mcu.Pin20=VP_TIM11_VS_ClockSourceINT
Mcu.Pin21=VP_TIM13_VS_ClockSourceINT
Mcu.Pin22=VP_TIM14_VS_ClockSourceINT
Mcu.Pin3=PF9
Mcu.Pin4=PH0-OSC_IN
Mcu.Pin5=PH1-OSC_OUT
@@ -65,7 +67,7 @@ Mcu.Pin6=PH6
Mcu.Pin7=PH7
Mcu.Pin8=PH8
Mcu.Pin9=PH9
Mcu.PinsNb=22
Mcu.PinsNb=23
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F407IGTx
@@ -84,6 +86,7 @@ NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA10.Mode=Asynchronous
@@ -98,6 +101,9 @@ PA15.Locked=true
PA15.Signal=S_TIM2_CH1_ETR
PA9.Mode=Asynchronous
PA9.Signal=USART1_TX
PB5.GPIOParameters=GPIO_PuPd,GPIO_Label
PB5.GPIO_Label=X4
PB5.GPIO_PuPd=GPIO_PULLUP
PB5.Locked=true
PB5.Signal=GPIO_Input
PF6.Locked=true
@@ -108,6 +114,9 @@ PF8.Locked=true
PF8.Signal=S_TIM13_CH1
PF9.Locked=true
PF9.Signal=S_TIM14_CH1
PG12.GPIOParameters=GPIO_PuPd,GPIO_Label
PG12.GPIO_Label=X5
PG12.GPIO_PuPd=GPIO_PULLUP
PG12.Locked=true
PG12.Signal=GPIO_Input
PH0-OSC_IN.Mode=HSE-External-Oscillator
@@ -217,6 +226,9 @@ TIM13.Channel=TIM_CHANNEL_1
TIM13.IPParameters=Channel
TIM14.Channel=TIM_CHANNEL_1
TIM14.IPParameters=Channel
TIM3.IPParameters=Prescaler,Period
TIM3.Period=999
TIM3.Prescaler=72-1
USART1.BaudRate=9600
USART1.IPParameters=VirtualMode,BaudRate,Parity,WordLength
USART1.Parity=PARITY_ODD
@@ -232,4 +244,6 @@ VP_TIM13_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM13_VS_ClockSourceINT.Signal=TIM13_VS_ClockSourceINT
VP_TIM14_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM14_VS_ClockSourceINT.Signal=TIM14_VS_ClockSourceINT
VP_TIM3_VS_ClockSourceINT.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
board=custom

Chargement…
Annuler
Enregistrer