瀏覽代碼

2025.07.09上午

实现脉冲计数(外部时钟)
创建了三个任务
master
Chiri 1 天之前
父節點
當前提交
db8a69ef4c
共有 30 個檔案被更改,包括 1676 行新增1005 行删除
  1. +14
    -0
      Core/Inc/main.h
  2. +1
    -1
      Core/Inc/stm32f4xx_it.h
  3. +2
    -2
      Core/Inc/tim.h
  4. +5
    -0
      Core/Inc/usart.h
  5. +4
    -5
      Core/Src/gpio.c
  6. +257
    -71
      Core/Src/main.c
  7. +114
    -11
      Core/Src/stm32f4xx_it.c
  8. +67
    -40
      Core/Src/tim.c
  9. +8
    -4
      Core/Src/usart.c
  10. +745
    -745
      EWARM/PLSR.dep
  11. +1
    -1
      EWARM/PLSR.ewp
  12. +2
    -2
      EWARM/settings/PLSR.PLSR.cspy.bat
  13. +2
    -2
      EWARM/settings/PLSR.PLSR.cspy.ps1
  14. +1
    -1
      EWARM/settings/PLSR.PLSR.general.xcl
  15. +74
    -30
      EWARM/settings/PLSR.dbgdt
  16. +16
    -5
      EWARM/settings/PLSR.dnx
  17. +1
    -0
      EWARM/settings/PLSR.reggroups
  18. +36
    -21
      EWARM/settings/Project.wsdt
  19. +184
    -22
      Hardware/PLSR.c
  20. +35
    -14
      Hardware/PLSR.h
  21. +4
    -2
      Hardware/modbus.c
  22. +3
    -0
      Hardware/modbus.h
  23. +4
    -2
      Hardware/sram.c
  24. +47
    -24
      PLSR.ioc
  25. +49
    -0
      Words/流程图.md
  26. 二進制
      Words/设计方案书 .doc
  27. 二進制
      Words/设计方案书.doc
  28. 二進制
      Words/需求规格书.doc
  29. 二進制
      pictures/流程图/图1脉冲计数设计流程图.png
  30. 二進制
      pictures/流程图/图2脉冲加速流程图.png

+ 14
- 0
Core/Inc/main.h 查看文件

@@ -36,7 +36,13 @@ extern "C" {

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */
extern uint8_t ArrFlag; /* 加速度Flag */
extern float Acc; /* 加速度 */
extern uint8_t PulseNum; /* 脉冲段计数 */
extern uint32_t AllPulseCNT;

extern uint8_t EndFlag;
extern uint8_t FullFlag;
/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
@@ -57,6 +63,14 @@ void Error_Handler(void);
/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
#define Y15_Pin GPIO_PIN_6
#define Y15_GPIO_Port GPIOH
#define Y14_Pin GPIO_PIN_7
#define Y14_GPIO_Port GPIOH
#define Y13_Pin GPIO_PIN_8
#define Y13_GPIO_Port GPIOH
#define Y12_Pin GPIO_PIN_9
#define Y12_GPIO_Port GPIOH

/* USER CODE BEGIN Private defines */



+ 1
- 1
Core/Inc/stm32f4xx_it.h 查看文件

@@ -55,7 +55,7 @@ void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM1_BRK_TIM9_IRQHandler(void);
void TIM2_IRQHandler(void);
void USART1_IRQHandler(void);
void DMA2_Stream2_IRQHandler(void);
void DMA2_Stream7_IRQHandler(void);


+ 2
- 2
Core/Inc/tim.h 查看文件

@@ -32,7 +32,7 @@ extern "C" {

/* USER CODE END Includes */

extern TIM_HandleTypeDef htim9;
extern TIM_HandleTypeDef htim2;

extern TIM_HandleTypeDef htim10;

@@ -40,7 +40,7 @@ extern TIM_HandleTypeDef htim10;

/* USER CODE END Private defines */

void MX_TIM9_Init(void);
void MX_TIM2_Init(void);
void MX_TIM10_Init(void);

void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);


+ 5
- 0
Core/Inc/usart.h 查看文件

@@ -35,7 +35,12 @@ extern "C" {
extern UART_HandleTypeDef huart1;

/* USER CODE BEGIN Private defines */
#define RX_BUFFER_SIZE 1024

extern uint8_t RX1DataTemp;
extern uint8_t RX1Data[RX_BUFFER_SIZE];
extern uint8_t RX1Flag;
extern volatile uint16_t RX1Count;
/* USER CODE END Private defines */

void MX_USART1_UART_Init(void);


+ 4
- 5
Core/Src/gpio.c 查看文件

@@ -45,20 +45,19 @@ void MX_GPIO_Init(void)
GPIO_InitTypeDef GPIO_InitStruct = {0};

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOI_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOH, Y15_Pin|Y14_Pin|Y13_Pin|Y12_Pin, GPIO_PIN_RESET);

/*Configure GPIO pin : PI8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;
/*Configure GPIO pins : PHPin PHPin PHPin PHPin */
GPIO_InitStruct.Pin = Y15_Pin|Y14_Pin|Y13_Pin|Y12_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

}



+ 257
- 71
Core/Src/main.c 查看文件

@@ -26,13 +26,18 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "PLSR.h"
#include "includes.h"
#include "includes.h"
#include "modbus.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t ArrFlag = 0; /* 加速度Flag */
int32_t Acc; /* 加速度 */
float Acc; /* 加速度 */
uint32_t AllPulseCNT = 0;

uint8_t EndFlag = 0;
uint8_t FullFlag = 0;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
@@ -54,7 +59,7 @@ int32_t Acc; /*
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void PVD_Init(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
@@ -62,20 +67,28 @@ void SystemClock_Config(void);

/* 任务优先级 */
#define TASK_Y1Direction 4
#define TASK_PulseStart 4
#define TASK_DirOutput 4

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

/* 任务控制块 */
OS_TCB Y1Direction_Tsk;
OS_TCB Y1Direction_Tsk;
OS_TCB PulseStart_Tsk;
OS_TCB DirOutput_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];

/* 任务函数 */
void Y1Direction(void *p_arg);

void PulseStartTsk(void *p_arg);
void DirOutput(void *p_arg);

/* USER CODE END 0 */

@@ -95,14 +108,16 @@ int main(void)
HAL_Init();

/* USER CODE BEGIN Init */
PVD_Init();
/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

HAL_PWR_EnableBkUpAccess();/* 使能备份域访问 */
__HAL_RCC_BKPSRAM_CLK_ENABLE();/* 使能备份SRAM时钟 */
HAL_PWREx_EnableBkUpReg();/* 使能备份SRAM */
/* USER CODE END SysInit */

/* Initialize all configured peripherals */
@@ -110,38 +125,64 @@ int main(void)
MX_DMA_Init();
MX_USART1_UART_Init();
MX_TIM10_Init();
MX_TIM9_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
PulseBaseInit(0, 0, 200);//设置为第0段脉冲开始,相对模式, 最大脉冲为0
AccCount = 50;
// PulseInit(0, 0, 0);//设置为第0段脉冲开始,相对模式, 最大脉冲为0
// Base.AccCount = 50;
SetPulse(0, 1, 5, 0, 1);
// SetPulse(1, 100, 200, 0, -1);
PulseInit(0, 1, 5, 0); //第几段脉冲,频率,数量,下一段脉冲
AddPulse(1, 100, -200, 0);
AddPulse(2, 1, 55, 0);

__HAL_TIM_SET_AUTORELOAD(&htim9,5-1); //设置要输出的PWM脉冲数 5个
HAL_TIM_Base_Start_IT(&htim9); //启动从定时器
// PulseStart(); //开始产生脉冲
// HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); //启动主定时器PWM输出
BSP_Init();
BSP_Init();
OSInit(&err);
OSTaskCreate((OS_TCB * )&Y1Direction_Tsk, /* 任务控制块 */
(CPU_CHAR* )"Y1Direction", /* 任务名字 */
(OS_TASK_PTR)Y1Direction, /* 任务函数 */
(void * )0, /* 传递给任务函数的参数 */
/* 任务1 */
OSTaskCreate((OS_TCB * )&Y1Direction_Tsk, /* 任务控制块 */
(CPU_CHAR* )"Y1Direction", /* 任务名字 */
(OS_TASK_PTR)Y1Direction, /* 任务函数 */
(void * )0, /* 传递给任务函数的参数 */
(OS_PRIO )TASK_Y1Direction, /* 任务优先级 */
(CPU_STK * )&Task_Y1Direction_STK[0], /* 任务堆栈基地址 */
(CPU_STK_SIZE)Task_Y1Direction_SIZE/10, /* 任务堆栈深度限位 */
(CPU_STK_SIZE)Task_Y1Direction_SIZE, /* 任务堆栈大小 */
(CPU_STK_SIZE)Task_Y1Direction_SIZE, /* 任务堆栈大小 */
(OS_MSG_QTY)0, /* 任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 */
(OS_TICK )0, /* 当使能时间片轮转时的时间片长度,为0时为默认长度 */
(void * )0, /* 用户补充的存储区 */
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, /* 任务选项 */
(OS_ERR * )&err); /* 存放该函数错误时的返回值 */
/* 任务2 */
OSTaskCreate((OS_TCB * )&PulseStart_Tsk,
(CPU_CHAR* )"PulseStartTsk",
(OS_TASK_PTR)PulseStartTsk,
(void * )0,
(OS_PRIO )TASK_PulseStart,
(CPU_STK * )&Task_PulseStart_STK[0],
(CPU_STK_SIZE)Task_PulseStart_SIZE/10,
(CPU_STK_SIZE)Task_PulseStart_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);
/* 任务3 */
OSTaskCreate((OS_TCB * )&DirOutput_Tsk,
(CPU_CHAR* )"DirOutput_Tsk",
(OS_TASK_PTR)DirOutput,
(void * )0,
(OS_PRIO )TASK_DirOutput,
(CPU_STK * )&Task_DirOutput_STK[0],
(CPU_STK_SIZE)Task_DirOutput_SIZE/10,
(CPU_STK_SIZE)Task_DirOutput_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);
OSStart(&err);

/* USER CODE END 2 */
@@ -174,12 +215,11 @@ void SystemClock_Config(void)
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 6;
RCC_OscInitStruct.PLL.PLLN = 72;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
@@ -206,27 +246,136 @@ void SystemClock_Config(void)
/* USER CODE BEGIN 4 */

/**
* @brief 任务1,Y1的方向
* @brief 任务1,获取总脉冲数, 脉冲加减速
* @return 无
*/
void Y1Direction(void *p_arg)
{
p_arg = p_arg;
OS_ERR err;
while(1)
{
if (PulseOutput[Base.NowPulse].Direction == 1)
/* 脉冲加减速 */
if (ArrFlag == 1)
{
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_8, GPIO_PIN_SET);
if(TIM2->CNT < AccCount)
{
SetFrequency(0, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc);
}
else
{
SetFrequency(0, PulseOutput[NowPulse].Frequency);
ArrFlag = 0;
}
}
else
/* 获取总的脉冲数 */
if(EndFlag || FullFlag)
{
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_8, GPIO_PIN_RESET);
if(EndFlag)
{
AllPulseCNT = GetBase(NowPulse) + PulseOutput[NowPulse].PulseCount;
}
if(FullFlag)
{
AllPulseCNT = MAX_Pulse;
}
}
else
{
AllPulseCNT = TIM2->CNT + GetBase(NowPulse);
}
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍
}
}

/**
* @brief 任务2,脉冲开始
* @return 无
*/
void PulseStartTsk(void *p_arg)
{
p_arg = p_arg;
OS_ERR err;
uint8_t EN = 1;
while(1)
{
if(Register_L[3000] == 0x01 && EN == 1)
{
PulseStart();
EN = 0;
}
else if(Register_L[3000] == 0x02 && EN == 0)
{
EN = 1;
}
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍
}
}

/**
* @brief 任务3,脉冲方向输出
* @return 无
*/
void DirOutput(void *p_arg)
{
p_arg = p_arg;
OS_ERR err;
while(1)
{
if (Options.DirPost == 0)
{
if (Options.Dir == 1)
{
HAL_GPIO_WritePin(GPIOH, Y12_Pin, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOH, Y12_Pin, GPIO_PIN_RESET);
}
}
if (Options.DirPost == 1)
{
if (Options.Dir == 1)
{
HAL_GPIO_WritePin(GPIOH, Y13_Pin, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOH, Y13_Pin, GPIO_PIN_RESET);
}
}
if (Options.DirPost == 2)
{
if (Options.Dir == 1)
{
HAL_GPIO_WritePin(GPIOH, Y14_Pin, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOH, Y14_Pin, GPIO_PIN_RESET);
}
}
if (Options.DirPost == 3)
{
if (Options.Dir == 1)
{
HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_RESET);
}
}
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍
}
}

#if 0

/**
* @brief 定时器中断回调(PWM计数)
* @return 无
@@ -235,26 +384,32 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM10)
{
PulseCount++;
if (1 == Base.PulseMod) /* 如果是绝对模式 */
{
if (AllPulseCount == Base.MAX_Pulse) /* 达到了最大脉冲数 */
if (TIM2->CNT == Base.MAX_Pulse) /* 达到了最大脉冲数 */
{
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
}
else if(PulseCount == PulseOutput[Base.NowPulse].PulseCount) /* 如果当前段的计数等于要求的计数 */
else if(PulseCount == PulseOutput[NowPulse].PulseCount) /* 如果当前段的计数等于要求的计数 */
{
PulseCount = 0;
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
if(PulseOutput[Base.NowPulse].NextPulse != -1)
if(Base.PulseNum - NowPulse >= 1)
{
Base.PrePulse = Base.NowPulse; /* 保存之前的脉冲段 */
Base.NowPulse = PulseOutput[Base.NowPulse].NextPulse; /* 进入下一段脉冲 */
Base.PrePulse = NowPulse; /* 保存之前的脉冲段 */
if(PulseOutput[NowPulse].NextPulse == 0)
{
NowPulse = NowPulse+ 1;
}
else
{
NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */
}
Acc = GetAcc(PulseOutput[Base.PrePulse].Frequency,
PulseOutput[Base.NowPulse].Frequency, Base.AccCount); /* 计算Acc */
PulseOutput[NowPulse].Frequency, Base.AccCount); /* 计算Acc */
ArrFlag = 1;
PulseStart(); //开始产生脉冲
}
@@ -262,27 +417,32 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
}
else if (0 == Base.PulseMod) /* 如果是相对模式 */
{
if (PulseCount == PulseOutput[Base.NowPulse].PulseCount) /* 如果当前段的计数等于要求的计数 */
if (PulseCount == PulseOutput[NowPulse].PulseCount) /* 如果当前段的计数等于要求的计数 */
{
PulseCount = 0;
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
if(PulseOutput[Base.NowPulse].NextPulse != -1)
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
if(Base.PulseNum - NowPulse > 1)
{
Base.PrePulse = Base.NowPulse; /* 保存之前的脉冲段 */
Base.NowPulse = PulseOutput[Base.NowPulse].NextPulse; /* 进入下一段脉冲 */
Base.PrePulse = NowPulse; /* 保存之前的脉冲段 */
if(PulseOutput[NowPulse].NextPulse == 0)
{
NowPulse = NowPulse+ 1;
}
else
{
NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */
}
Acc = GetAcc(PulseOutput[Base.PrePulse].Frequency,
PulseOutput[Base.NowPulse].Frequency, Base.AccCount); /* 计算Acc */
PulseOutput[NowPulse].Frequency, Base.AccCount); /* 计算Acc */
ArrFlag = 1;
PulseStart(); //开始产生脉冲
}
else
{
PulseCount = 0;
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
}
}
else
{
PulseCount++;
AllPulseCount++;
}
}
if (ArrFlag == 1)
{
@@ -292,7 +452,7 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
}
else
{
SetFrequency(0, PulseOutput[Base.NowPulse].Frequency);
SetFrequency(0, PulseOutput[NowPulse].Frequency);
ArrFlag = 0;
}
}
@@ -300,16 +460,42 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
}
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
#endif

/**
* @brief 掉电中断
* @return 无
*/
void HAL_PWR_PVDCallback(void)
{
if(htim == &htim9)
{
if(__HAL_TIM_GET_FLAG(&htim9, TIM_FLAG_CC2) != RESET) //判断是否触发中断
{
__HAL_TIM_CLEAR_FLAG(&htim9, TIM_FLAG_CC2); //清除中断标志
HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_8);
}
}
OSIntEnter(); /* 进入中断 */
// 检查电压是否低于阈值
if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO))
{
/* 掉电处理内容 */
PLSRSramSave();
}

OSIntExit(); /* 退出中断 */
}

/**
* @brief PVD配置
* @return 无
*/
void PVD_Init(void)
{
PWR_PVDTypeDef PvdStruct;
HAL_PWR_EnablePVD(); /* 使能PVD */
PvdStruct.PVDLevel = PWR_PVDLEVEL_3; /* PVD阈值3.1V */
PvdStruct.Mode = PWR_PVD_MODE_IT_RISING; /* 检测掉电 */
HAL_PWR_ConfigPVD(&PvdStruct);
HAL_NVIC_SetPriority(PVD_IRQn, 0, 0); /* 配置PVD中断优先级 */
HAL_NVIC_EnableIRQ(PVD_IRQn); /* 使能PVD中断 */
}

/* USER CODE END 4 */


+ 114
- 11
Core/Src/stm32f4xx_it.c 查看文件

@@ -22,6 +22,11 @@
#include "stm32f4xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "PLSR.h"
#include "tim.h"
#include "usart.h"
#include "modbus.h"
#include "string.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
@@ -55,7 +60,7 @@
/* USER CODE END 0 */

/* External variables --------------------------------------------------------*/
extern TIM_HandleTypeDef htim9;
extern TIM_HandleTypeDef htim2;
extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;
extern UART_HandleTypeDef huart1;
@@ -202,17 +207,93 @@ void SysTick_Handler(void)
/******************************************************************************/

/**
* @brief This function handles TIM1 break interrupt and TIM9 global interrupt.
* @brief This function handles TIM2 global interrupt.
*/
void TIM1_BRK_TIM9_IRQHandler(void)
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_BRK_TIM9_IRQn 0 */

/* USER CODE END TIM1_BRK_TIM9_IRQn 0 */
HAL_TIM_IRQHandler(&htim9);
/* USER CODE BEGIN TIM1_BRK_TIM9_IRQn 1 */

/* USER CODE END TIM1_BRK_TIM9_IRQn 1 */
/* USER CODE BEGIN TIM2_IRQn 0 */

/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
PulseNum ++; /* 脉冲段数增加 */

if(Options.RunMod == 0)
{
/* 如果之后还有脉冲 */
if(Options.AllPulse - PulseNum > 0)
{
PrePulse = NowPulse; /* 保存之前的脉冲段 */
if(PulseOutput[NowPulse].NextPulse == 0)
{
NowPulse = NowPulse + 1; /* 进入下一段脉冲 */
}
else
{
NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */
}
/* 准备加减速 */
Acc = GetAcc(PulseOutput[PrePulse].Frequency,
PulseOutput[NowPulse].Frequency, AccCount); /* 计算加速度 */
ArrFlag = 1;
SetNextPulse();/* 设置下一次进入中断的脉冲数 */
PulseStart(); /* 开始产生脉冲 */
}
/* 如果之后没有脉冲 */
else
{
PulseCount = 0;
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
EndFlag = 1;
}
}
else
{
if(AllPulseCNT >= MAX_Pulse)
{
PulseCount = 0;
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
FullFlag = 1;
}
else
{
/* 如果之后还有脉冲 */
if(Options.AllPulse - PulseNum > 0)
{
PrePulse = NowPulse; /* 保存之前的脉冲段 */
if(PulseOutput[NowPulse].NextPulse == 0)
{
NowPulse = NowPulse + 1; /* 进入下一段脉冲 */
}
else
{
NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */
}
/* 准备加减速 */
Acc = GetAcc(PulseOutput[PrePulse].Frequency,
PulseOutput[NowPulse].Frequency, AccCount); /* 计算加速度 */
ArrFlag = 1;
SetNextPulse();/* 设置下一次进入中断的脉冲数 */
PulseStart(); /* 开始产生脉冲 */
}
/* 如果之后没有脉冲 */
else
{
PulseCount = 0;
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */
EndFlag = 1;
}
}
}


/* USER CODE END TIM2_IRQn 1 */
}

/**
@@ -221,7 +302,29 @@ void TIM1_BRK_TIM9_IRQHandler(void)
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */

uint32_t temp;
// 空闲中断处理
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
temp = huart1.Instance->SR;
temp = huart1.Instance->DR;
HAL_UART_DMAStop(&huart1);
// 计算接收到的数据长度
uint16_t len = RX_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
// 处理数据
if(len > 0)
{
ProcessModbusFrame(RX1Data, len); /* 处理完整帧 */
// HAL_UART_Transmit(&huart1, RX1Data, len, 0xffff); // 将接收到的数据再发出
len = 0;
memset(RX1Data, 0, RX_BUFFER_SIZE);
HAL_UART_Receive_DMA(&huart1, RX1Data, RX_BUFFER_SIZE); /* 继续接收 */
}
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */


+ 67
- 40
Core/Src/tim.c 查看文件

@@ -24,41 +24,51 @@

/* USER CODE END 0 */

TIM_HandleTypeDef htim9;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim10;

/* TIM9 init function */
void MX_TIM9_Init(void)
/* TIM2 init function */
void MX_TIM2_Init(void)
{

/* USER CODE BEGIN TIM9_Init 0 */
/* USER CODE BEGIN TIM2_Init 0 */

/* USER CODE END TIM9_Init 0 */
/* USER CODE END TIM2_Init 0 */

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

/* USER CODE BEGIN TIM9_Init 1 */
/* USER CODE BEGIN TIM2_Init 1 */

/* USER CODE END TIM9_Init 1 */
htim9.Instance = TIM9;
htim9.Init.Prescaler = 0;
htim9.Init.CounterMode = TIM_COUNTERMODE_UP;
htim9.Init.Period = 65535;
htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim9.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim9) != HAL_OK)
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 4294967295;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED;
sSlaveConfig.InputTrigger = TIM_TS_ITR2;
if (HAL_TIM_SlaveConfigSynchro(&htim9, &sSlaveConfig) != HAL_OK)
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;
sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;
sClockSourceConfig.ClockFilter = 0;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM9_Init 2 */
__HAL_TIM_CLEAR_FLAG(&htim9, TIM_FLAG_CC2); //Çå³ýÖжϱêÖ¾
/* USER CODE END TIM9_Init 2 */
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END TIM2_Init 2 */

}
/* TIM10 init function */
@@ -90,7 +100,7 @@ void MX_TIM10_Init(void)
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 32767;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
@@ -113,20 +123,32 @@ void MX_TIM10_Init(void)
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

if(tim_baseHandle->Instance==TIM9)
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM9_MspInit 0 */
/* USER CODE BEGIN TIM2_MspInit 0 */

/* USER CODE END TIM2_MspInit 0 */
/* TIM2 clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();

/* USER CODE END TIM9_MspInit 0 */
/* TIM9 clock enable */
__HAL_RCC_TIM9_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM2 GPIO Configuration
PA15 ------> TIM2_ETR
*/
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* TIM9 interrupt Init */
HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
/* USER CODE BEGIN TIM9_MspInit 1 */
/* TIM2 interrupt Init */
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspInit 1 */

/* USER CODE END TIM9_MspInit 1 */
/* USER CODE END TIM2_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM10)
{
@@ -171,19 +193,24 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

if(tim_baseHandle->Instance==TIM9)
if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM9_MspDeInit 0 */
/* USER CODE BEGIN TIM2_MspDeInit 0 */

/* USER CODE END TIM9_MspDeInit 0 */
/* USER CODE END TIM2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM9_CLK_DISABLE();
__HAL_RCC_TIM2_CLK_DISABLE();

/**TIM2 GPIO Configuration
PA15 ------> TIM2_ETR
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15);

/* TIM9 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM1_BRK_TIM9_IRQn);
/* USER CODE BEGIN TIM9_MspDeInit 1 */
/* TIM2 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspDeInit 1 */

/* USER CODE END TIM9_MspDeInit 1 */
/* USER CODE END TIM2_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM10)
{


+ 8
- 4
Core/Src/usart.c 查看文件

@@ -21,7 +21,10 @@
#include "usart.h"

/* USER CODE BEGIN 0 */

uint8_t RX1DataTemp = 0;
uint8_t RX1Data[RX_BUFFER_SIZE] = {0};
uint8_t RX1Flag = 0;
volatile uint16_t RX1Count = 0;
/* USER CODE END 0 */

UART_HandleTypeDef huart1;
@@ -42,9 +45,9 @@ void MX_USART1_UART_Init(void)
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 19200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.WordLength = UART_WORDLENGTH_9B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Parity = UART_PARITY_ODD;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
@@ -53,7 +56,8 @@ void MX_USART1_UART_Init(void)
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1, RX1Data, RX_BUFFER_SIZE);
/* USER CODE END USART1_Init 2 */

}


+ 745
- 745
EWARM/PLSR.dep
文件差異過大導致無法顯示
查看文件


+ 1
- 1
EWARM/PLSR.ewp 查看文件

@@ -356,7 +356,7 @@
<state>$PROJ_DIR$/../Drivers/CMSIS/Device/ST/STM32F4xx/Include</state>
<state>$PROJ_DIR$/../Drivers/CMSIS/Include</state>
<state>$PROJ_DIR$\..\Hardware</state>
<state>C:\Users\Chiri\Desktop\PLSR\cmsis\uC-CPU</state>
<state>$PROJ_DIR$\..\cmsis\uC-CPU</state>
<state>$PROJ_DIR$\..\cmsis\uC-CPU\ARM-Cortex-M4\IAR</state>
<state>$PROJ_DIR$\..\cmsis\uC-LIB</state>
<state>$PROJ_DIR$\..\cmsis\uC-LIB\Ports\ARM-Cortex-M4\IAR</state>


+ 2
- 2
EWARM/settings/PLSR.PLSR.cspy.bat 查看文件

@@ -25,7 +25,7 @@ if not "%~1" == "" goto debugFile

@echo on

"D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --backend -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.driver.xcl"
"D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --backend -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.driver.xcl"

@echo off
goto end
@@ -34,7 +34,7 @@ goto end

@echo on

"D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.driver.xcl"
"D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.driver.xcl"

@echo off
:end

+ 2
- 2
EWARM/settings/PLSR.PLSR.cspy.ps1 查看文件

@@ -23,9 +23,9 @@

if ($debugfile -eq "")
{
& "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --backend -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.driver.xcl"
& "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --backend -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.driver.xcl"
}
else
{
& "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.driver.xcl"
& "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.driver.xcl"
}

+ 1
- 1
EWARM/settings/PLSR.PLSR.general.xcl 查看文件

@@ -2,7 +2,7 @@

"D:\IAR8.40.1\arm\bin\armstlink2.dll"

"C:\Users\Chiri\Desktop\PLSR\EWARM\PLSR\Exe\PLSR.out"
"C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\PLSR\Exe\PLSR.out"

--plugin="D:\IAR8.40.1\arm\bin\armbat.dll"



+ 74
- 30
EWARM/settings/PLSR.dbgdt
文件差異過大導致無法顯示
查看文件


+ 16
- 5
EWARM/settings/PLSR.dnx 查看文件

@@ -20,15 +20,15 @@
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
</StLinkDriver>
<DebugChecksum>
<Checksum>1504644991</Checksum>
<Checksum>1004691111</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>
@@ -56,6 +56,17 @@
<ITMportsLogFile>0</ITMportsLogFile>
<ITMlogFile>$PROJ_DIR$\ITM.log</ITMlogFile>
</SWOTraceHWSettings>
<Registers>
<regBase0>TIM2_CNT 10</regBase0>
</Registers>
<struct_types>
<Fmt0>Pulse-Frequency 3 0</Fmt0>
<Fmt1>Pulse-NextPulse 3 0</Fmt1>
<Fmt2>Pulse-PulseCount 3 0</Fmt2>
</struct_types>
<watch_formats>
<Fmt0>{W}1:AllPulseCNT 3 0</Fmt0>
</watch_formats>
<Trace2>
<Enabled>0</Enabled>
<ShowSource>0</ShowSource>
@@ -127,11 +138,11 @@
<mode>0</mode>
</DisassembleMode>
<Breakpoints2>
<Bp0>_ 1 "EMUL_CODE" "{$PROJ_DIR$\..\Core\Src\main.c}.309.13" 0 0 1 "" 0 "" 0</Bp0>
<Count>1</Count>
<Count>0</Count>
</Breakpoints2>
<Aliases>
<Count>0</Count>
<A0>_ "C:\Users\Chiri\Desktop\PLSR\cmsis\uC-CPU\ARM-Cortex-M4\IAR\cpu_a.asm" "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\cmsis\uC-CPU\ARM-Cortex-M4\IAR\cpu_a.asm"</A0>
<Count>1</Count>
<SuppressDialog>0</SuppressDialog>
</Aliases>
</settings>

+ 1
- 0
EWARM/settings/PLSR.reggroups 查看文件

@@ -0,0 +1 @@


+ 36
- 21
EWARM/settings/Project.wsdt
文件差異過大導致無法顯示
查看文件


+ 184
- 22
Hardware/PLSR.c 查看文件

@@ -1,22 +1,33 @@
#include "PLSR.h"
#include "PSCARR.h"
#include "tim.h"
#include "sram.h"
#include <string.h>
#include "modbus.h"

Pulse PulseOutput[10]; // 十段脉冲的配置
Option Options;


uint8_t NowPulse; /* 当前处于第几段脉冲 */
uint8_t PrePulse; /* 之前处于第几段脉冲 */
uint8_t PulseNum; /* 一共有多少段脉冲 */
int32_t MAX_Pulse; /* 最多的脉冲数 */
int32_t AccCount; /* 加速脉冲数 */
int32_t NowMAXPulse; /* 当前要达到的总脉冲 */

Pulse PulseOutput[10];
BaseOption Base;
int32_t PulseCount = 0;
int32_t AllPulseCount = 0;

/**
* @brief 根据脉冲的频率设置对应的PSC和ARR
* @param[in] Channel 脉冲通道(目前只有通道0)
* @param[in] SentPost 脉冲通道(目前只有通道Y0)
* @param[in] Ferquency 脉冲的频率
* @return 无
*/
void SetFrequency(uint8_t Channel, uint32_t Frequency)
void SetFrequency(uint8_t SentPost, uint32_t Frequency)
{
Frequency_Change_PSC_And_ARR(Frequency, &psc, &arr);
switch(Channel)
switch(SentPost)
{
case 0: TIM10->ARR = arr, TIM10->PSC = psc, TIM10->CCR1 = arr / 2; break;
}
@@ -28,15 +39,15 @@ void SetFrequency(uint8_t Channel, uint32_t Frequency)
* @param[in] Pulse 第几段脉冲
* @param[in] Ferquency 脉冲的频率
* @param[in] Count 脉冲的数量
* @param[in] Direction 脉冲的方向
* @param[in] EXT EXT信号
* @param[in] NextPulse 下一段脉冲
* @return 无
*/
void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t Direction, int8_t NextPulse)
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].Direction = Direction;
PulseOutput[Pulse].EXT = EXT;
PulseOutput[Pulse].NextPulse = NextPulse;
}

@@ -46,22 +57,18 @@ void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t Directio
* @param[in] PulseMod 绝对1/相对0
* @return 无
*/
void PulseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse)
void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse)
{
Base.StartPulse = StartPulse;
Base.PulseMod = PulseMod;
Base.NowPulse = StartPulse;
Base.MAX_Pulse = MAX_Pulse;
Options.StartPulse = StartPulse;
Options.RunMod = PulseMod;
NowPulse = StartPulse;
MAX_Pulse = MAX_Pulse;
}

void PulseStart(void)
{
// SetPulse(Base.NowPulse, PulseOutput[Base.NowPulse].Frequency,
// PulseOutput[Base.NowPulse].PulseCount,
// PulseOutput[Base.NowPulse].Direction,
// PulseOutput[Base.NowPulse].NextPulse
// );
SetFrequency(0, PulseOutput[Base.NowPulse].Frequency);
SetFrequency(Options.DirPost, PulseOutput[NowPulse].Frequency);
TIM2->ARR = PulseOutput[NowPulse].PulseCount;
HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1);
}
/**
@@ -71,7 +78,162 @@ void PulseStart(void)
* @param[in] AccCount 需要多少个脉冲完成加速
* @return 加速度
*/
int32_t GetAcc(int32_t Start, int32_t End, int32_t AccCount)
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 要设定的脉冲数
* @return 无
*/
void MAXPulseSet(int32_t PulseCount)
{
if(NowPulse == 0)
{
NowMAXPulse = PulseOutput[NowPulse].PulseCount;
}
else
{
NowMAXPulse += PulseOutput[NowPulse].PulseCount;
}
}

/**
* @brief 设置下一次进入中断的脉冲数
* @return 无
*/
void SetNextPulse(void)
{
MAXPulseSet(PulseOutput[NowPulse].PulseCount); /* 更改结果脉冲数 */
if(Options.RunMod == 0) /* 如果是相对模式 */
{
TIM2->ARR = PulseOutput[NowPulse].PulseCount;
}
else /* 如果是绝对模式 */
{
if(NowMAXPulse >= MAX_Pulse) /* 如果超出了上限 */
{
TIM2->ARR = - (MAX_Pulse - NowMAXPulse);
}
else
{
TIM2->ARR = PulseOutput[NowPulse].PulseCount;
}
}
}

/**
* @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 无
*/
void PLSRSramSave(void)
{
uint32_t temp[80] = {0}; //一共4 * 80 = 320

Write_Backup_SRAM(temp, 80);
}

/**
* @brief 数据上电读取
* @return 无
*/
void PLSRSramRead(void)
{
return (End - Start) / AccCount;
uint32_t temp[80] = {0};
Read_Backup_SRAM(temp, 80);

}

/**
* @brief 从寄存器读取设置参数
* @return 无
*/
void PLSROptionLoad(void)
{
Options.SentPost = Register_L[0x1000];
Options.DirPost = Register_L[0x1001];
Options.EXT = Register_L[0x1002];
Options.DirDelay = Register_L[0x1003]; //可能更大。
Options.Dir = Register_L[0x1004];
Options.AccMod = Register_L[0x1005];
Options.RunMod = Register_L[0x1006];
Options.AllPulse = Register_L[0x1007];
Options.StartPulse = Register_L[0x1008];
Options.InitSpeed = Register_L[0x1009]; //需要修改。
Options.AccUpTime = Register_L[0x100B];
Options.AddDownTime = Register_L[0x100C];
}

+ 35
- 14
Hardware/PLSR.h 查看文件

@@ -9,32 +9,53 @@ typedef struct
{
uint32_t Frequency ; ///<< 脉冲的频率
int32_t PulseCount; ///<< 脉冲的总数
int8_t NextPulse; ///<< 下一段脉冲是第几个 , 若为 -1 代表无下一个脉冲
uint8_t Direction; ///<< 脉冲的方向 0为正转, 1为反转
int8_t NextPulse; ///<< 下一段脉冲是第几个 , 若为0代表默认下一个脉冲
uint8_t EXT; ///<< EXT
} Pulse;

typedef struct
{
uint8_t StartPulse; ///<< 起始的脉冲段
uint8_t PulseMod; ///<< 相对模式还是绝对模式
uint8_t NowPulse; ///<< 当前处于第几段脉冲
uint8_t PrePulse; ///<< 之前处于第几段脉冲
int32_t MAX_Pulse; ///<< 最多的脉冲数
int32_t AccCount;
} BaseOption;
uint8_t SentPost; ///<<脉冲发送端子
uint8_t DirPost; ///<<脉冲方向端子
uint8_t EXT; ///<<EXT信号
uint8_t DirDelay; ///<<脉冲方向延时时间
uint8_t Dir; ///<<脉冲方向逻辑(逻辑正0,逻辑反1)
uint8_t AccMod; ///<<脉冲加减速模式
uint8_t RunMod; ///<<运行模式(相对0,绝对1)
uint8_t AllPulse; ///<<脉冲总段数
uint8_t StartPulse; ///<<起始执行段数
uint32_t InitSpeed; ///<<脉冲默认速度
uint8_t AddUpTime; ///<<脉冲默认速度加速时间
uint8_t AddDownTime; ///<<脉冲默认速度减速时间
} Option;

/* 变量声明 */
extern Pulse PulseOutput[10];
extern BaseOption Base;
extern Option Options;

extern uint8_t NowPulse; ///<< 当前处于第几段脉冲
extern uint8_t PrePulse; ///<< 之前处于第几段脉冲
extern uint8_t PulseNum; ///<< 一共有多少段脉冲(中断内使用)
extern int32_t MAX_Pulse; ///<< 最多的脉冲数
extern int32_t AccCount; ///<<加速脉冲数
extern int32_t NowMAXPulse; ///<<当前要达到的总脉冲
extern int32_t PulseCount;
extern int32_t AllPulseCount;
extern int32_t NextPulseEND;

/* 函数声明 */
void SetFrequency(uint8_t Channel, uint32_t Frequency);
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 PulseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse);
void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse);
void PulseStart(void);
int32_t GetAcc(int32_t Start, int32_t End, int32_t AccCount);
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);

uint32_t GetBase(uint8_t NowPulseNUM);

//掉电保持
void PLSRSramSave(void);
void PLSRSramRead(void);

#endif

+ 4
- 2
Hardware/modbus.c 查看文件

@@ -1,8 +1,9 @@
#include "modbus.h"
#include "PLSR.h"

uint8_t Coil[1250]; ///<存放线圈的数组
uint8_t Register_H[10000]; ///<寄存器的高字节
uint8_t Register_L[10000]; ///<寄存器的低字节
uint8_t Register_H[10000]; ///<寄存器的高字节
uint8_t Register_L[10000]; ///<寄存器的低字节
uint8_t EXRegister_H[10000]; ///<0x10000开始寄存器的高字节
uint8_t EXRegister_L[10000]; ///<0x10000开始寄存器的低字节

@@ -657,6 +658,7 @@ void GetHistory(uint8_t buffer[], uint16_t longth)
if (buffer[0] == SLAVES_ADDRES)
{
LoadHistory();
}
}



+ 3
- 0
Hardware/modbus.h 查看文件

@@ -48,4 +48,7 @@ extern uint8_t HistoryLocation; /*
extern uint8_t Flash_data[20]; /*存入flash的数据*/
extern uint8_t SaveFlag;

extern uint8_t Register_H[10000]; ///<寄存器的高字节
extern uint8_t Register_L[10000]; ///<寄存器的低字节

#endif

+ 4
- 2
Hardware/sram.c 查看文件

@@ -7,7 +7,8 @@ uint8_t SramData[20];
void Write_Backup_SRAM(uint32_t* data, uint32_t size)
{
volatile uint32_t* pBackupSRAM = (volatile uint32_t*)BKP_SRAM_BASE;
for(uint32_t i = 0; i < size; i++) {
for (uint32_t i = 0; i < size; i++)
{
pBackupSRAM[i] = data[i];
}
}
@@ -16,7 +17,8 @@ void Write_Backup_SRAM(uint32_t* data, uint32_t size)
void Read_Backup_SRAM(uint32_t* data, uint32_t size)
{
volatile uint32_t* pBackupSRAM = (volatile uint32_t*)BKP_SRAM_BASE;
for(uint32_t i = 0; i < size; i++) {
for (uint32_t i = 0; i < size; i++)
{
data[i] = pBackupSRAM[i];
}
}

+ 47
- 24
PLSR.ioc 查看文件

@@ -34,23 +34,25 @@ Mcu.IP0=DMA
Mcu.IP1=NVIC
Mcu.IP2=RCC
Mcu.IP3=SYS
Mcu.IP4=TIM9
Mcu.IP4=TIM2
Mcu.IP5=TIM10
Mcu.IP6=USART1
Mcu.IPNb=7
Mcu.Name=STM32F407I(E-G)Tx
Mcu.Package=LQFP176
Mcu.Pin0=PI8- ANTI TAMP2
Mcu.Pin1=PF6
Mcu.Pin2=PH0-OSC_IN
Mcu.Pin3=PH1-OSC_OUT
Mcu.Pin4=PA9
Mcu.Pin5=PA10
Mcu.Pin6=VP_SYS_VS_Systick
Mcu.Pin7=VP_TIM9_VS_ControllerModeGated
Mcu.Pin8=VP_TIM9_VS_ClockSourceITR
Mcu.Pin9=VP_TIM10_VS_ClockSourceINT
Mcu.PinsNb=10
Mcu.Pin0=PF6
Mcu.Pin1=PH0-OSC_IN
Mcu.Pin10=VP_SYS_VS_Systick
Mcu.Pin11=VP_TIM10_VS_ClockSourceINT
Mcu.Pin2=PH1-OSC_OUT
Mcu.Pin3=PH6
Mcu.Pin4=PH7
Mcu.Pin5=PH8
Mcu.Pin6=PH9
Mcu.Pin7=PA9
Mcu.Pin8=PA10
Mcu.Pin9=PA15
Mcu.PinsNb=12
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F407IGTx
@@ -68,11 +70,15 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
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.TIM1_BRK_TIM9_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM2_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
PA10.Signal=USART1_RX
PA15.GPIOParameters=GPIO_Speed
PA15.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA15.Locked=true
PA15.Signal=S_TIM2_CH1_ETR
PA9.Mode=Asynchronous
PA9.Signal=USART1_TX
PF6.Locked=true
@@ -81,8 +87,22 @@ PH0-OSC_IN.Mode=HSE-External-Oscillator
PH0-OSC_IN.Signal=RCC_OSC_IN
PH1-OSC_OUT.Mode=HSE-External-Oscillator
PH1-OSC_OUT.Signal=RCC_OSC_OUT
PI8-\ ANTI\ TAMP2.Locked=true
PI8-\ ANTI\ TAMP2.Signal=GPIO_Output
PH6.GPIOParameters=GPIO_Label
PH6.GPIO_Label=Y15
PH6.Locked=true
PH6.Signal=GPIO_Output
PH7.GPIOParameters=GPIO_Label
PH7.GPIO_Label=Y14
PH7.Locked=true
PH7.Signal=GPIO_Output
PH8.GPIOParameters=GPIO_Label
PH8.GPIO_Label=Y13
PH8.Locked=true
PH8.Signal=GPIO_Output
PH9.GPIOParameters=GPIO_Label
PH9.GPIO_Label=Y12
PH9.Locked=true
PH9.Signal=GPIO_Output
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
@@ -112,7 +132,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=EWARM V8
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_TIM10_Init-TIM10-false-HAL-true,6-MX_TIM9_Init-TIM9-false-HAL-true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_TIM10_Init-TIM10-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true
RCC.48MHZClocksFreq_Value=36000000
RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2
@@ -128,15 +148,17 @@ RCC.HCLKFreq_Value=72000000
RCC.HSE_VALUE=12000000
RCC.HSI_VALUE=16000000
RCC.I2SClocksFreq_Value=192000000
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,RCC_RTC_Clock_Source,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
RCC.LSE_VALUE=32768
RCC.LSI_VALUE=32000
RCC.MCO2PinFreq_Value=72000000
RCC.PLLCLKFreq_Value=72000000
RCC.PLLM=8
RCC.PLLM=6
RCC.PLLN=72
RCC.PLLQCLKFreq_Value=36000000
RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSI
RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSI
RCC.RTCFreq_Value=32000
RCC.RTCHSEDivFreq_Value=6000000
RCC.SYSCLKFreq_VALUE=72000000
@@ -147,20 +169,21 @@ RCC.VCOOutputFreq_Value=144000000
RCC.VcooutputI2S=192000000
SH.S_TIM10_CH1.0=TIM10_CH1,PWM Generation1 CH1
SH.S_TIM10_CH1.ConfNb=1
SH.S_TIM2_CH1_ETR.0=TIM2_ETR,ClockSourceETR_Mode2
SH.S_TIM2_CH1_ETR.ConfNb=1
TIM10.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM10.Channel=TIM_CHANNEL_1
TIM10.IPParameters=Channel,Prescaler,AutoReloadPreload,Pulse
TIM10.IPParameters=Channel,Prescaler,AutoReloadPreload,Pulse,OCPolarity_1
TIM10.OCPolarity_1=TIM_OCPOLARITY_LOW
TIM10.Prescaler=72
TIM10.Pulse=32767
USART1.BaudRate=19200
USART1.IPParameters=VirtualMode,BaudRate
USART1.IPParameters=VirtualMode,BaudRate,Parity,WordLength
USART1.Parity=PARITY_ODD
USART1.VirtualMode=VM_ASYNC
USART1.WordLength=WORDLENGTH_9B
VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM10_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM10_VS_ClockSourceINT.Signal=TIM10_VS_ClockSourceINT
VP_TIM9_VS_ClockSourceITR.Mode=TriggerSource_ITR2
VP_TIM9_VS_ClockSourceITR.Signal=TIM9_VS_ClockSourceITR
VP_TIM9_VS_ControllerModeGated.Mode=Gated Mode
VP_TIM9_VS_ControllerModeGated.Signal=TIM9_VS_ControllerModeGated
board=custom

+ 49
- 0
Words/流程图.md 查看文件

@@ -0,0 +1,49 @@
# 流程图

## 脉冲计数流程图

```mermaid
flowchart
A[开始] --> B(脉冲完成)
B --> C(中断)
C -->D(脉冲计数)
D --> E[结束]
```

```mermaid
flowchart
A[开始] --> |检测到清零指令|B(清零计数)
B --> C[结束]
```

## 脉冲加减速流程图

```mermaid
flowchart
A[开始] --> B(计算加速度)
B --> C(计算下一个脉冲的频率)
C -->D(设置脉冲的频率)
D --> E(开启脉冲)
E --> F[结束]
```
## 脉冲方向流程图

```mermaid
flowchart
A[开始] --> B{变量是否改变}
B --> |是| C(修改引脚电平)
B --> |否| D[结束]
C --> D
```

## 模式选择流程图

```mermaid
flowchart
A[开始] --> B{模式判断}
B --> |相对模式| C(启用相对模式函数)
B --> |绝对模式| D(启用绝对模式函数)
C --> E[结束]
D --> E[结束]
```


二進制
Words/设计方案书 .doc 查看文件


二進制
Words/设计方案书.doc 查看文件


二進制
Words/需求规格书.doc 查看文件


二進制
pictures/流程图/图1脉冲计数设计流程图.png 查看文件

Before After
Width: 123  |  Height: 456  |  Size: 11 KiB

二進制
pictures/流程图/图2脉冲加速流程图.png 查看文件

Before After
Width: 231  |  Height: 663  |  Size: 21 KiB

Loading…
取消
儲存