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

Руководство для разработчика приложений на базе STM32WB55

Представив двухъядерные беспроводные микроконтроллеры STM32WB для IoT-приложений, компания STMicroelectronics предлагает разработчикам экосистему, включающую в себя отладочные платы, примеры кода для микроконтроллера, готовое ПО всех уровней и большой массив документации.

Читать статью

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
14 часов назад, AVI-crak Home сказал:

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

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

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

Share this post


Link to post
Share on other sites
                     

DC/DC-преобразователи: принципы работы и уникальные решения Maxim Integrated

Что нового можно сказать про DC/DC? Написаны десятки статей, а самостоятельное изготовление преобразователя мощностью от единиц Вт до нескольких кВт даже в домашних условиях не составляет большого труда. Тем не менее, когда речь идет о микро-, или даже нано-ваттах, проектировщик может столкнуться с рядом трудностей. Разработка устройства с батарейным питанием весьма малой мощности – одна из наиболее актуальных и интересных задач во время всепроникающего интернета вещей. А грамотная схемотехника системы питания не возможна без знания основ работы DC/DC преобразователей. Освежить базовые знания и узнать об особенностях проектирования узлов питания мобильного устройства с оптимальным энергопотреблением можно из следующей статьи

Подробнее

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

  • Similar Content

    • By One _ moment
      Здравствуйте. Нужно разобраться с принципом работы интерфейса I2C на Stm32. понимаю, что материала в интернете много, но почему-то даже просто структура, где определяются параметры, у меня другая.
      Моя вот такая:
      typedef struct
      {
        uint32_t I2C_Timing;  
        uint32_t I2C_AnalogFilter;      
        uint32_t I2C_DigitalFilter; 
        uint32_t I2C_Mode;  
        uint32_t I2C_OwnAddress1;
        uint32_t I2C_Ack;
        uint32_t I2C_AcknowledgedAddress;
      }I2C_InitTypeDef;
      Те, что даются в примерах, в статьях, такая:
      typedef struct
      {
        uint32_t I2C_ClockSpeed;          
       
        uint16_t I2C_Mode;                
       
        uint16_t I2C_DutyCycle;           
       
        uint16_t I2C_OwnAddress1;         
       
        uint16_t I2C_Ack;                 
       
        uint16_t I2C_AcknowledgedAddress; 
      }I2C_InitTypeDef;
       
      Найдя пример на этом форуме (https://forum.cxem.net/index.php?/topic/202586-i2c-%D0%B2-stm32f030/) увидел, что используются параметры такие же, что и у меня, но теперь не понятно, откуда такие значения берут и по какой логике. 
      Прошу не пинать ногами и кидать в меня гнилые помидоры, а помочь разобраться в этом всём или подсказать, где можно найти исчерпывающую информацию, где хорошо и по полочкам всё разложено.
      Программирую в keil uVision v5
      Отладочная плата stm32f0 disco
      МК stm32f0030r8
      Благодарю заранее.
    • Guest User1324
      By Guest User1324
      Здравствуйте, помогите подключить USB-флешку к STM32F103RCT6, нужна дополнить принципиальную схему. Если есть возможность нарисовать.
    • By Tokes
      Здравствуйте.
      CUBEMX + CUBEIDE + PUTTY + STLINK V2
      Есть blue pill. Создал новый проект в CUBEMX. Включил там USB как COM порт. Завёл приём сообщений (модифицировал static CDC_Receive_FS функцию). Всё хорошо работает ровно до тех пор, пока в CUBEIDE не нажимаю F11 (build + flash + debug). После этого необходимо руками вытаскивать и засовывать кабель, чтобы можно было продолжать пользоваться терминалом. В то же время достаточно коснуться контакта "USB-" - и происходит тот самый желанный реконнект, после которого достаточно нажать restart session в терминале и всё продолжает работать нормально. 
      Вопрос - как сделать программно, чтобы при старте устройство ("com port" или "usb com emulator") само себя "переподключало"?
    • By Стальной
      Здравствуйте!
      Интересует мнение коллег по правильному питанию мощных МК. Имеется STM32F722VCT6. Делаю для себя новый отладочный стенд. На нем будут обкатываться различные задачи, поставлю плюсом к МК всякую периферию, обязательно i2c память (из серии AT24Cxx), MAX3485, возможно какой-то дисплей, SD-карту, может быть SIM900 и NAND. Первичный источник - думаю, USB хватит.
      Вопрос - как организовать питание МК? Имеет ли смысл цифровую часть (а мб и часть периферийного зоопарка) питать импульсной системой, а аналоговую часть кренкой? Или всё кренкой запитать? Какие идеи?
      Спасибо)
      ЗЫ Сейчас использую стенд на STM32F407VET6, сделанный на коленках, все кренкой питается. Но там периферия изготавливается по мере необходимости и надевается отдельно на гребенки.
    • By Alextiger62
      Отладочный набор на базе микроконтроллера STM32F746IGT6. Модульная конструкция и открытый дизайн делают плату идеальным решением для начала быстрой разработки устройств. В комплект поставки входят все необходимые модули расширения, для оценки всех возможностей микроконтроллера. 

      Комплектация: 
      1 х Материнская плата (Open746I-C development board); 
      1 х Процессорный модуль (Core746I); 
      1 х Кабель (USB type A plug to micro B plug cable);   - отсутствует
      1 х Кабель (USB type A receptacle to micro B plug cable);   - отсутствует
      1 х Соединительные провода (4-pin 2-pin wires pack);   - отсутствует 
      1 х Блок питания (Power adapter US standard 5V/1A);   - отсутствует
      1 х Дисплей (7inch Capacitive Touch LCD (F)); 
      1 х Плата (DP83848 Ethernet Board); 
      1 х Плата (USB3300 USB HS Board); 
      1 х Плата (UDA1380 Board); 
      1 х Плата (Micro SD Storage Board); 
      1 х Плата (OV2640 Camera Board); 
      1 х Плата (W25QXX DataFlash Board); 
      1 х Плата (10 DOF IMU Sensor (B)); 
      2 х Плата (SN65HVD230 CAN Board); 
      1 х Плата (Analog Test Board); 
      1 х Кабель (USB type A plug to mini-B plug cable);  - отсутствует
      1 х Кабель (USB type A receptacle to mini-B plug cable);   - отсутствует
      1 х Кабель (Ethernet Cable); 
      1 х Шлейф (40-pin FFC);  - отсутствует
      1 х Крепеж (7inch LCD screws pack).
  • Сообщения

    • https://www.chipdip.ru/product/2sk1530?from=suggest_product Вроде только 1530 продают. Я как-то брал их в ЧИПе, среди полевых попадались и биполярные под этим "соусом". Да и емкость была великовата. Напряжение открывания в норме - менее 2 В. Сдал назад.
    • Ой как все запутано))  Кстати сегодня пришли еще две фары с светодиодами и корпусами и на задней стенке корпуса узрел табличку https://yadi.sk/i/4kiFDhbmaDuX_Q 45V 30,4W немножко прояснения но еще больше вопросов  как можно 30,4 Вт поделить на 3? И какой ток будет на каждом диоде? 0.666666... А? Может все таки лучше их так же питать? С преобразователем и ограничителем тока?
    • Всем привет  Собрал усилитель на tda7296 , секунд 30 играет супер , на 100% громкости, потом постепенно затихает , через минуту вообще перестает играть и начинает просто фонить , если включить на 20% громкости ,играет но с жеским фоном , выключаю из разетки мин на 10 , включаю ,таже история. (( В чем проблема? Питание с транса через диодный мост с кондерами по 4700µf35v +-28в Печатка брал от 7294 Если надо могу скинуть свои фотки или видос )    
    • если есть НЕОБХОДИМОСТЬ, то можно, в противном случае нет смысла в советское время заряжал и себе и куче знакомых батарейки для наручных электронных часов(дорогие они были и не всегда купить можно было) так после подзарядки на месяц где то хватало, новая больше года работала
    • Без необходимости изменения электронной схемы. То есть,  я могу выбрать любой ОУ, с 8-мью выводами?
×
×
  • Create New...