Jump to content
befrikpa

Проблема с индикацией таймера

Recommended Posts

Добрый день товарищи!
У меня такая проблема:
Я хочу сделать штуку которая будет замыкать реле через определённое время(после подачи питания на него), реле времени так сказать. В принципе устройство работает, но у меня не получается сделать так, что бы светодиод (HL_4) мигал каждые пол секунды пока не включено реле, а после включения соответственно  светодиод горел постоянно.
Сейчас у меня условие находится в бесконечном цикле, и при включении устройства, светодиод просто горит постоянно и всё.
Скажу честно, я в программировании пока что зелёный, так что не судите строго за код))

Прикрепил код:

Скрытый текст

 

/* 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"
#include "adc.h"
#include "dma.h"
#include "rtc.h"
#include "tim.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 */
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef DateToUpdate = {0};    // Without date reading, time reading does not work
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
volatile uint16_t ADCRESULT[1];                // ADC result
uint16_t SettingsR = 0;                // Setting parameter R1
uint8_t Diode_Mod = Rele_Light_Diode_ON;
uint8_t counter = 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_ADC_Init();
MX_RTC_Init();
MX_TIM2_Init();
MX_TIM21_Init();
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start (&hadc, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADCRESULT, 1);            // Start DMA for ADC
HAL_TIM_Base_Start(&htim2);                                    // Start Timer2 (for ADC)
HAL_TIM_Base_Start(&htim21);
HAL_TIM_Base_Start_IT(&htim21);

HAL_GPIO_WritePin(HL_6_GPIO_Port, HL_6_Pin, GPIO_PIN_SET);

/*------------ SET TIME ------------*/
if(4095 >= ADCRESULT[0] && ADCRESULT[0] >= 4011){
SettingsR = 1;
}
if(4010 >= ADCRESULT[0] && ADCRESULT[0] >= 3861){
SettingsR = 2;
}
if(3860 >= ADCRESULT[0] && ADCRESULT[0] >= 3725){
SettingsR = 3;
}
if(3724 >= ADCRESULT[0] && ADCRESULT[0] >= 3571){
SettingsR = 4;
}
if(3570 >= ADCRESULT[0] && ADCRESULT[0] >= 3389){
SettingsR = 5;
}
if(3388 >= ADCRESULT[0] && ADCRESULT[0] >= 3247){
SettingsR = 6;
}
if(3246 >= ADCRESULT[0] && ADCRESULT[0] >= 3142){
SettingsR = 7;
}
if(3141 >= ADCRESULT[0] && ADCRESULT[0] >= 2994){
SettingsR = 8;
}
if(2993 >= ADCRESULT[0] && ADCRESULT[0] >= 2841){
SettingsR = 9;
}
if(2840 >= ADCRESULT[0] && ADCRESULT[0] >= 2724){
SettingsR = 10;
}
if(2723 >= ADCRESULT[0] && ADCRESULT[0] >= 2628){
SettingsR = 11;
}
if(2627 >= ADCRESULT[0] && ADCRESULT[0] >= 2519){
SettingsR = 12;
}
if(2518 >= ADCRESULT[0] && ADCRESULT[0] >= 2423){
SettingsR = 13;
}
if(2422 >= ADCRESULT[0] && ADCRESULT[0] >= 2355){
SettingsR = 14;
}
if(2354 >= ADCRESULT[0] && ADCRESULT[0] >= 2276){
SettingsR = 15;
}
if(2275 >= ADCRESULT[0] && ADCRESULT[0] >= 2187){
SettingsR = 16;
}
if(2186 >= ADCRESULT[0] && ADCRESULT[0] >= 2115){
SettingsR = 17;
}
if(2114 >= ADCRESULT[0] && ADCRESULT[0] >= 2055){
SettingsR = 18;
}
if(2054 >= ADCRESULT[0] && ADCRESULT[0] >= 1977){
SettingsR = 19;
}
if(1976 >= ADCRESULT[0] && ADCRESULT[0] >= 1905){
SettingsR = 20;
}
if(1904 >= ADCRESULT[0] && ADCRESULT[0] >= 1840){
SettingsR = 21;
}
if(1839 >= ADCRESULT[0] && ADCRESULT[0] >= 1780){
SettingsR = 22;
}
if(1779 >= ADCRESULT[0] && ADCRESULT[0] >= 1726){
SettingsR = 23;
}
if(1725 >= ADCRESULT[0] && ADCRESULT[0] >= 1674){
SettingsR = 24;
}
if(1673 >= ADCRESULT[0] && ADCRESULT[0] >= 1623){
SettingsR = 25;
}
if(1622 >= ADCRESULT[0] && ADCRESULT[0] >= 1577){
SettingsR = 26;
}
if(1576 >= ADCRESULT[0] && ADCRESULT[0] >= 1529){
SettingsR = 27;
}
if(1528 >= ADCRESULT[0] && ADCRESULT[0] >= 1476){
SettingsR = 28;
}
if(1475 >= ADCRESULT[0] && ADCRESULT[0] >= 1431){
SettingsR = 29;
}
if(1430 >= ADCRESULT[0] && ADCRESULT[0] >= 1388){
SettingsR = 30;
}
if(1387 >= ADCRESULT[0] && ADCRESULT[0] >= 1345){
SettingsR = 31;
}
if(1344 >= ADCRESULT[0] && ADCRESULT[0] >= 1302){
SettingsR = 32;
}
if(1301 >= ADCRESULT[0] && ADCRESULT[0] >= 1262){
SettingsR = 33;
}
if(1261 >= ADCRESULT[0] && ADCRESULT[0] >= 1217){
SettingsR = 34;
}
if(1216 >= ADCRESULT[0] && ADCRESULT[0] >= 1174){
SettingsR = 35;
}
if(1173 >= ADCRESULT[0] && ADCRESULT[0] >= 1131){
SettingsR = 36;
}
if(1130 >= ADCRESULT[0] && ADCRESULT[0] >= 1089){
SettingsR = 37;
}
if(1088 >= ADCRESULT[0] && ADCRESULT[0] >= 1055){
SettingsR = 38;
}
if(1054 >= ADCRESULT[0] && ADCRESULT[0] >= 1013){
SettingsR = 39;
}
if(1012 >= ADCRESULT[0] && ADCRESULT[0] >= 968){
SettingsR = 40;
}
if(967 >= ADCRESULT[0] && ADCRESULT[0] >= 929){
SettingsR = 41;
}
if(928 >= ADCRESULT[0] && ADCRESULT[0] >= 892){
SettingsR = 42;
}
if(891 >= ADCRESULT[0] && ADCRESULT[0] >= 852){
SettingsR = 43;
}
if(851 >= ADCRESULT[0] && ADCRESULT[0] >= 812){
SettingsR = 44;
}
if(811 >= ADCRESULT[0] && ADCRESULT[0] >= 769){
SettingsR = 45;
}
if(768 >= ADCRESULT[0] && ADCRESULT[0] >= 725){
SettingsR = 46;
}
if(724 >= ADCRESULT[0] && ADCRESULT[0] >= 679){
SettingsR = 47;
}
if(678 >= ADCRESULT[0] && ADCRESULT[0] >= 635){
SettingsR = 48;
}
if(634 >= ADCRESULT[0] && ADCRESULT[0] >= 591){
SettingsR = 49;
}
if(590 >= ADCRESULT[0] && ADCRESULT[0] >= 544){
SettingsR = 50;
}
if(543 >= ADCRESULT[0] && ADCRESULT[0] >= 494){
SettingsR = 51;
}
if(493 >= ADCRESULT[0] && ADCRESULT[0] >= 440){
SettingsR = 52;
}
if(439 >= ADCRESULT[0] && ADCRESULT[0] >= 385){
SettingsR = 53;
}
if(384 >= ADCRESULT[0] && ADCRESULT[0] >= 326){
SettingsR = 54;
}
if(325 >= ADCRESULT[0] && ADCRESULT[0] >= 265){
SettingsR = 55;
}
if(264 >= ADCRESULT[0] && ADCRESULT[0] >= 199){
SettingsR = 56;
}
if(198 >= ADCRESULT[0] && ADCRESULT[0] >= 132){
SettingsR = 57;
}
if(131 >= ADCRESULT[0] && ADCRESULT[0] >= 62){
SettingsR = 58;
}
if(61 >= ADCRESULT[0] && ADCRESULT[0] >= 13){
SettingsR = 59;
}
if(12 >= ADCRESULT[0] && ADCRESULT[0] >= 0){
SettingsR = 60;
}
/*------------ SET_TIME ------------*/

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1){
HAL_RTC_GetTime(&hrtc, &sTime,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN);

if (HAL_GPIO_ReadPin(Rele_GPIO_Port, Rele_Pin) == GPIO_PIN_RESET){
HAL_GPIO_TogglePin(HL_4_GPIO_Port, HL_4_Pin);
HAL_Delay(500);
}
if (HAL_GPIO_ReadPin(Rele_GPIO_Port, Rele_Pin) == GPIO_PIN_SET){
HAL_GPIO_WritePin(HL_4_GPIO_Port, HL_4_Pin, GPIO_PIN_SET);
}

if (sTime.Seconds >= SettingsR || sTime.Minutes > 0){
Rele_ON;

sTime.Hours = 0;
sTime.Minutes = 1;
sTime.Seconds = 0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
}

else
Rele_OFF;
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* 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};
    /** Configure the main internal regulator output voltage
 */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Configure LSE Drive Capability
 */
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
/** Initializes the CPU, AHB and APB busses clocks
 */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = 0;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB busses clocks
 */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}

/* 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****/

 


 

Share this post


Link to post
Share on other sites

это ж не лень было столько if-ов писать... А один case бы не прокатил?


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

Высокая надежность SiC! Как они этого добились?

За несколько лет кропотливых исследований и совершенствования технологии компания Infineon смогла довести показатели надежности и стабильности параметров высоковольтных и быстродействующих карбид-кремниевых транзисторов линейки CoolSiC практически до уровня их кремниевых собратьев.

Подробнее

1 час назад, IMXO сказал:

да что вы знаете о лени...

Это похоже на автоматический генератор кода. Да, уже есть такие IDE, что сами могут писать код, правда получается страшнее чем у индусов.

4 часа назад, befrikpa сказал:

Я хочу сделать штуку которая будет замыкать реле через определённое время(после подачи питания на него), реле времени так сказать.

Измеряйте время в морганиях светика, особой точности видимо там не требуется. 

Share this post


Link to post
Share on other sites

Вебинар «Практическое использование TrustZone в STM32L5»(10.12.2020)

Приглашаем на вебинар, посвященный экосистеме безопасности и возможностях, которые появились у разработчиков благодаря новой технологии TrustZone в микроконтроллерах STM32L5. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

14 часов назад, AVI-crak Home сказал:

Это похоже на автоматический генератор кода. Да, уже есть такие IDE, что сами могут писать код, правда получается страшнее чем у индусов.

Измеряйте время в морганиях светика, особой точности видимо там не требуется. 

а как это реализовать? я просто не особо пока соображаю в программировании

Share this post


Link to post
Share on other sites

Снижена цена на AC/DC и DC/DC преобразователи Mornsun в Компэл!

Компэл и компания Mornsun снизили цены на преобразователи AC/DC-преобразователи семейств LS и LDE. По привлекательной цене также предлагаются DC/DC-преобразователи изолированных семейств поколений R2 и R3 различного конструктивного исполнения.

Подробнее

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения


  • Мультиметр ANENG SZ18

  • Similar Content

    • By xrou
      Здравствуйте, пытаюсь подключить USB флешку к STM32F767ZI
       
      Включаю USB_OTG_FS - host only, (V bus и SOF  не включаю), USB HOST Class for fs ip - Mass Storage host class, FATFS (USE_LFN - в стеке) - USB_Disk
      В настройках USB_HOST требует, как я понял, пин отвечающий за питание устройства - PC1
      Код простейший, должен работать 100% а может нет. Внутренние файлы библиотек не менял
      Думаю что нет питания на USB устройство т.к. пробовал вставить туда ttl конвертер на котором есть светодиод питания и он не горит
       
      Ваши идеи и предположения? 
       
    • By xrou
      Здравствуйте, хочу подключить джойстик к stmке, но проблема в том что он пятивольтовый, а АЦП все, что больше 3.3 выдаёт как 4095. На ардуино есть контакт aref введённый на плату, но на stm, как я понял, он соединён с контактом питания и все что выше 3.3 вольта просто спалит кристал. 
      Подскажите как подключить пятивольтовое устройство к stmке. 
       
      P.s подключить джойстик к 3.3 не получится из-за появления огромных мёртвых зон.
    • By Black Jack
      Здравствуйте, программатор st-link не видит микроконтроллер STM32F103VET6. Присоединение кварца и внешнее тактирование не помогли. Что не так делаю, подскажите.


      схема.dch плата.dip
    • By strifonoff
      это снова я...
      Максимального быстродействия АЦП можно достичь при частоте АЦП 14 МГц, а этого можно добиться только при системной частоте 56 МГц (если внешний кварц на 8 МГц).
      Но возникает проблема со скоростями UART: значение регистра BRR не получится выставить так, что бы скорость была из стандартного ряда.
      Назрели несколько вопросов:
      1) возможно ли менять системную частоту на лету? (чую, что можно, но пока не знаю как) 
      2) критична ли ошибка в скорости UART по сравнению со стандартной? (что будет на другой стороне заранее не известно, т.к. любой может воткнуть свой девайс работающий на какой-то заранее согласованной стандартной скорости)
      3) как поведёт себя железо (состояние ОЗУ, регистров перефирии, состояние ног и т.д.) на изменение частоты? Две части программы () практически независимы, их объединяет только один массив, который наполняется в первой половине, а обрабатывается в другой.
       
    • By xrou
      Здравствуйте, пытаюсь обрабатывать пакеты приходящие от ESP8266 (01), но проблема в том, что пакеты всегда разной длины ведь мы не знаем, что напишет пользователь (хотя даже ответы на AT команды всегда разной длины). Знаю, что в плате F0 есть прерывание по символу, но у меня F103C8T6. Как быть? Создать массив большого размера нельзя, т.к. HAL_Recieve_IT ждет пока не наберется нужное кол-во символов.
      Приму любую идею и советы
×
×
  • Create New...