423 lines
10 KiB
C
423 lines
10 KiB
C
/* USER CODE BEGIN Header */
|
||
/**
|
||
******************************************************************************
|
||
* @file : main.c
|
||
* @brief : Main program body
|
||
******************************************************************************
|
||
* @attention
|
||
*
|
||
* Copyright (c) 2024 STMicroelectronics.
|
||
* All rights reserved.
|
||
*
|
||
* This software is licensed under terms that can be found in the LICENSE file
|
||
* in the root directory of this software component.
|
||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||
*
|
||
******************************************************************************
|
||
*/
|
||
/* USER CODE END Header */
|
||
/* Includes ------------------------------------------------------------------*/
|
||
#include "main.h"
|
||
#include "adc.h"
|
||
#include "dma.h"
|
||
#include "spi.h"
|
||
#include "tim.h"
|
||
#include "usart.h"
|
||
#include "gpio.h"
|
||
|
||
/* Private includes ----------------------------------------------------------*/
|
||
/* USER CODE BEGIN Includes */
|
||
|
||
/* USER CODE END Includes */
|
||
|
||
/* Private typedef -----------------------------------------------------------*/
|
||
/* USER CODE BEGIN PTD */
|
||
|
||
/* USER CODE END PTD */
|
||
|
||
/* Private define ------------------------------------------------------------*/
|
||
/* USER CODE BEGIN PD */
|
||
|
||
/* USER CODE END PD */
|
||
|
||
/* Private macro -------------------------------------------------------------*/
|
||
/* USER CODE BEGIN PM */
|
||
|
||
/* USER CODE END PM */
|
||
|
||
/* Private variables ---------------------------------------------------------*/
|
||
|
||
/* USER CODE BEGIN PV */
|
||
|
||
/* USER CODE END PV */
|
||
|
||
/* Private function prototypes -----------------------------------------------*/
|
||
void SystemClock_Config(void);
|
||
/* USER CODE BEGIN PFP */
|
||
|
||
/* USER CODE END PFP */
|
||
|
||
/* Private user code ---------------------------------------------------------*/
|
||
/* USER CODE BEGIN 0 */
|
||
|
||
void sys_init()
|
||
{
|
||
MS5803Init();
|
||
ADS1256_Init();
|
||
// hc595_init(&hc595);
|
||
_74hc165_init();
|
||
dac7311_init();
|
||
modbus_tim_init();
|
||
modbus_init();
|
||
adc1_start_dma();
|
||
laser_init(usart2_laser_send);
|
||
io_output();
|
||
// encode_init();
|
||
}
|
||
|
||
char step_cnt = 0;
|
||
int i = 0;
|
||
int bub_flag = 0;//<2F><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>״̬
|
||
float AO1_data = 0;//AO1<4F><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||
float AO2_data = 0;//AO2<4F><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||
uint16_t dis_temp = 0;//DI<44><49><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD>м<EFBFBD><D0BC><EFBFBD>
|
||
|
||
int flow_state = 0;
|
||
int OVER_TIMES = 65535;
|
||
|
||
uint16_t press_array1[10] = {0};
|
||
uint16_t press_array2[10] = {0};
|
||
uint16_t press_array3[10] = {0};
|
||
uint32_t press_array1_sum = 0;
|
||
uint32_t press_array2_sum = 0;
|
||
uint32_t press_array3_sum = 0;
|
||
int a1 = 0,a2 = 0,a3 = 0;
|
||
|
||
void sys_task(void)
|
||
{
|
||
//ao1_set(8);
|
||
//AO(0-25mA)<29><><EFBFBD><EFBFBD>,ÿ<><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(!(AO1_data == (float)(HoldReg[0]) / 1000))
|
||
{
|
||
AO1_data = (float)(HoldReg[0]) / 1000;
|
||
if(AO1_data > 25)
|
||
AO1_data = 25;
|
||
dac7311_init();
|
||
ao1_set(AO1_data);
|
||
}
|
||
if(!(AO2_data == (float)(HoldReg[1]) / 1000))
|
||
{
|
||
AO2_data = (float)(HoldReg[1]) / 1000;
|
||
if(AO2_data > 25)
|
||
AO2_data = 25;
|
||
dac7311_init();
|
||
ao2_set(AO2_data);
|
||
}
|
||
|
||
adc_task(i); //ADS1256<35><36><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
|
||
i++;
|
||
if(i > 7) i = 0;
|
||
|
||
ms5803_task(); //ms5803<30><33><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
|
||
|
||
laser_task();//<2F><>ȡһ<C8A1>μ<EFBFBD><CEBC><EFBFBD><E2B4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
get_adc_value();//<2F>õ<EFBFBD><C3B5>¶Ⱥ<C2B6>AO<41><4F><EFBFBD><EFBFBD>ֵ
|
||
|
||
io_output();//ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>IO<49><4F><EFBFBD><EFBFBD>״̬
|
||
|
||
//DI<44><49><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>
|
||
bub_flag = DisState[0] & 0x04;//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>״̬
|
||
dis_temp =_74hc165_read_byte();
|
||
DisState[1] = ~((unsigned char)(dis_temp & 0x00ff)); //<2F>ڶ<EFBFBD><DAB6><EFBFBD>74HC165<36><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
DisState[0] = ~((unsigned char)((dis_temp >> 8) & 0x00ff));//<2F><>һ<EFBFBD><D2BB>74HC165<36><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(bub_flag != (DisState[0] & 0x04))
|
||
{
|
||
HoldReg[2] ++;
|
||
if(HoldReg[2] > 65500)
|
||
HoldReg[2] = 65500;
|
||
}
|
||
|
||
|
||
}
|
||
/* USER CODE END 0 */
|
||
|
||
/**
|
||
* @brief The application entry point.
|
||
* @retval int
|
||
*/
|
||
int main(void)
|
||
{
|
||
/* USER CODE BEGIN 1 */
|
||
step_cnt = 0;
|
||
/* USER CODE END 1 */
|
||
|
||
/* MCU Configuration--------------------------------------------------------*/
|
||
|
||
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
|
||
HAL_Init();
|
||
|
||
/* USER CODE BEGIN Init */
|
||
|
||
/* USER CODE END Init */
|
||
|
||
/* Configure the system clock */
|
||
SystemClock_Config();
|
||
|
||
/* USER CODE BEGIN SysInit */
|
||
/* USER CODE END SysInit */
|
||
|
||
/* Initialize all configured peripherals */
|
||
MX_GPIO_Init();
|
||
MX_DMA_Init();
|
||
MX_SPI3_Init();
|
||
MX_TIM7_Init();
|
||
MX_USART3_UART_Init();
|
||
MX_ADC1_Init();
|
||
MX_SPI1_Init();
|
||
MX_USART6_UART_Init();
|
||
MX_SPI2_Init();
|
||
MX_USART1_UART_Init();
|
||
MX_USART2_UART_Init();
|
||
MX_TIM4_Init();
|
||
MX_TIM3_Init();
|
||
/* USER CODE BEGIN 2 */
|
||
|
||
//delay_init(168);
|
||
LL_TIM_EnableCounter(TIM3); //ʹ<>ܼ<EFBFBD><DCBC><EFBFBD>
|
||
LL_TIM_EnableIT_UPDATE(TIM3); //ʹ<>ܸ<EFBFBD><DCB8><EFBFBD><EFBFBD>ж<EFBFBD>
|
||
LL_TIM_EnableAllOutputs(TIM3);
|
||
/* USER CODE END 2 */
|
||
|
||
/* Infinite loop */
|
||
/* USER CODE BEGIN WHILE */
|
||
while (1)
|
||
{
|
||
if(it_1000ms_falg == 1)
|
||
{
|
||
switch(step_cnt)
|
||
{
|
||
case 0 :
|
||
{
|
||
LL_GPIO_ResetOutputPin(SENSOR_SELECT_GPIO_Port,SENSOR_SELECT_Pin);//ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
|
||
SetCS();//<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭѡ
|
||
it_1000ms_falg = 0;
|
||
step_cnt++;
|
||
}
|
||
break;
|
||
case 1 :
|
||
{
|
||
step_cnt++;
|
||
it_1000ms_falg = 0;
|
||
}
|
||
break;
|
||
case 2 :
|
||
{
|
||
sys_init();//Ӳ<><D3B2><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||
OVER_TIMES = 64;
|
||
it_1000ms_falg = 0;
|
||
step_cnt++;
|
||
}
|
||
break;
|
||
case 3 :
|
||
{
|
||
sys_task();//ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
/* USER CODE END WHILE */
|
||
|
||
/* USER CODE BEGIN 3 */
|
||
}
|
||
/* USER CODE END 3 */
|
||
}
|
||
|
||
/**
|
||
* @brief System Clock Configuration
|
||
* @retval None
|
||
*/
|
||
void SystemClock_Config(void)
|
||
{
|
||
LL_FLASH_SetLatency(LL_FLASH_LATENCY_5);
|
||
while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_5)
|
||
{
|
||
}
|
||
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
|
||
LL_RCC_HSE_Enable();
|
||
|
||
/* Wait till HSE is ready */
|
||
while(LL_RCC_HSE_IsReady() != 1)
|
||
{
|
||
|
||
}
|
||
LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_4, 168, LL_RCC_PLLP_DIV_2);
|
||
LL_RCC_PLL_Enable();
|
||
|
||
/* Wait till PLL is ready */
|
||
while(LL_RCC_PLL_IsReady() != 1)
|
||
{
|
||
|
||
}
|
||
while (LL_PWR_IsActiveFlag_VOS() == 0)
|
||
{
|
||
}
|
||
LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
|
||
LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_4);
|
||
LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_2);
|
||
LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
|
||
|
||
/* Wait till System clock is ready */
|
||
while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
|
||
{
|
||
|
||
}
|
||
LL_SetSystemCoreClock(168000000);
|
||
|
||
/* Update the time base */
|
||
if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK)
|
||
{
|
||
Error_Handler();
|
||
}
|
||
}
|
||
|
||
/* USER CODE BEGIN 4 */
|
||
static uint16_t g_fac_ms = 0; // ms<6D><73>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>os<6F><73>,<2C><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ms<6D><73>
|
||
static uint32_t g_fac_us = 0; /* us<75><73>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||
|
||
void SysTick_Init(void)
|
||
{
|
||
NVIC_SetPriority(SysTick_IRQn, 3);
|
||
LL_SYSTICK_EnableIT();
|
||
}
|
||
/**
|
||
* @brief <20><>ʼ<EFBFBD><CABC><EFBFBD>ӳٺ<D3B3><D9BA><EFBFBD>
|
||
* @param sysclk: ϵͳʱ<CDB3><CAB1>Ƶ<EFBFBD><C6B5>, <20><>CPUƵ<55><C6B5>(rcc_c_ck)
|
||
* @retval <20><>
|
||
*/
|
||
void delay_init(uint16_t sysclk)
|
||
{
|
||
#if SYS_SUPPORT_OS /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ֧<D2AA><D6A7>OS */
|
||
uint32_t reload;
|
||
#endif
|
||
SysTick_Init();
|
||
LL_SetSystemCoreClock(LL_SYSTICK_CLKSOURCE_HCLK); /* SYSTICKʹ<4B><CAB9><EFBFBD>ں<EFBFBD>ʱ<EFBFBD><CAB1>Դ,ͬCPUͬƵ<CDAC><C6B5> */
|
||
g_fac_us = sysclk; /* <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>OS,g_fac_us<75><73><EFBFBD><EFBFBD>Ҫʹ<D2AA><CAB9> */
|
||
g_fac_ms = g_fac_ms;
|
||
#if SYS_SUPPORT_OS /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ֧<D2AA><D6A7>OS. */
|
||
reload = sysclk; /* ÿ<><C3BF><EFBFBD>ӵļ<D3B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>λΪM */
|
||
reload *= 1000000 / configTICK_RATE_HZ; /* <20><><EFBFBD><EFBFBD>delay_ostickspersec<65>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,reloadΪ24λ
|
||
* <20>Ĵ<EFBFBD><C4B4><EFBFBD>,<2C><><EFBFBD><EFBFBD>ֵ:16777216,<2C><>168M<38><4D>,Լ<><D4BC>0.099s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
*/
|
||
g_fac_ms = 1000 / configTICK_RATE_HZ; // <20><><EFBFBD><EFBFBD>OS<4F><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD>λ
|
||
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; /* <20><><EFBFBD><EFBFBD>SYSTICK<43>ж<EFBFBD> */
|
||
SysTick->LOAD = reload; /* ÿ1/delay_ostickspersec<65><63><EFBFBD>ж<EFBFBD>һ<EFBFBD><D2BB> */
|
||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* <20><><EFBFBD><EFBFBD>SYSTICK */
|
||
#endif
|
||
}
|
||
|
||
/**
|
||
* @brief <20><>ʱnus
|
||
* @param nus: Ҫ<><D2AA>ʱ<EFBFBD><CAB1>us<75><73>.
|
||
* @note ע<><D7A2>: nus<75><73>ֵ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>34952us(<28><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>2^24 / g_fac_us @g_fac_us = 168)
|
||
* @retval <20><>
|
||
*/
|
||
void delay_us(uint32_t nus)
|
||
{
|
||
uint32_t ticks;
|
||
uint32_t told, tnow, tcnt = 0;
|
||
uint32_t reload = SysTick->LOAD; /* LOAD<41><44>ֵ */
|
||
ticks = nus * g_fac_us; /* <20><>Ҫ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD> */
|
||
told = SysTick->VAL; /* <20>ս<EFBFBD><D5BD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
||
while (1)
|
||
{
|
||
tnow = SysTick->VAL;
|
||
if (tnow != told)
|
||
{
|
||
if (tnow < told)
|
||
{
|
||
tcnt += told - tnow; /* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>һ<EFBFBD><D2BB>SYSTICK<43><4B>һ<EFBFBD><D2BB><EFBFBD>ݼ<EFBFBD><DDBC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD><EFBFBD> */
|
||
}
|
||
else
|
||
{
|
||
tcnt += reload - tnow + told;
|
||
}
|
||
told = tnow;
|
||
if (tcnt >= ticks)
|
||
{
|
||
__NOP();
|
||
break; /* ʱ<>䳬<EFBFBD><E4B3AC>/<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ӳٵ<D3B3>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD>˳<EFBFBD> */
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief <20><>ʱnms
|
||
* @param nms: Ҫ<><D2AA>ʱ<EFBFBD><CAB1>ms<6D><73> (0< nms <= 65535)
|
||
* @retval <20><>
|
||
*/
|
||
void delay_ms(uint16_t nms)
|
||
{
|
||
uint32_t repeat = nms / 30; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>30,<2C>ǿ<EFBFBD><C7BF>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD>ƵӦ<C6B5><D3A6> */
|
||
uint32_t remain = nms % 30;
|
||
|
||
while (repeat)
|
||
{
|
||
delay_us(30 * 1000); /* <20><><EFBFBD><EFBFBD>delay_us ʵ<><CAB5> 1000ms <20><>ʱ */
|
||
repeat--;
|
||
}
|
||
|
||
if (remain)
|
||
{
|
||
delay_us(remain * 1000); /* <20><><EFBFBD><EFBFBD>delay_us, <20><>β<EFBFBD><CEB2><EFBFBD><EFBFBD>ʱ(remain ms)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||
* @param {uint32_t} ticks
|
||
* @return {*}
|
||
* @note: <20><>ע<EFBFBD>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<D2AA><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HAL_Delay<61><79>rt_delay<61><79>
|
||
*/
|
||
void delay_tick(uint32_t ticks)
|
||
{
|
||
while (ticks--)
|
||
{
|
||
__NOP();
|
||
}
|
||
}
|
||
/* USER CODE END 4 */
|
||
|
||
/**
|
||
* @brief This function is executed in case of error occurrence.
|
||
* @retval None
|
||
*/
|
||
void Error_Handler(void)
|
||
{
|
||
/* USER CODE BEGIN Error_Handler_Debug */
|
||
/* User can add his own implementation to report the HAL error return state */
|
||
__disable_irq();
|
||
while (1)
|
||
{
|
||
}
|
||
/* USER CODE END Error_Handler_Debug */
|
||
}
|
||
|
||
#ifdef USE_FULL_ASSERT
|
||
/**
|
||
* @brief Reports the name of the source file and the source line number
|
||
* where the assert_param error has occurred.
|
||
* @param file: pointer to the source file name
|
||
* @param line: assert_param error line source number
|
||
* @retval None
|
||
*/
|
||
void assert_failed(uint8_t *file, uint32_t line)
|
||
{
|
||
/* USER CODE BEGIN 6 */
|
||
/* User can add his own implementation to report the file name and line number,
|
||
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
|
||
/* USER CODE END 6 */
|
||
}
|
||
#endif /* USE_FULL_ASSERT */
|