Перейти к содержанию

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


befrikpa

Рекомендуемые сообщения

Добрый день товарищи!
У меня такая проблема:
Я хочу сделать штуку которая будет замыкать реле через определённое время(после подачи питания на него), реле времени так сказать. В принципе устройство работает, но у меня не получается сделать так, что бы светодиод (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****/

 


 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Тогда нужно учиться http://dfe.petrsu.ru/koi/posob/c/c.htm . Используйте цикл с переключением светодиода, функцию задержки между переключениями светика. После включения реле - вечный цикл.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Ничего серьезного в вопросе не вижу. Соленоиды миллионами в мире работают не сутками и не неделями А ГОДАМИ. Все что работает всегда греется., и должно. А вот какая температура это другой вопрос. А эта штучка вообще  смешная. Система отталкивающей магнитной левитации.docx
    • Ну на плате с смд деталями, всё компактно, всё рядышком и  проводники конечно уже но и значительно короче. Если конечно не тянуть связь с одного конца платы на другой.
    • Почему нигде нет масштаба по оси Y ? График напряжения на базе - какая амплитуда в минус на базе ключа при пробое ? Он держит не более 8..9 вольт, больше -7 вольт не должно быть ни при каком раскладе. Транзисторы раскачки - проверьте ОБА на пробой. Проверьте базовые цепи обоих ключей на одинаковость. на первой осциллограмме не вижу никаких проблем. Колебания в паузах от индуктивности намагничивания первичной обмотки трансформатора. Это всегда будет в режиме холостого хода. Чтобы был прямоугольник, необходимо, чтобы через дроссель ток не падал до нуля - то есть, режим неразрывного тока дросселя. Для этого, необходимо увеличить его индуктивность. нагружать источник, запитанный от резистора - нельзя ! ключи должны быть из одной партии, убедитесь что ничего не пробито. Емкости высоковольтных электролитов тоже должны быть одинаковыми. Проверьте на высыхание. Схема выпрямления должна быть двухтактной - это на всякий случай
    • @READART Согласен, некорректно выразился. Батарейно-зависимое хранилище вот совсем без внешнего резерва не припомню, как правило какой-то модуль хранения есть хотя бы как докупаемая опция. Опция дублирования программы на карту памяти есть у большинства ПЛК со слотом для карты, DELTA и Allen-bradley точно умеют. Да, и все же есть разница ионистор или АКБ/батарейка. С последними и пара лет хранения не проблема. З.Ы. А нет вспомнил. ОВЕН, будь он не ладен. И еще вроде кто-то ругался на PLC Saia-Burgess.
    • Стоваттный резистор в колоночку - и можно обходиться без отопления.
    • Не совсем так. Батарейка в ПЛК - весьма распространенное явление, причем нередко в ПЛК отсутствует карта памяти или иное хранилище рабочей программы, в результате чего после исчерпания батарейкой своего ресурса станок уходит в небытие. В этом плане приятен omron - в части его ПЛК рабочая программа хранится и в SRAM, и на карте, а пользователь с помощью микрика может выбирать откуда ему загружаться. 
    • сила притяжения, развиваемая соленоидом прямо зависит от тока. Если постоянно не нужна максимальная сила притяжения, то можно при помощи ШИМ уменьшить ток соленоида. Но это не точно ))
  • Похожий контент

×
×
  • Создать...