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

Материалы вебинара: МЭМС-датчики ST для работы со звуком – новые возможности

На вебинаре мы рассказали о микрофонах, их топологиях применения и возможностях, а так же о новых мультирежимных широкодиапазонных микрофонах с нижним портом и PDM-интерфейсом для систем с батарейным питанием. Вы можете посмотреть видеозапись вебинара, ознакомиться с презентацией и ответами на вопросы.

Подробнее

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

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

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

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

Share this post


Link to post
Share on other sites

Использование экосистемы STMicroelectronics: подключение датчиков к STM32G4

В статье описаны основные составляющие экосистемы STMicroelectronics для работы с микроконтроллерами STM32, а также приведен пример ее практического применения: создание проекта на базе STM32G4 с подключением датчиков и использованием отладочной платы NUCLEO-G474RE и платы расширения X-NUCLEO-IKS01A2.

Подробнее

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...

  • Сообщения

    • Новую плату можно сделать за один день, а на  новую программу вместе с моделированием, тестированием, составлением схемы и описания - примерно неделю. А Вы не думали над тем, чтобы самостоятельно освоить программирование? А вдруг Вам это понравится?
    • Думаете, поможет? Чтобы таким пробником пользоваться, нужно иметь немалый опыт в ремонте и не одну сотню  конденсаторов перемерить.
    • Достался ноутбук Asus A9T, так сказать для опытов. Включается либо от сети, либо от аккумулятора. Одновременно нельзя, дымится. После разборки выяснилось Q26 пробит и на КЗ, он и дымится. Закупил на али горсть, заменил и опять дым. Если Q26 выпаять загорается индикатор зарядки, но не заряжается. Далее по схеме по замерам Q31 в коротком, поэтому и сгорает Q26. Выпаял Q31 он исправен но КЗ сток-исток осталось. Померял на контроллере зарядки, несколько выводов на кз, выпаял, кз на месте Q31 осталось. Вот и думаю подать на сток-исток вместо выпаянного Q31 1v 1а и посмотреть что греестся, только какой полярностью? Да кстати короткое  без аккумулятора осталось.
    • Неужели так трудно проверить на КЗ,став щупами между общим и TP1,потом отпаять хотя бы один вывод LD1,замерить на выходе UD1 напряжение ,если есть напряжение, еще раз замерить на той же ТР1 на КЗ.Ели есть КЗ,отпаять FB2,и еще раз проверить на КЗ на выходе? Да ну...С таким то сопротивлением?

  • Автомобильные переключатели

  • 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...