Melati

Run Settings
LanguageC
Language Version
Run Command
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" #include "lcd_character.h" #include "math.h" #include "stdbool.h" #include "stdlib.h" #include "string.h" #include "stm32f4xx_hal.h" /* 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 ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; RTC_HandleTypeDef hrtc; TIM_HandleTypeDef htim4; TIM_HandleTypeDef htim14; UART_HandleTypeDef huart3; DMA_HandleTypeDef hdma_usart3_rx; DMA_HandleTypeDef hdma_usart3_tx; /* USER CODE BEGIN PV */ RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; /* CALIBRATION */ __IO uint16_t ADC_value [4]; uint8_t MEL_CALIBRATION = 1; // Change up to customer uint8_t MEL_CALIBRATION_INTERVAL = 20; // Change up to customer /* DISPLAY */ char print[20], print1[20]; /* SENSOR */ float MEL_V1 = 0, MEL_V2 = 0, MEL_I1 = 0, MEL_I2 = 0; float MEL_COUNTER = 0; int SampleData = 1000; /*PARAMETER*/ cons int MEL_VOUT_TARGET = 14.4; cons int MEL_STEP = 0.5; //PWM float MEL_DUTY; char buffer[200]; //Bluetooth uint8_t rx_data[20]; char buff_transmit[50]; //RTC char time[50], date[50]; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_ADC1_Init(void); static void MX_TIM4_Init(void); static void MX_TIM14_Init(void); static void MX_USART3_UART_Init(void); static void MX_RTC_Init(void); void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance==TIM14) { float adc_v1 = ADC_value[3], adc_v2 = ADC_value[2], adc_i1 = ADC_value[1], adc_i2 = ADC_value[0]; static float avg_adcv1, avg_adcv2, avg_adci1, avg_adci2, count = 0; avg_adcv1 += adc_v1; avg_adcv2 += adc_v2; avg_adci1 += adc_i2; count++; if (count>= SampleData) { /* INPUT TO ADC GLOBAL */ MEL_V1 = avg_adcv1/count; MEL_V2 = avg_adcv2/count; MEL_I1 = avg_adci1/count; MEL_I2 = avg_adci2/count; avg_adcv1 = 0; avg_adcv2 = 0; avg_adci1 = 0; avg_adci2 = 0; count = 0; } } } void mel_read_sensor(float *in_v, float *out_v, float *in_i, float *out_i) { if (in_v != NULL) { *in_v = 0; } else { *in_v = (0.01*MEL_V1) + 0.7232; // Need updated calibration } if (out_v != NULL) { *out_v = 0; } else { *out_v = (0.0081*MEL_V2) + 0.4214; // Need updated calibration } if (in_i != NULL) { *in_i = 0; } else { *in_i = ((-0.0082*MEL_I1) + 20.456); // Need updated calibration } if (out_i != NULL) { *out_i = 0; } else { *out_i = ((0.0077*MEL_I2) - 22.974); // Need updated calibration } } float mel_set_DUTY(float duty_in_percent) { int pwm = (int)round((duty_in_percent/100)*2099); TIM4->CCR3 = pwm; HAL_Delay(50); float in_v, out_v; mel_read_sensor(&in_v, &out_v, NULL, NULL); return out_v; } float mel_get_step(int D) { float out_v_before; mel_read_sensor(NULL, &out_v_before, NULL, NULL); float out_v = mel_set_DUTY(MEL_DUTY); float local_step = out_v - out_v_before; if (local_step < 0) { local_step *= -1; } return local_step; } void mel_display(float in_v, float out_v, float in_i, float out_i) { lcd_gotoxy(0,2); sprintf(print, "Vi:%2.2f ", in_v); lcd_puts(print); lcd_gotoxy(8,2); lcd_puts("V "); lcd_gotoxy(10,1); sprintf(print, "Vo:%2.2f ", out_v); lcd_puts(print); lcd_gotoxy(18,1); lcd_puts("V "); lcd_gotoxy(10,2); } void mel_calibration() { float OUT_V = -1; lcd_gotoxy(0,1); lcd_puts(" CALIBRATING "); float step = 0; for ( int i = 0; (float)i < (float)MEL_CALIBRATION_INTERVAL; i++ ) { if ( OUT_V >= 11 ) { step += mel_get_step(MEL_DUTY--); } else { step += mel_get_step(MEL_DUTY++); } float z = ((float)i/(float)MEL_CALIBRATION_INTERVAL)*100; /* ANIMATION LOADING */ lcd_gotoxy(0,2); sprintf(print, " %.0f ",z); lcd_puts(print); lcd_gotoxy(13,2); sprintf(print, "%%"); lcd_puts(print); z=((float)i/(float)MEL_CALIBRATION_INTERVAL)*20; lcd_gotoxy(z,3); lcd_puts("*"); HAL_Delay(100); } MEL_STEP = step/MEL_CALIBRATION_INTERVAL; MEL_CALIBRATION = 0; lcd_clear(); } /** * @brief The application entry point. * @retval int */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_TIM4_Init(); MX_TIM14_Init(); MX_USART3_UART_Init(); MX_RTC_Init(); /* USER CODE BEGIN 2 */ lcd_init(); HAL_TIM_Base_Start_IT(&htim14); HAL_ADC_Start_DMA(&hadc1, (uint32_t*) &ADC_value,4); HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3); HAL_UART_Receive_DMA(&huart3,(uint8_t *) rx_data,4); //TAMPILAN LCD INTEGRASI// lcd_gotoxy(0,0); lcd_puts("-- ALAT YG SYUPER --"); lcd_gotoxy(0,1); lcd_puts(" CHUWANGGIHHH "); lcd_gotoxy(0,2); lcd_puts("By Melati ELIN 2018 "); lcd_gotoxy(0,3); lcd_puts(" NIP ISI SENDIRI "); HAL_Delay(2000); lcd_clear(); while (1) { /* DECLARATION */ float in_v, out_v, in_i, out_i; /* READING ADC */ mel_read_sensor(&in_v, &out_v, &in_i, &out_i); /* CALIBRATION DUTY STEP */ if (MEL_CALIBRATION) { mel_calibration(); } /* DUTY CALCULATION */ if (out_v < MEL_VOUT_TARGET) { float a = (MEL_VOUT_TARGET) - out_v; a = a/(10*MEL_STEP); if (MEL_DUTY + a < 99) { MEL_DUTY = MEL_DUTY + a; } else { MEL_DUTY = 99; } mel_get_step(MEL_DUTY); // Calling Duty function } else if (out_v > MEL_VOUT_TARGET) { float a = (MEL_VOUT_TARGET) + out_v; a = a/(10*MEL_STEP); if (MEL_DUTY > a) { MEL_DUTY = MEL_DUTY - a; } else { MEL_DUTY = 0; } mel_get_step(MEL_DUTY); // Calling Duty function } /* SHOW LCD */ mel_display(in_v, out_v, in_i, out_i); lcd_gotoxy(0,1); sprintf(print1, "D : %3.0f ", MEL_DUTY); lcd_puts(print1); lcd_gotoxy(8,1); lcd_puts("% "); } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } } /** * @brief ADC1 Initialization Function * @param None * @retval None */ static void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 4; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = 3; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_2; sConfig.Rank = 4; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /** * @brief RTC Initialization Function * @param None * @retval None */ static void MX_RTC_Init(void) { /* USER CODE BEGIN RTC_Init 0 */ /* USER CODE END RTC_Init 0 */ RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; /* USER CODE BEGIN RTC_Init 1 */ /* USER CODE END RTC_Init 1 */ /** Initialize RTC Only */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 255; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN Check_RTC_BKUP */ /* USER CODE END Check_RTC_BKUP */ /** Initialize RTC and set the Time and Date */ sTime.Hours = 0x23; sTime.Minutes = 0x59; sTime.Seconds = 0x45; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_SUNDAY; sDate.Month = RTC_MONTH_DECEMBER; sDate.Date = 0x31; sDate.Year = 0x21; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN RTC_Init 2 */ /* USER CODE END RTC_Init 2 */ } /** * @brief TIM4 Initialization Function * @param None * @retval None */ static void MX_TIM4_Init(void) { /* USER CODE BEGIN TIM4_Init 0 */ /* USER CODE END TIM4_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM4_Init 1 */ /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 0; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 2099; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM4_Init 2 */ /* USER CODE END TIM4_Init 2 */ HAL_TIM_MspPostInit(&htim4); } /** * @brief TIM14 Initialization Function * @param None * @retval None */ static void MX_TIM14_Init(void) { /* USER CODE BEGIN TIM14_Init 0 */ /* USER CODE END TIM14_Init 0 */ TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM14_Init 1 */ /* USER CODE END TIM14_Init 1 */ htim14.Instance = TIM14; htim14.Init.Prescaler = 0; htim14.Init.CounterMode = TIM_COUNTERMODE_UP; htim14.Init.Period = 9999; htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim14) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim14) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM14_Init 2 */ /* USER CODE END TIM14_Init 2 */ } /** * @brief USART3 Initialization Function * @param None * @retval None */ static void MX_USART3_UART_Init(void) { /* USER CODE BEGIN USART3_Init 0 */ /* USER CODE END USART3_Init 0 */ /* USER CODE BEGIN USART3_Init 1 */ /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; huart3.Init.BaudRate = 9600; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART3_Init 2 */ /* USER CODE END USART3_Init 2 */ } /** * Enable DMA controller clock */ static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA2_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Stream1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); /* DMA1_Stream3_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); /* DMA2_Stream0_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 |GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET); /*Configure GPIO pin : PA3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PD12 PD13 PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 |GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /*Configure GPIO pins : PC6 PC7 PC9 */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* 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 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" #include "lcd_character.h" #include "math.h" #include "stdbool.h" #include "stdlib.h" #include "string.h" #include "stm32f4xx_hal.h" /*Diisi Berapa data yang ingin di sampling dalam 1 Gelombang*/ #define SampleData 1000 /* 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 ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; RTC_HandleTypeDef hrtc; TIM_HandleTypeDef htim4; TIM_HandleTypeDef htim14; UART_HandleTypeDef huart3; DMA_HandleTypeDef hdma_usart3_rx; DMA_HandleTypeDef hdma_usart3_tx; /* USER CODE BEGIN PV */ RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; /*----Inisialisasi jumlah ADC----*/ __IO uint16_t ADC_value [4]; /*DMA*/ float adc1, Asq[SampleData], Asum, adc1, Vin; float adc2, Bsq[SampleData], Bsum, adc2, Vo; float adc3, Csq[SampleData], Csum, adc3, Iin; float adc4, Dsq[SampleData], Dsum, adc4, Io; int k=0; char buff1[200], buff2[200], buff3[200], buff4[200]; //PWM float pwm = 629.7 , pwm1; float D; char buffer[200]; //Bluetooth uint8_t rx_data[20]; char buff_transmit[50]; //RTC char time [50], date[50]; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_ADC1_Init(void); static void MX_TIM4_Init(void); static void MX_TIM14_Init(void); static void MX_USART3_UART_Init(void); static void MX_RTC_Init(void); /* USER CODE BEGIN PFP */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if (htim->Instance==TIM14) { /*----ADC arus out----*/ adc4 = ADC_value [0]; Dsum -=Dsq[k]; Dsq[k] = adc4; Dsum +=Dsq[k]; adc4 = Dsum/SampleData; //Io = 9; /*----ADC arus in----*/ adc3 = ADC_value [1]; Csum -=Csq[k]; Csq[k] = adc3 ; Csum +=Csq[k]; adc3 = Csum/SampleData; //Iin = 5; /*----ADC tegangan out----*/ adc2 = ADC_value [2]; Bsum -=Bsq[k]; Bsq[k] = adc2; Bsum +=Bsq[k]; adc2 = Bsum/SampleData; // Vo = (adc2*0.0055)-0.0033; /*----ADC tegangan in----*/ adc1 = ADC_value [3]; Asum -=Asq[k]; Asq[k] = adc1; Asum+=Asq[k]; adc1 = Asum/SampleData; //Vin = (adc1*0.0113)-0.0137; k++; if(k >= SampleData) k=0; } } /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* 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_ADC1_Init(); MX_TIM4_Init(); MX_TIM14_Init(); MX_USART3_UART_Init(); MX_RTC_Init(); /* USER CODE BEGIN 2 */ lcd_init(); HAL_TIM_Base_Start_IT(&htim14); HAL_ADC_Start_DMA(&hadc1, (uint32_t*) &ADC_value,4); HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3); HAL_UART_Receive_DMA(&huart3,(uint8_t *) rx_data,4); //TAMPILAN RTC// // lcd_clear(); // lcd_gotoxy (1,0); lcd_puts ("---MELANI---"); // lcd_gotoxy (0,1); lcd_puts ("JAM : "); // lcd_gotoxy (0,2); lcd_puts ("Tgl :"); /*---------PROGRAM RTC------------------*/ //SET TIME sTime.Hours = 15; sTime.Minutes = 14; sTime.Seconds = 00; HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN); //SET DATE sDate.Date = 07; sDate.Month = RTC_MONTH_JUNE; sDate.WeekDay = RTC_WEEKDAY_SUNDAY; sDate.Year = 21; HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN); //TAMPILAN LCD //TEGANGAN // lcd_gotoxy(0,0); lcd_puts("PROYEK AKHIR MELANI"); // lcd_gotoxy(2,1); lcd_puts("SENSOR TEGANGAN"); // lcd_gotoxy(0,2); lcd_puts("ADC Value 1:"); // lcd_gotoxy(0,3); lcd_puts("ADC Value 2:"); // lcd_gotoxy(0,2); lcd_puts(" Tegangan 1:"); // lcd_gotoxy(0,3); lcd_puts(" Tegangan 2:"); //ARUS //lcd_gotoxy(0,0); lcd_puts("PROYEK AKHIR MELANI"); //lcd_gotoxy(1,1); lcd_puts("--PENGUJIAN RELAY--"); //lcd_gotoxy(0,2); lcd_puts("ADC Value 1:"); //lcd_gotoxy(0,3); lcd_puts("ADC Value 2:"); //lcd_gotoxy(0,2); lcd_puts(" Arus 1:"); //lcd_gotoxy(0,3); lcd_puts(" Arus 2:"); //TAMPILAN LCD INTEGRASI// lcd_gotoxy(0,0); lcd_puts("--BATERAI CHARGING--"); lcd_gotoxy(0,1); lcd_puts("Vin:"); lcd_gotoxy(0,2); lcd_puts("Iin:"); lcd_gotoxy(11,1); lcd_puts("Vo:"); lcd_gotoxy(11,2); lcd_puts("Io:"); lcd_gotoxy(0,3); lcd_puts("D :"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ //RELAY// //if (V2<=11.96) if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7)==1) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET); HAL_Delay(1500); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); } if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6)==1) { HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1500); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET); } if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)==1) { HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET); HAL_Delay(1500); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_RESET); } //PENGIRIMAN DATA BLUETOOTH// //sprintf(buff_transmit, "Arus1= %.2f| Arus2= %.2f| Teg1= %2.2f| Teg2= %2.2f \n", 5.56, 9.00, 36.00, 14.4); //HAL_UART_Transmit (&huart3, (uint8_t *)buff_transmit, strlen(buff_transmit), 200); //HAL_Delay (200); //RTC HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); /* Display time Format: hh:mm:ss */ // sprintf((char*)time,"%02d:%02d:%02d",sTime.Hours, sTime.Minutes, sTime.Seconds); /* Display date Format: dd-mm-yy */ // sprintf((char*)date,"%02d-%02d-%2d",sDate.Date, sDate.Month, 2000 + sDate.Year); // lcd_gotoxy(5,1); lcd_puts(time); // lcd_gotoxy(5,2); lcd_puts(date); // sprintf(buff_transmit, "[%02d/%02d/%02d %02d:%02d]\n Vin=%.2f | Vo=%.2f | Iin=%.2f | Io=%.2f \n\n",sDate.Date, sDate.Month, 2000 + sDate.Year, sTime.Minutes, sTime.Seconds, Vin, Vo, Iin, Io); // HAL_UART_Transmit(&huart3, (uint8_t*) buff_transmit , strlen(buff_transmit),200); // HAL_Delay(200); //NILAI PWM TIM4->CCR3 = pwm; D = pwm /2099*100; // lcd_gotoxy(0,0); lcd_puts("DRIVER MOSFET"); // lcd_gotoxy(0,1); lcd_puts("Nilai D :"); // HAL_Delay (600); //ADC TEGANGAN DAN ARUS sprintf(buff1, "%.1f", Vin); sprintf(buff2, "%.1f", Vo); sprintf(buff3, "%.1f", Iin); sprintf(buff4, "%.1f", Io); //TAMPILAN NILAI TEGANGAN DAN ARUS lcd_gotoxy(4,1); lcd_puts(buff1); lcd_gotoxy(14,1); lcd_puts(buff2); lcd_gotoxy(4,2); lcd_puts(buff3); lcd_gotoxy(14,2); lcd_puts(buff4); lcd_gotoxy(5,3); lcd_puts(buffer); sprintf(buffer, "%.2f", D); HAL_Delay(600); } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } } /** * @brief ADC1 Initialization Function * @param None * @retval None */ static void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 4; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = 3; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_2; sConfig.Rank = 4; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /** * @brief RTC Initialization Function * @param None * @retval None */ static void MX_RTC_Init(void) { /* USER CODE BEGIN RTC_Init 0 */ /* USER CODE END RTC_Init 0 */ RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; /* USER CODE BEGIN RTC_Init 1 */ /* USER CODE END RTC_Init 1 */ /** Initialize RTC Only */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 255; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN Check_RTC_BKUP */ /* USER CODE END Check_RTC_BKUP */ /** Initialize RTC and set the Time and Date */ sTime.Hours = 0x23; sTime.Minutes = 0x59; sTime.Seconds = 0x45; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_SUNDAY; sDate.Month = RTC_MONTH_DECEMBER; sDate.Date = 0x31; sDate.Year = 0x21; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN RTC_Init 2 */ /* USER CODE END RTC_Init 2 */ } /** * @brief TIM4 Initialization Function * @param None * @retval None */ static void MX_TIM4_Init(void) { /* USER CODE BEGIN TIM4_Init 0 */ /* USER CODE END TIM4_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM4_Init 1 */ /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 0; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 2099; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM4_Init 2 */ /* USER CODE END TIM4_Init 2 */ HAL_TIM_MspPostInit(&htim4); } /** * @brief TIM14 Initialization Function * @param None * @retval None */ static void MX_TIM14_Init(void) { /* USER CODE BEGIN TIM14_Init 0 */ /* USER CODE END TIM14_Init 0 */ TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM14_Init 1 */ /* USER CODE END TIM14_Init 1 */ htim14.Instance = TIM14; htim14.Init.Prescaler = 0; htim14.Init.CounterMode = TIM_COUNTERMODE_UP; htim14.Init.Period = 9999; htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim14) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim14) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM14_Init 2 */ /* USER CODE END TIM14_Init 2 */ } /** * @brief USART3 Initialization Function * @param None * @retval None */ static void MX_USART3_UART_Init(void) { /* USER CODE BEGIN USART3_Init 0 */ /* USER CODE END USART3_Init 0 */ /* USER CODE BEGIN USART3_Init 1 */ /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; huart3.Init.BaudRate = 9600; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART3_Init 2 */ /* USER CODE END USART3_Init 2 */ } /** * Enable DMA controller clock */ static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA2_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Stream1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); /* DMA1_Stream3_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); /* DMA2_Stream0_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 |GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET); /*Configure GPIO pin : PA3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PD12 PD13 PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 |GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /*Configure GPIO pins : PC6 PC7 PC9 */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* 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 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "HAL_lcd_character_STM32.h" #include "math.h" #include "stdio.h" #include "stdlib.h" #define PB_1 HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_10) #define PB_2 HAL_GPIO_ReadPin (GPIOB, GPIO_PIN_11) /* 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 ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; /* USER CODE BEGIN PV */ char print0[20], print1[20], print2[20]; float RAF_V1=0, RAF_V2=0, RAF_V3=0, RAF_I1=0, RAF_I2=0, RAF_I3=0, RAF_L=0, RAF_PWM_I=0, RAF_SUPPLY=0; int INTERUPT_DUTY=-1, RAF_CHARGING=-1, TYPE; float CNT=0; /* SETTING UP PARAMETER */ const float RAF_TARGET_VOUT_12=14; // set with condition of the PV const float RAF_TARGET_VOUT_24=28; // set with condition of the PV const float RAF_LOW_BATT_12=10; // set with condition of the battery const float RAF_LOW_BATT_24=20; // set with condition of the battery (11.8 * 2) float RAF_LOW_BATT; const float RAF_CONDITION_VBATT_12=12; const float RAF_CONDITION_VBATT_24=24; float RAF_CONDITION_VIN_24=RAF_CONDITION_VBATT_24+(0.12*RAF_CONDITION_VBATT_24); float RAF_CONDITION_VIN_12=RAF_CONDITION_VBATT_12+(0.12*RAF_CONDITION_VBATT_12); float RAF_CONDITION_VIN, RAF_CONDITION_VBATT, RAF_TARGET_VOUT; const float RAF_ERROR=0.0; const float RAF_BATTERY_FULL_12=13.5; const float RAF_BATTERY_FULL_24=27; const float RAF_CURRENT_CHARGING=0.3; float RAF_BATTERY_FULL; int RAF_MENU=0; int RAF_TEST=0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_ADC1_Init(void); static void MX_TIM1_Init(void); static void MX_TIM2_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ __IO uint16_t adc_value[9]; /* SETTING UP CALIBRATION */ uint8_t RAF_RELAY_1 = 0; uint8_t RAF_RELAY_2 = 0; uint8_t RAF_CONTROL_RELAY_INTERVAL=50; // Time for Relay to take action (n secon *10) uint8_t RAF_CALIBRATION_INTERVAL=20; // Time for PWM to take calibration (n secon * 10) uint8_t RAF_CALIBRATION = 1; float RAF_CHARGING_TIME = -1; float RAF_D = 0; float RAF_STEP = 0.6; /* SETTING UP ADC WITH TIMER */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if (htim->Instance==TIM2){ float adc_v1, adc_v2, adc_v3, adc_i1, adc_i2, adc_i3, adc_light, adc_pwm, adc_supply; static float avg_adcv1=0, avg_adcv2=0, avg_adcv3=0, avg_adci1=0, avg_adci2=0, avg_adci3=0, avg_adclight=0, avg_adcpwm=0, avg_adcsupply=0; static float real_adcv1=0, real_adcv2=0, real_adcv3=0, real_adci1=0, real_adci2=0, real_adci3=0, real_adclight=0, real_adcpwm=0, real_adcsupply=0; static float counter=0; adc_v1=adc_value[0]; adc_v2=adc_value[2]; adc_v3=adc_value[4]; adc_i1=adc_value[1]; adc_i2=adc_value[3]; adc_i3=adc_value[5]; adc_pwm=adc_value[6]; adc_light=adc_value[7]; adc_supply=adc_value[8]; avg_adcv1+=adc_v1; avg_adcv2+=adc_v2; avg_adcv3+=adc_v3; avg_adci1+=adc_i1; avg_adci2+=adc_i2; avg_adci3+=adc_i3; avg_adclight+=adc_light; avg_adcpwm+=adc_pwm; avg_adcsupply+=adc_supply; counter++; CNT = counter; if (counter>=500){ real_adcv1=avg_adcv1/counter; real_adcv2=avg_adcv2/counter; real_adcv3=avg_adcv3/counter; real_adci1=avg_adci1/counter; real_adci2=avg_adci2/counter; real_adci3=avg_adci3/counter; real_adclight=avg_adclight/counter; real_adcpwm=avg_adcpwm/counter; real_adcsupply=avg_adcsupply/counter; /* INPUT TO GLOBAL VARIABLE */ RAF_V1=real_adcv1; RAF_V2=real_adcv2; RAF_V3=real_adcv3; RAF_I1=real_adci1; RAF_I2=real_adci2; RAF_I3=real_adci3; RAF_L=real_adclight; RAF_PWM_I=real_adcpwm; RAF_SUPPLY=real_adcsupply; avg_adcv1=0; avg_adcv2=0; avg_adcv3=0; avg_adci1=0; avg_adci2=0; avg_adci3=0; avg_adclight=0; avg_adcpwm=0; avg_adcsupply=0; counter=0; } } } /* DECLARATION FUNCTION */ void raf_read_sensor(float *in_v, float *out_v, float *batt_v, float *in_i, float *out_i, float *batt_i, float *in_pwm, float *light, float *supply) { //Calibration if ( in_v != NULL ) { if ( RAF_V1 <= 0 ) { *in_v = 0; } else { *in_v = (0.01*RAF_V1) + 0.7232; // Callibration 04 Juli 2019 } } if ( out_v != NULL ) { if ( RAF_V2 <= 0 ) { *out_v = 0; } else { *out_v = (0.0081*RAF_V2) + 0.4214; // Callibration 3 } } if ( batt_v != NULL ) { if ( RAF_V3 <= 0 ) { *batt_v = 0; } else { *batt_v = (0.008*RAF_V3) + 0.415; // Callibration 3 } } if ( in_i != NULL ) { if ( TYPE != 11 ){ //*in_i = ((-0.0082*RAF_I1) + 20.456); *in_i = (*out_i*(*out_v))/(*in_v); if ( *in_v <= 1 ){ *in_i = 0; } if ( *in_i <= 0 ){ *in_i = *in_i*(-1); } } else if ( TYPE == 11 ){ *in_i = (*out_i*(*out_v))/(*in_v); } } if ( out_i != NULL ) { *out_i = ((-0.0082*RAF_I2) + 24.456); if ( *out_v == 0 ){ *out_i = 0; } if ( *out_i <= 0 ){ *out_i = *out_i*(-1); } } if ( batt_i != NULL ) { *batt_i = ((0.0077*RAF_I3) - 22.974); // Manual Callibration if ( TYPE == 31 ){ *batt_i = *out_i - 2; } if ( *batt_i <= 0 ){ *batt_i = *batt_i * (-1); } } if ( in_pwm != NULL ) { *in_pwm = RAF_PWM_I/4095*100; } if ( light != NULL ) { *light = (RAF_L/4095)*100; } if ( supply != NULL ) { *supply = (RAF_SUPPLY/4095)*100; } } /* SETTING UP CALIBRATION BATTERY */ void raf_select_battery(float batt_v){ if (batt_v <= (RAF_CONDITION_VBATT_12)){ RAF_CONDITION_VIN = RAF_CONDITION_VIN_12; RAF_CONDITION_VBATT = RAF_CONDITION_VBATT_12; RAF_TARGET_VOUT = RAF_TARGET_VOUT_12; RAF_BATTERY_FULL = RAF_BATTERY_FULL_12; RAF_LOW_BATT = RAF_LOW_BATT_12; } if (( batt_v > (RAF_CONDITION_VBATT_12) )){ RAF_CONDITION_VIN = RAF_CONDITION_VIN_24; RAF_CONDITION_VBATT = RAF_CONDITION_VBATT_24; RAF_TARGET_VOUT = RAF_TARGET_VOUT_24; RAF_BATTERY_FULL = RAF_BATTERY_FULL_24; RAF_LOW_BATT = RAF_LOW_BATT_24; } } void raf_control_relay() { uint8_t isSet_Relay_1 = 0; static int raf_relay_1 = -1; if ( raf_relay_1 != RAF_RELAY_1 ) { if ( RAF_RELAY_1 ) { HAL_GPIO_WritePin (GPIOB, GPIO_PIN_13, GPIO_PIN_SET); // Relay 1 (Load) HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED Indicator } else { HAL_GPIO_WritePin (GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); // Relay 1 (Load) HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED Indicator } isSet_Relay_1 = 1; raf_relay_1 = RAF_RELAY_1; } static int raf_relay_2 = -1; if ( raf_relay_2 != RAF_RELAY_2 ) { if ( isSet_Relay_1 == 1 ) { HAL_Delay(1000); } if ( RAF_RELAY_2 ) { HAL_GPIO_WritePin (GPIOB, GPIO_PIN_14, GPIO_PIN_SET); // Relay 2 (Battery) HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED Indicator } else { HAL_GPIO_WritePin (GPIOB, GPIO_PIN_14, GPIO_PIN_RESET); // Relay 2 (Battery) HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED Indicator } raf_relay_2 = RAF_RELAY_2; } } void raf_calibration_relay(float relay){ static int relay_1=0, relay_2=0; if ( relay==1 ){ relay_1++; relay_2--; } else if ( relay==2 ){ relay_1--; relay_2++; } else if ( relay==3 ){ relay_1++; relay_2++; } /* UJI RELAY */ #if 1 if ( relay_1<0 ){ RAF_RELAY_1=0; } else { RAF_RELAY_1=1; } if ( relay_2<0 ){ RAF_RELAY_2=0; } else { RAF_RELAY_2=1; } relay_1=0; relay_2=0; #else if ( RAF_RELAY_1 ) { RAF_RELAY_1 = 0; } else { RAF_RELAY_1 = 1; } if ( RAF_RELAY_2 ) { RAF_RELAY_2 = 0; } else { RAF_RELAY_2 = 1; } #endif raf_control_relay(); } void raf_reset_display(){ static int counter=0, counter1=0; counter++; counter1++; if (counter >= 2){ lcd_init(); counter=0; } if (counter1 >= 10){ lcd_clear(); counter1=0; } } void raf_read_condition_supply(float in_v, float out_v, float batt_v, float batt_i, float supply){ static int relay_1=0, relay_2=0; static int counter=0; counter++; if (RAF_CHARGING < 0){ if (supply<70){ if (in_v>=RAF_CONDITION_VIN && batt_v>RAF_CONDITION_VBATT){ relay_1++; relay_2--; INTERUPT_DUTY=-1; TYPE=11; if (out_v <= (RAF_CONDITION_VIN-1) && out_v >= RAF_CONDITION_VBATT){ raf_reset_display(); } } else if (in_v>=RAF_CONDITION_VIN && batt_v<=RAF_CONDITION_VBATT){ relay_1++; relay_2++; INTERUPT_DUTY=-1; RAF_CHARGING=1; TYPE=12; if (out_v <= (RAF_CONDITION_VIN-1) && out_v >= RAF_CONDITION_VBATT){ raf_reset_display(); } } else if (in_v<RAF_CONDITION_VIN && batt_v>RAF_LOW_BATT){ if (RAF_TEST != 1){ INTERUPT_DUTY=1; } relay_1++; relay_2++; RAF_CHARGING=-1; TYPE=13; } else if (in_v<RAF_CONDITION_VIN && batt_v<RAF_LOW_BATT){ if (RAF_TEST != 1){ INTERUPT_DUTY=1; } relay_1--; relay_2--; RAF_CHARGING=-1; TYPE=14; } } else if (supply>=70){ if (in_v>=RAF_CONDITION_VIN && batt_v>RAF_CONDITION_VBATT){ relay_1--; relay_2--; RAF_CHARGING=-1; if (RAF_TEST != 1){ INTERUPT_DUTY=1; } TYPE=21; } else if (in_v>=RAF_CONDITION_VIN && batt_v<RAF_CONDITION_VBATT){ relay_1--; relay_2++; INTERUPT_DUTY=-1; RAF_CHARGING=1; TYPE=22; } else if (in_v<RAF_CONDITION_VIN && batt_v>RAF_CONDITION_VBATT){ relay_1--; relay_2--; RAF_CHARGING=-1; if (RAF_TEST != 1){ INTERUPT_DUTY=1; } TYPE=23; } else if (in_v<RAF_CONDITION_VIN && batt_v<RAF_CONDITION_VBATT){ relay_1--; relay_2--; RAF_CHARGING=-1; if (RAF_TEST != 1){ INTERUPT_DUTY=1; } TYPE=24; } } } if (RAF_CHARGING > 0){ if (supply<70){ if (in_v>=RAF_CONDITION_VIN){ relay_1++; INTERUPT_DUTY=-1; } else if (in_v<RAF_CONDITION_VIN){ if (RAF_TEST != 1){ INTERUPT_DUTY=1; } relay_1++; relay_2++; RAF_CHARGING=-1; } if ( counter >= 1000 ){ if (batt_i<RAF_CURRENT_CHARGING){ relay_2--; counter = 0; RAF_CHARGING=-1; } } TYPE=31; } else if (supply>=70){ if (in_v>=RAF_CONDITION_VIN){ relay_1--; } else if (in_v<RAF_CONDITION_VIN){ relay_1--; relay_2--; if (RAF_TEST != 1){ INTERUPT_DUTY=1; } } if ( counter >= 1000 ){ if (batt_i<RAF_CURRENT_CHARGING){ relay_2--; counter = 0; RAF_CHARGING=-1; } } TYPE=32; } } /* UJI RELAY */ #if 1 if ( relay_1 != 0){ if ( relay_1<0 ){ RAF_RELAY_1=0; } else { RAF_RELAY_1=1; } if ( relay_2<0 ){ RAF_RELAY_2=0; } else { RAF_RELAY_2=1; } relay_1=0; relay_2=0; } #else if ( RAF_RELAY_1 ) { RAF_RELAY_1 = 0; } else { RAF_RELAY_1 = 1; } if ( RAF_RELAY_2 ) { RAF_RELAY_2 = 0; } else { RAF_RELAY_2 = 1; } #endif raf_control_relay(); } void raf_read_condition_light(float in_v, float out_v, float batt_v, float batt_i, float light){ static int relay_1=0, relay_2=0; static int counter=0; counter++; if (RAF_CHARGING < 0){ if (light>=95){ if (in_v>=RAF_CONDITION_VIN && batt_v>RAF_LOW_BATT){ relay_1++; relay_2--; INTERUPT_DUTY=-1; TYPE=11; if (out_v <= RAF_CONDITION_VIN && out_v >= RAF_CONDITION_VBATT){ raf_reset_display(); } } else if (in_v>=RAF_CONDITION_VIN && batt_v<=RAF_LOW_BATT){ relay_1++; relay_2++; INTERUPT_DUTY=-1; RAF_CHARGING=1; TYPE=12; if (out_v <= RAF_CONDITION_VIN && out_v >= RAF_CONDITION_VBATT){ raf_reset_display(); } } else if (in_v<RAF_CONDITION_VIN && batt_v>RAF_LOW_BATT){ if (RAF_TEST != 1){ INTERUPT_DUTY=1; } relay_1++; relay_2++; RAF_CHARGING=-1; TYPE=13; } else if (in_v<RAF_CONDITION_VIN && batt_v<RAF_LOW_BATT){ if (RAF_TEST != 1){ INTERUPT_DUTY=1; } relay_1--; relay_2--; RAF_CHARGING=-1; TYPE=14; } } else if (light<95){ if (in_v>=RAF_CONDITION_VIN && batt_v>RAF_LOW_BATT){ relay_1--; relay_2--; RAF_CHARGING=-1; if (RAF_TEST != 1){ INTERUPT_DUTY=1; } TYPE=21; } else if (in_v>=RAF_CONDITION_VIN && batt_v<RAF_LOW_BATT){ relay_1--; relay_2++; INTERUPT_DUTY=-1; RAF_CHARGING=1; TYPE=22; } else if (in_v<RAF_CONDITION_VIN && batt_v>RAF_LOW_BATT){ relay_1--; relay_2--; RAF_CHARGING=-1; if (RAF_TEST != 1){ INTERUPT_DUTY=1; } TYPE=23; } else if (in_v<RAF_CONDITION_VIN && batt_v<RAF_LOW_BATT){ relay_1--; relay_2--; RAF_CHARGING=-1; if (RAF_TEST != 1){ INTERUPT_DUTY=1; } TYPE=24; } } } if (RAF_CHARGING > 0){ if (light>=95){ if (batt_i<RAF_CURRENT_CHARGING){ relay_2--; RAF_CHARGING=-1; } TYPE=31; } else if (light<95){ if (batt_i<RAF_CURRENT_CHARGING){ relay_2--; RAF_CHARGING=-1; } TYPE=32; } } /* UJI RELAY */ #if 1 if ( relay_1 != 0){ if ( relay_1<0 ){ RAF_RELAY_1=0; } else { RAF_RELAY_1=1; } if ( relay_2<0 ){ RAF_RELAY_2=0; } else { RAF_RELAY_2=1; } relay_1=0; relay_2=0; } #else if ( RAF_RELAY_1 ) { RAF_RELAY_1 = 0; } else { RAF_RELAY_1 = 1; } if ( RAF_RELAY_2 ) { RAF_RELAY_2 = 0; } else { RAF_RELAY_2 = 1; } #endif raf_control_relay(); } void raf_display_1(float in_v, float out_v, float batt_v){ lcd_gotoxy(0,2); sprintf(print0, "Vi:%2.2f ", in_v); lcd_puts(print0); lcd_gotoxy(8,2); lcd_puts("V "); lcd_gotoxy(10,1); sprintf(print0, "Vo:%2.2f ", out_v); lcd_puts(print0); lcd_gotoxy(18,1); lcd_puts("V "); lcd_gotoxy(10,2); sprintf(print0, "Vb:%2.2f ", batt_v); lcd_puts(print0); lcd_gotoxy(18,2); lcd_puts("V "); } void raf_display_2(float in_i, float out_i, float batt_i){ lcd_gotoxy(0,2); sprintf(print0, "Ii:%2.2f ", in_i); lcd_puts(print0); lcd_gotoxy(8,2); lcd_puts("A "); lcd_gotoxy(10,1); sprintf(print0, "Io:%2.2f ", out_i); lcd_puts(print0); lcd_gotoxy(18,1); lcd_puts("A "); lcd_gotoxy(10,2); sprintf(print0, "Ib:%2.2f ", batt_i); lcd_puts(print0); lcd_gotoxy(18,2); lcd_puts("A "); } void raf_display_3(float in_p, float out_p, float batt_p){ lcd_gotoxy(0,2); sprintf(print0, "Pi:%3.1f ", in_p); lcd_puts(print0); lcd_gotoxy(8,2); lcd_puts("W "); lcd_gotoxy(10,1); sprintf(print0, "Po:%3.1f ", out_p); lcd_puts(print0); lcd_gotoxy(18,1); lcd_puts("W "); lcd_gotoxy(10,2); sprintf(print0, "Pb:%3.1f ", batt_p); lcd_puts(print0); lcd_gotoxy(18,2); lcd_puts("W "); } float raf_set_DUTY(float duty_in_precent) { int pwm = (int)round((duty_in_precent/100) * 1799); TIM1 -> CCR4=pwm; HAL_Delay(50); float in_v, out_v; raf_read_sensor(&in_v, &out_v, NULL, NULL, NULL, NULL, NULL, NULL, NULL); return out_v; } float raf_set_DUTY_callibration(float duty_in_precent) { /* Callibration */ int pwm = (int)round((duty_in_precent/100) * 1799); TIM1 -> CCR4=pwm; HAL_Delay(100); float in_v, out_v; raf_read_sensor(&in_v, &out_v, NULL, NULL, NULL, NULL, NULL, NULL, NULL); return out_v; } float raf_set_MANUAL(float pwm_in_precent) { RAF_D=pwm_in_precent; int pwm = (int)round((pwm_in_precent/100) * 1799); TIM1 -> CCR4=pwm; HAL_Delay(100); float in_v, out_v; raf_read_sensor(&in_v, &out_v, NULL, NULL, NULL, NULL, NULL, NULL, NULL); return out_v; } void raf_set_CALIBRATION_V(float adc_v1, float adc_v2, float adc_v3){ lcd_gotoxy(0,2); sprintf(print1, "Vi: %4.0f ", adc_v1); lcd_puts(print1); lcd_gotoxy(10,1); sprintf(print1, "Vo: %4.0f ", adc_v2); lcd_puts(print1); lcd_gotoxy(10,2); sprintf(print1, "Vb: %4.0f ", adc_v3); lcd_puts(print1); } void raf_set_CALIBRATION_I(float adc_i1, float adc_i2, float adc_i3){ lcd_gotoxy(0,2); sprintf(print1, "Ii: %4.0f ", adc_i1); lcd_puts(print1); lcd_gotoxy(10,1); sprintf(print1, "Io: %4.0f ", adc_i2); lcd_puts(print1); lcd_gotoxy(10,2); sprintf(print1, "Ib: %4.0f ", adc_i3); lcd_puts(print1); } float raf_get_step(int D) { float out_v_before; raf_read_sensor(NULL, &out_v_before, NULL, NULL, NULL, NULL, NULL, NULL, NULL); float out_v = raf_set_DUTY(RAF_D); float local_step = out_v - out_v_before; if ( local_step < 0 ) { local_step *= -1; } return local_step; } float raf_get_step_callibration(int D) { float out_v_before; raf_read_sensor(NULL, &out_v_before, NULL, NULL, NULL, NULL, NULL, NULL, NULL); float out_v = raf_set_DUTY_callibration(RAF_D); float local_step = out_v - out_v_before; if ( local_step < 0 ) { local_step *= -1; } return local_step; } void raf_calibration() { float OUT_V = -1; lcd_gotoxy(0,1); lcd_puts(" CALIBRATING "); float step = 0; for ( int i = 0; (float)i < (float)RAF_CALIBRATION_INTERVAL; i++ ) { if (i == 0){ HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED Indicator } else if (i %2 == 0){ HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED Indicator } else{ HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED Indicator } if ( OUT_V >= 11 ) { step += raf_get_step_callibration(RAF_D--); } else { step += raf_get_step_callibration(RAF_D++); } float z = ((float)i/(float)RAF_CALIBRATION_INTERVAL)*100; /* ANIMATION LOADING */ lcd_gotoxy(0,2); sprintf(print2, " %.0f ",z); lcd_puts(print2); lcd_gotoxy(13,2); sprintf(print2, "%%"); lcd_puts(print2); z=((float)i/(float)RAF_CALIBRATION_INTERVAL)*20; lcd_gotoxy(z,3); lcd_puts("*"); HAL_Delay(100); } HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED Indicator OFF RAF_STEP = step/RAF_CALIBRATION_INTERVAL; RAF_CALIBRATION = 0; lcd_clear(); } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* 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_ADC1_Init(); MX_TIM1_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_Start_DMA (&hadc1, (uint32_t*) &adc_value, 9); HAL_TIM_Base_Start (&htim1); HAL_TIM_Base_Start_IT (&htim2); HAL_TIM_PWM_Start (&htim1, TIM_CHANNEL_4); lcd_gotoxy(0,0); lcd_puts(" EMERGENCY SOLAR "); lcd_gotoxy(0,1); lcd_puts(" CONTROLER "); lcd_gotoxy(0,2); lcd_puts("By Mochammad Rafli I"); lcd_gotoxy(0,3); lcd_puts(" 13031610087 "); HAL_Delay(2000); lcd_clear(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* DECLARATION */ float adc_v1=RAF_V1, adc_v2=RAF_V2, adc_v3=RAF_V3, adc_i1=RAF_I1, adc_i2=RAF_I2, adc_i3=RAF_I3; float in_v, out_v, batt_v, in_i, out_i, batt_i, in_pwm, light, supply; float in_p, out_p, batt_p; //static int counter_display=0; //counter_display++; /* READING ADC */ raf_read_sensor(&in_v, &out_v, &batt_v, &in_i, &out_i, &batt_i, &in_pwm, &light, &supply); /* POWER VALUE */ in_p=in_v*in_i; out_p=out_v*out_i; batt_p=batt_v*batt_i; /* SELECTING BATTERY */ raf_select_battery(batt_v); /* CALIBRATION DUTY */ if ( RAF_CALIBRATION ) { raf_calibration(); } // SELECTING DUTY METHOD if ( RAF_TEST == 0 ){ if ( INTERUPT_DUTY <= 0 ){ if ( out_v < (RAF_TARGET_VOUT-(RAF_ERROR*RAF_TARGET_VOUT))) { float a = (RAF_TARGET_VOUT-(RAF_ERROR*RAF_TARGET_VOUT)) - out_v; a = a / (10*RAF_STEP); if ( RAF_D + a <95 ) { RAF_D = RAF_D + a; } else { RAF_D = 95; } raf_get_step(RAF_D); } else if ( out_v > (RAF_TARGET_VOUT+(RAF_ERROR*RAF_TARGET_VOUT))) { float a = out_v - (RAF_TARGET_VOUT+(RAF_ERROR*RAF_TARGET_VOUT)); a = a / (10*RAF_STEP); if ( RAF_D > a ) { RAF_D = RAF_D - a; } else { RAF_D = 0; } } } else if ( INTERUPT_DUTY > 0 ){ RAF_D = 0; raf_get_step(RAF_D); } } else if( RAF_TEST == 1){ raf_set_MANUAL(in_pwm); raf_display_1(in_v, out_v, batt_v); lcd_gotoxy(0,0); lcd_puts("SMART ECC (Testing) "); } /* READING CONDITION */ //raf_read_condition_light(in_v, out_v, batt_v, batt_i, light); raf_read_condition_supply(in_v, out_v, batt_v, batt_i, supply); /* CONTROL RELAY FOR CALIBRATION ONLY */ /* int relay=1; raf_calibration_relay(relay); */ /* DISPLAY D B T L*/ lcd_gotoxy(0,1); sprintf(print2, "D : %3.0f ", RAF_D); lcd_puts(print2); lcd_gotoxy(8,1); lcd_puts("% "); if (supply < 70){ lcd_gotoxy(0,3); sprintf(print2, "S : No Supply "); lcd_puts(print2); } else if (supply > 70){ lcd_gotoxy(0,3); sprintf(print2, "S : Supply Good"); lcd_puts(print2); } //lcd_gotoxy(10,3); //sprintf(print2, "TP: %d", TYPE); lcd_puts(print2); //counter_display = 0; /* PUSH BUTTON FUNCTION */ static int prev_raf_menu = -1; if ( PB_1 ){ HAL_Delay(100); if ( PB_1 ){ if ( prev_raf_menu != RAF_MENU ) { lcd_init(); RAF_MENU = (RAF_MENU + 1) % 3; prev_raf_menu = RAF_MENU; } } } else { prev_raf_menu = -1; } if ( RAF_TEST == 0 ) { if ( RAF_MENU == 0 ) { raf_display_1(in_v, out_v, batt_v); } else if ( RAF_MENU == 1 ) { raf_display_2(in_i, out_i, batt_i); } else if ( RAF_MENU == 2 ) { raf_display_3(in_p, out_p, batt_p); } } /* TESTING BUTTON FUNCTION */ static int prev_raf_test = -1; if ( PB_2 ){ HAL_Delay(100); if ( PB_2 ){ if ( prev_raf_test != RAF_TEST ) { lcd_init(); RAF_TEST = (RAF_TEST + 1) % 4; prev_raf_test = RAF_TEST; } } } else { prev_raf_test = -1; } if ( RAF_TEST == 2 ){ raf_set_CALIBRATION_V(adc_v1, adc_v2, adc_v3); lcd_gotoxy(0,0); lcd_puts("SMART ECC (Clbr. V) "); } else if ( RAF_TEST == 3 ){ raf_set_CALIBRATION_I(adc_i1, adc_i2, adc_i3); lcd_gotoxy(0,0); lcd_puts("SMART ECC (Clbr. I) "); }else if ( RAF_TEST == 0 ){ lcd_gotoxy(0,0); lcd_puts("SMART ECC "); } HAL_Delay(100); } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } } /** * @brief ADC1 Initialization Function * @param None * @retval None */ static void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Common config */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 9; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_2; sConfig.Rank = ADC_REGULAR_RANK_3; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_3; sConfig.Rank = ADC_REGULAR_RANK_4; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = ADC_REGULAR_RANK_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_5; sConfig.Rank = ADC_REGULAR_RANK_6; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_6; sConfig.Rank = ADC_REGULAR_RANK_7; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_7; sConfig.Rank = ADC_REGULAR_RANK_8; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_8; sConfig.Rank = ADC_REGULAR_RANK_9; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /** * @brief TIM1 Initialization Function * @param None * @retval None */ static void MX_TIM1_Init(void) { /* USER CODE BEGIN TIM1_Init 0 */ /* USER CODE END TIM1_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; /* USER CODE BEGIN TIM1_Init 1 */ /* USER CODE END TIM1_Init 1 */ htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 1799; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) { Error_Handler(); } sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM1_Init 2 */ /* USER CODE END TIM1_Init 2 */ HAL_TIM_MspPostInit(&htim1); } /** * @brief TIM2 Initialization Function * @param None * @retval None */ static void MX_TIM2_Init(void) { /* USER CODE BEGIN TIM2_Init 0 */ /* USER CODE END TIM2_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM2_Init 1 */ /* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 999; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 143; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_OC_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM2_Init 2 */ /* USER CODE END TIM2_Init 2 */ } /** * Enable DMA controller clock */ static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_3|GPIO_PIN_4 |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8 |GPIO_PIN_9, GPIO_PIN_RESET); /*Configure GPIO pin : PC13 */ GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pins : PB10 PB11 */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pins : PB13 PB14 PB3 PB4 PB5 PB6 PB7 PB8 PB9 */ GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_3|GPIO_PIN_4 |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8 |GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* 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 */ /* 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, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" #include "lcd_character.h" #include "math.h" #include "stdbool.h" #include "stdlib.h" #include "string.h" #include "stm32f4xx_hal.h" /* 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 ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; RTC_HandleTypeDef hrtc; TIM_HandleTypeDef htim4; TIM_HandleTypeDef htim14; UART_HandleTypeDef huart3; DMA_HandleTypeDef hdma_usart3_rx; DMA_HandleTypeDef hdma_usart3_tx; /* USER CODE BEGIN PV */ RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; /* CALIBRATION */ __IO uint16_t ADC_value [4]; uint8_t MEL_CALIBRATION = 1; // Change up to customer uint8_t MEL_CALIBRATION_INTERVAL = 20; // Change up to customer int MEL_CHARGING = 0; /* DISPLAY */ char print[20], print1[20]; /* SENSOR */ float MEL_V1 = 0, MEL_V2 = 0, MEL_I1 = 0, MEL_I2 = 0; float MEL_COUNTER = 0; int SampleData = 1000; /*PARAMETER*/ cons int MEL_VOUT_TARGET = 14.4; cons int MEL_STEP = 0.5; //PWM float MEL_DUTY; char buffer[200]; //Bluetooth uint8_t rx_data[20]; char buff_transmit[50]; //RTC char time[50], date[50]; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_ADC1_Init(void); static void MX_TIM4_Init(void); static void MX_TIM14_Init(void); static void MX_USART3_UART_Init(void); static void MX_RTC_Init(void); void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance==TIM14) { float adc_v1 = ADC_value[3], adc_v2 = ADC_value[2], adc_i1 = ADC_value[1], adc_i2 = ADC_value[0]; static float avg_adcv1, avg_adcv2, avg_adci1, avg_adci2, count = 0; avg_adcv1 += adc_v1; avg_adcv2 += adc_v2; avg_adci1 += adc_i2; count++; if (count>= SampleData) { /* INPUT TO ADC GLOBAL */ MEL_V1 = avg_adcv1/count; MEL_V2 = avg_adcv2/count; MEL_I1 = avg_adci1/count; MEL_I2 = avg_adci2/count; avg_adcv1 = 0; avg_adcv2 = 0; avg_adci1 = 0; avg_adci2 = 0; count = 0; } } } void mel_read_sensor(float *in_v, float *out_v, float *in_i, float *out_i) { if (in_v != NULL) { *in_v = 0; } else { *in_v = (0.01*MEL_V1) + 0.7232; // Need updated calibration } if (out_v != NULL) { *out_v = 0; } else { *out_v = (0.0081*MEL_V2) + 0.4214; // Need updated calibration } if (in_i != NULL) { *in_i = 0; } else { *in_i = ((-0.0082*MEL_I1) + 20.456); // Need updated calibration } if (out_i != NULL) { *out_i = 0; } else { *out_i = ((0.0077*MEL_I2) - 22.974); // Need updated calibration } } float mel_set_DUTY(float duty_in_percent) { int pwm = (int)round((duty_in_percent/100)*2099); TIM4->CCR3 = pwm; HAL_Delay(50); float in_v, out_v; mel_read_sensor(&in_v, &out_v, NULL, NULL); return out_v; } float mel_get_step(int D) { float out_v_before; mel_read_sensor(NULL, &out_v_before, NULL, NULL); float out_v = mel_set_DUTY(MEL_DUTY); float local_step = out_v - out_v_before; if (local_step < 0) { local_step *= -1; } return local_step; } void mel_display(float in_v, float out_v, float in_i, float out_i) { lcd_gotoxy(0,2); sprintf(print, "Vi:%2.2f ", in_v); lcd_puts(print); lcd_gotoxy(8,2); lcd_puts("V "); lcd_gotoxy(10,1); sprintf(print, "Vo:%2.2f ", out_v); lcd_puts(print); lcd_gotoxy(18,1); lcd_puts("V "); lcd_gotoxy(10,2); } void mel_calibration() { float OUT_V = -1; lcd_gotoxy(0,1); lcd_puts(" CALIBRATING "); float step = 0; for ( int i = 0; (float)i < (float)MEL_CALIBRATION_INTERVAL; i++ ) { if ( OUT_V >= 11 ) { step += mel_get_step(MEL_DUTY--); } else { step += mel_get_step(MEL_DUTY++); } float z = ((float)i/(float)MEL_CALIBRATION_INTERVAL)*100; /* ANIMATION LOADING */ lcd_gotoxy(0,2); sprintf(print, " %.0f ",z); lcd_puts(print); lcd_gotoxy(13,2); sprintf(print, "%%"); lcd_puts(print); z=((float)i/(float)MEL_CALIBRATION_INTERVAL)*20; lcd_gotoxy(z,3); lcd_puts("*"); HAL_Delay(100); } MEL_STEP = step/MEL_CALIBRATION_INTERVAL; MEL_CALIBRATION = 0; lcd_clear(); } void mel_control_relay(float relay) { static int relay = 0; } void mel_check_battery (float in_v, float out_v, float in_i, float out_i) { static int relay_1 = 0, relay_2 = 0, relay_3 = 0; float batter_1 = 0, battery_2 = 0, battery_3 = 0; static int counter = 0; counter++; if (counter > 0) { mel_control_relay(1); battery_1 = out_v; } } else if (counter > 5) { mel_control_relay(2) { } } else if (counter > 10) { } } void mel_read_condition (float in_v, float out_v, float in_i, float out_i) { static int relay_1 = 0, relay_2 = 0, relay_3 = 0; static int counter = 0; counter++; if (in_v < 15) { if (in_v >= MEL_STD_VIN && ) } } /** * @brief The application entry point. * @retval int */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_TIM4_Init(); MX_TIM14_Init(); MX_USART3_UART_Init(); MX_RTC_Init(); /* USER CODE BEGIN 2 */ lcd_init(); HAL_TIM_Base_Start_IT(&htim14); HAL_ADC_Start_DMA(&hadc1, (uint32_t*) &ADC_value,4); HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3); HAL_UART_Receive_DMA(&huart3,(uint8_t *) rx_data,4); //TAMPILAN LCD INTEGRASI// lcd_gotoxy(0,0); lcd_puts("-- ALAT YG SYUPER --"); lcd_gotoxy(0,1); lcd_puts(" CHUWANGGIHHH "); lcd_gotoxy(0,2); lcd_puts("By Melati ELIN 2018 "); lcd_gotoxy(0,3); lcd_puts(" NIP ISI SENDIRI "); HAL_Delay(2000); lcd_clear(); while (1) { /* DECLARATION */ float in_v, out_v, in_i, out_i; /* READING ADC */ mel_read_sensor(&in_v, &out_v, &in_i, &out_i); /* CALIBRATION DUTY STEP */ if (MEL_CALIBRATION) { mel_calibration(); } /* DUTY CALCULATION */ if (out_v < MEL_VOUT_TARGET) { float a = (MEL_VOUT_TARGET) - out_v; a = a/(10*MEL_STEP); if (MEL_DUTY + a < 99) { MEL_DUTY = MEL_DUTY + a; } else { MEL_DUTY = 99; } mel_get_step(MEL_DUTY); // Calling Duty function } else if (out_v > MEL_VOUT_TARGET) { float a = (MEL_VOUT_TARGET) + out_v; a = a/(10*MEL_STEP); if (MEL_DUTY > a) { MEL_DUTY = MEL_DUTY - a; } else { MEL_DUTY = 0; } mel_get_step(MEL_DUTY); // Calling Duty function } /* SHOW LCD */ mel_display(in_v, out_v, in_i, out_i); lcd_gotoxy(0,1); sprintf(print1, "D : %3.0f ", MEL_DUTY); lcd_puts(print1); lcd_gotoxy(8,1); lcd_puts("% "); } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } } /** * @brief ADC1 Initialization Function * @param None * @retval None */ static void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 4; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = 3; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_2; sConfig.Rank = 4; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /** * @brief RTC Initialization Function * @param None * @retval None */ static void MX_RTC_Init(void) { /* USER CODE BEGIN RTC_Init 0 */ /* USER CODE END RTC_Init 0 */ RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; /* USER CODE BEGIN RTC_Init 1 */ /* USER CODE END RTC_Init 1 */ /** Initialize RTC Only */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 255; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN Check_RTC_BKUP */ /* USER CODE END Check_RTC_BKUP */ /** Initialize RTC and set the Time and Date */ sTime.Hours = 0x23; sTime.Minutes = 0x59; sTime.Seconds = 0x45; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_SUNDAY; sDate.Month = RTC_MONTH_DECEMBER; sDate.Date = 0x31; sDate.Year = 0x21; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN RTC_Init 2 */ /* USER CODE END RTC_Init 2 */ } /** * @brief TIM4 Initialization Function * @param None * @retval None */ static void MX_TIM4_Init(void) { /* USER CODE BEGIN TIM4_Init 0 */ /* USER CODE END TIM4_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM4_Init 1 */ /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 0; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 2099; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM4_Init 2 */ /* USER CODE END TIM4_Init 2 */ HAL_TIM_MspPostInit(&htim4); } /** * @brief TIM14 Initialization Function * @param None * @retval None */ static void MX_TIM14_Init(void) { /* USER CODE BEGIN TIM14_Init 0 */ /* USER CODE END TIM14_Init 0 */ TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM14_Init 1 */ /* USER CODE END TIM14_Init 1 */ htim14.Instance = TIM14; htim14.Init.Prescaler = 0; htim14.Init.CounterMode = TIM_COUNTERMODE_UP; htim14.Init.Period = 9999; htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim14) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim14) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM14_Init 2 */ /* USER CODE END TIM14_Init 2 */ } /** * @brief USART3 Initialization Function * @param None * @retval None */ static void MX_USART3_UART_Init(void) { /* USER CODE BEGIN USART3_Init 0 */ /* USER CODE END USART3_Init 0 */ /* USER CODE BEGIN USART3_Init 1 */ /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; huart3.Init.BaudRate = 9600; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART3_Init 2 */ /* USER CODE END USART3_Init 2 */ } /** * Enable DMA controller clock */ static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA2_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Stream1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); /* DMA1_Stream3_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); /* DMA2_Stream0_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 |GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET); /*Configure GPIO pin : PA3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PD12 PD13 PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 |GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /*Configure GPIO pins : PC6 PC7 PC9 */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* 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 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Editor Settings
Theme
Key bindings
Full width
Lines