Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
0 / 0 / 0
Регистрация: 08.09.2025
Сообщений: 1

STM реализация мигания светодиодом с разной скоростью через таймер

08.09.2025, 15:51. Показов 3454. Ответов 61

Студворк — интернет-сервис помощи студентам
Здравсвтвуйте, пытаюсь реализовать мигание светодиодом с разной скоростью через таймер на микроконтроллере STM32F401CDU6, но он мигает только с одной скоростью не меняя её. Написал такой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.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 ---------------------------------------------------------*/
TIM_HandleTypeDef htim2;
 
/* USER CODE BEGIN PV */
uint8_t blink_speed = 0;          // Индекс текущего периода
uint32_t blink_counter = 0;       // Счетчик тиков таймера
uint32_t blink_periods[] = {100, 500, 1000}; // Периоды мигания в мс
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
/* USER CODE BEGIN PFP */
 
/* 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_TIM2_Init();
  /* USER CODE BEGIN 2 */
  // Включаем светодиод
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
  // Запускаем таймер
  HAL_TIM_Base_Start_IT(&htim2);
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* 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};
 
  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
 
  /** 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.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 84;
  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_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}
 
/**
  * @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};
 
  /* USER CODE BEGIN TIM2_Init 1 */
 
  /* USER CODE END TIM2_Init 1 */
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 8399;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 9999;
  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();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM2_Init 2 */
 
  /* USER CODE END TIM2_Init 2 */
 
}
 
/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  /* USER CODE BEGIN MX_GPIO_Init_1 */
 
  /* USER CODE END MX_GPIO_Init_1 */
 
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 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);
 
  /* USER CODE BEGIN MX_GPIO_Init_2 */
 
  /* USER CODE END MX_GPIO_Init_2 */
}
 
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM2)
  {
    blink_counter++; // Увеличиваем счетчик тиков
    uint32_t ticks = blink_periods[blink_speed]; // Текущий период в мс
 
    if (blink_counter >= ticks) // Если достигнут период
    {
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // Переключаем светодиод
      blink_counter = 0; // Сбрасываем счетчик
      blink_speed = (blink_speed + 1) % 3; // Переключаем на следующий период
    }
  }
}
/* 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 */
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2025, 15:51
Ответы с готовыми решениями:

Мигание светодиодов с разной скоростью и направлением
Возникли проблемы с реализацией цикличного мигания светодиодов с переключением скорости и...

STM 32L1Discovery. Реализовать переключение светодиодов с некоторой частотой
Есть задание: Реализовать переключение светодиодов с некоторой частотой. По нажатию кнопки «USER»...

ATmega128. Мигание светодиодом через таймер0
Добрый вечер, столкнулся с тупиком. Суть задания- на лабораторном стенде атмега128 организовать...

61
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
08.09.2025, 17:38
Цитата Сообщение от luvver Посмотреть сообщение
STM реализация мигания светодиодом с разной скоростью через таймер
Хотите изобрести колесо RTOS?
Цитата Сообщение от luvver Посмотреть сообщение
Написал такой код
Напал его куб, а не вы!
Где среди этих строк код мигания светодиодами?
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
08.09.2025, 19:37
Цитата Сообщение от luvver Посмотреть сообщение
но он мигает только с одной скоростью не меняя её. Написал такой код:
А где в вашем коде "мигание с разной скоростью"?
Это что-ль?:
Цитата Сообщение от luvver Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
blink_counter++; // Увеличиваем счетчик тиков
    uint32_t ticks = blink_periods[blink_speed]; // Текущий период в мс
if (blink_counter >= ticks) // Если достигнут период
    {
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // Переключаем светодиод
      blink_counter = 0; // Сбрасываем счетчик
      blink_speed = (blink_speed + 1) % 3; // Переключаем на следующий период
    }
Так нету здесь никакой "разной скорости мигания". Вы тут по кругу меняете длительность состояний горит/погашено. 3 возможных длительности. Да, частота мигания тоже будет немного болтаться, но вряд-ли это будет ощутимо на глаз.

Добавлено через 1 минуту
Цитата Сообщение от locm Посмотреть сообщение
Напал его куб, а не вы!
Точно!
Цитата Сообщение от locm Посмотреть сообщение
Где среди этих строк код мигания светодиодами?
В этой каше из "говна и палок" - где-то ближе к концу есть чуток. Но "мигания с разной частотой" там нет.
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
09.09.2025, 00:43
Цитата Сообщение от jcxz Посмотреть сообщение
где-то ближе к концу есть чуток.
Да, теперь заметил, а до этого не видел в каше из куба.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,669
10.09.2025, 20:05
jcxz, неплохо написано.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM2)
  {
    blink_counter++; // Увеличиваем счетчик тиков
    uint32_t ticks = blink_periods[blink_speed]; // Текущий период в мс
 
    if (blink_counter >= ticks) // Если достигнут период
    {
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // Переключаем светодиод
      blink_counter = 0; // Сбрасываем счетчик
      blink_speed = (blink_speed + 1) % 3; // Переключаем на следующий период
    }
  }
}
Только для успеха нужно поставить задачу, развернуть её во всех деталях и на этой основе написать программу.
Только не понятно зачем остаток вычислять? % 3
C
1
blink_speed = (blink_speed + 1) % 3;
Да и функция
C
1
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
просто полное Г наверное индус писал на основе спагетти кода, уж для доступа к отдельным битам в регистрах используйте битовые операции, очень пригодиться потом.
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
10.09.2025, 21:23
ТС хочет с помощью таймера мигать светодиодом. Зачем здесь вообще прерывания? Элементарно ШИМ гнать, нехай себе мигает. И в процессе можно, меняя ARR и CC1 (или какой канал будет использоваться), управлять частотой и заполнением.

Только код руками писать. И без использования убогих недобиблиотек. Если эту дрянь написали какие-то индусы или китайцы для ST, то это совершенно не значит, что можно этим пользоваться! Хотели бы написать вменяемую HAL-библиотеку, сделали бы это на true inline функциях и макросах. Но все равно код был бы непереносим между разными семействами. А чтобы совсем уж унифицировать, есть лишь один путь - писать на С++'ных шаблонах. И всегда помнить, что аллокаторы использовать запрещено - иначе можно в "ардуину головного мозга" скатиться.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,493
Записей в блоге: 3
10.09.2025, 21:31
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Элементарно ШИМ гнать
Эдди, ШИМ по определению - это вариативное заполнение (скважность) импульсов при неизменной частоте. Можно конечно и частоту менять в процессе, но это становится лишней забавой. Поэтому ШИМ к данной задаче не подходит.
Прерывание таймера и вариативный ARR - самый вариант.
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
10.09.2025, 22:26
Цитата Сообщение от wizard41 Посмотреть сообщение
Можно конечно и частоту менять в процессе, но это становится лишней забавой.
Ничего сложного. Я "морзянку" именно через ШИМ реализовывал. Если предложение не особо длинное, МК вообще не напрягается: DMA загоняет очередные ARR/CC1…
// А в этом варианте попроще: текст посимвольно загоняется, DMA "пищит" одну букву, а как заканчивает, заполняется буфер для следующей.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,493
Записей в блоге: 3
10.09.2025, 23:12
Eddy_Em, а смысл в ШИМе тогда какой? Если это вот все сделает обычный таймер и без DMA...
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
10.09.2025, 23:18
Цитата Сообщение от wizard41 Посмотреть сообщение
а смысл в ШИМе тогда какой?
Смысл - задействовать DMA. И не напрягать МК на посторонние задачи.
Жаль, у STM32 очень мало каналов. Ну, хоть в G-серии появился DMAMUX, позволяющий скудные каналы более рационально использовать. Но все равно мало. И таймеры аппаратно не все можно связывать, что тоже плохо.

А насчет "тупо помигать светодиодом" с разной скоростью, достаточно SysTick, который обычно является таймером "времени жизни". У меня, например, он отсчитывает миллисекунды. К сожалению, связать с ним другой таймер аппаратно нельзя, поэтому приходится заниматься дурью: каждую миллисекунду в прерывании от SysTick инкрементировать переменную Tms - "время в миллисекундах". Зато в суперлупе можно элементарно завести еще пару-тройку счетчиков и ориентироваться на них. Скажем, зажег светодиод, а через 300мс надо погасить. Просто в каждом проходе суперлупа сравниваешь текущее значение Tms с временем перехода в новое состояние. Многие конечные автоматы у меня именно на Tms и ориентируются (скажем, нужна задержка 15мс - ОК, КА находится в состоянии WAIT_xxx, а как только время ожидания истекает, переходит в следующее состояние).
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,493
Записей в блоге: 3
10.09.2025, 23:29
Eddy_Em, ну я применительно к задаче автора..
Мигать с разной скоростью - подразумевает изменение частоты, а стало быть, ШИМ тут неуместен.
Если не городить банальный огород с переменной задержки в суперлупе, то любой таймер со своим прерыванием и пара строчек кода в while(1) решают проблему полностью.
Вряд ли ТС на этой задаче хочет/сможет изучить механизм DMA и/или генерацию ШИМа, да и вообще понять - зачем они.
1
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
11.09.2025, 12:44
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Смысл - задействовать DMA. И не напрягать МК на посторонние задачи.
Жаль, у STM32 очень мало каналов. Ну, хоть в G-серии появился DMAMUX, позволяющий скудные каналы более рационально использовать. Но все равно мало. И таймеры аппаратно не все можно связывать, что тоже плохо.
Смысл задействовать что-то лишь бы "задействовать" - это самый бессмысленный из смыслов.

В STM32F401 DMA-каналов не так уж много, чтобы их бездумно тратить на всякую ерунду, где они совсем не нужны. Да и таймеров тоже - не бесконечное число. Такую примитивную и медленную вещь как "моргание лампочками" лучше делать на любом периодическом прерывании. Уже существующем прерывании (не создавая новых).

А "напрягать МК на посторонние задачи" - вообще смешно! Учитывая, что это самое "напрягание" - вряд-ли даже одну тысячную процента ресурса 84 МГц CPU займёт.

Добавлено через 3 минуты
Цитата Сообщение от wizard41 Посмотреть сообщение
пара строчек кода в while(1) решают проблему полностью.
Вряд ли ТС на этой задаче хочет/сможет изучить механизм DMA и/или генерацию ШИМа, да и вообще понять - зачем они
Точно! И огород со всеми этими DMA, таймерами, ШИМ-ами - потребует раз в 20 больше кода, чем простейший программный вариант. А учитывая, что ТС даже простейший вариант - не осилил, то чего можно ожидать от огорода на ШИМ-ах/DMA?

Добавлено через 3 минуты
Цитата Сообщение от VladimirU Посмотреть сообщение
Только не понятно зачем остаток вычислять? % 3
У него там три варианта задержек - массив на 3 элемента. Для этого.
Хотя конечно - использовать тут операцию деления - моветон. Учитывая сколько времени она выполняется на ARM. Да ещё в ISR. Лучше заменить на умножение или на обычный условный оператор. Который займёт пару тактов. Но для новичка - простительно. Учитывая, насколько плохо всё остальное написано...

PS: Впрочем - иногда некоторые компиляторы сами умеют заменять операции деления на константу, на соответствующую команду умножения.
0
1182 / 458 / 68
Регистрация: 22.09.2023
Сообщений: 1,388
11.09.2025, 13:55
Цитата Сообщение от wizard41 Посмотреть сообщение
Мигать с разной скоростью - подразумевает изменение частоты, а стало быть, ШИМ тут неуместен.
Почему? В ARR период, в CCRx половину от ARR. Все, оно мигает само. Надо поменять частоту - переписали эти два регистра и оно продолжает само мигать с нужной частотой. Накладных расходов нет вообще. И где тут неуместность? Да, один таймер на один светодиод. Но если он все равно в проекте остался лишний - почему бы и да?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,493
Записей в блоге: 3
11.09.2025, 14:30
Dushevny, речь шла про ШИМ. Он не уместен для такой задачи.
Менять ARR и все, этого хватит. Будут меняться периоды переполнения таймера, а стало быть и частота.
Менять при этом CCRx для изменения периода ШИМа - тупо лишняя операция. И только из-за того, что это ШИМ.
0
1182 / 458 / 68
Регистрация: 22.09.2023
Сообщений: 1,388
11.09.2025, 14:45
Цитата Сообщение от wizard41 Посмотреть сообщение
речь шла про ШИМ. Он не уместен для такой задачи.
Менять ARR и все, этого хватит.
Посмею предположить, что вы не поняли идеи использования ШИМа и поэтому пишете "не подходит". Менять ARR не хватит, если мы хотим чтобы он мигал, а не вспыхивал. И ШИМ вполне уместен потому что решает всю задачу полностью аппаратно.

Цитата Сообщение от wizard41 Посмотреть сообщение
Менять при этом CCRx для изменения периода ШИМа - тупо лишняя операция.
Какая связь CRRx с периодом ШИМа?
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,493
Записей в блоге: 3
11.09.2025, 14:59
Dushevny, вместо того, чтобы просто вбить гвоздь молотком - мы берем и закручиваем его пассатижами?
1. Автор вопроса (скорее всего) вообще не знает что такое ШИМ и его физический смысл.
2. Автор же вопроса хочет просто мигать светиком и менять частоту этого мигания. Для этого достаточно одного таймера.
3. Если изменять период ШИМа, что это будет уже практически ЧИМ (ЧМ/FM), т.е. частотная модуляция. А она уже для совсем других вещей предназначена.
4. Автор не говорил что ему надо менять соотношение вкл/выкл при неизменной частоте (Duty). А ШИМ как раз предполагает переменную скважность при постоянной длительности периода.
5. Из п.3-4 следует вопрос: нафига козе баян? Если эта задача решается элементарно.
6. Автор явно начинающий и ему бы нужно начинать понимать с простых основ. Предложить ему ШИМы, DMA и еще что - просто выпендреж.
0
1182 / 458 / 68
Регистрация: 22.09.2023
Сообщений: 1,388
11.09.2025, 15:08
Цитата Сообщение от wizard41 Посмотреть сообщение
1. Автор вопроса (скорее всего) вообще не знает что такое ШИМ и его физический смысл.
"Отучаемся говорить за других".
Цитата Сообщение от wizard41 Посмотреть сообщение
2. Автор же вопроса хочет просто мигать светиком и менять частоту этого мигания. Для этого достаточно одного таймера.
Никто с этим не спорил.
Цитата Сообщение от wizard41 Посмотреть сообщение
Если изменять период ШИМа, что это будет уже практически ЧИМ (ЧМ/FM), т.е. частотная модуляция. А она уже для совсем других вещей предназначена.
Это не мешает выдавать на светодиод ШИМ со скважностью 2 (или, что то же самое, с коэффициентом заполнения 50%).
Цитата Сообщение от wizard41 Посмотреть сообщение
Автор не говорил что ему надо менять соотношение вкл/выкл при неизменной частоте (Duty). А ШИМ как раз предполагает переменную скважность при постоянной длительности периода.
А кто вам говорил, что коэффициент заполнения/скважность обязательно нужно менять? Для мигания с разной частотой достаточно менять период и корректировать регистр сравнения, чтобы скважность оставалась равной 2.
Цитата Сообщение от wizard41 Посмотреть сообщение
5. Из п.3-4 следует вопрос: нафига козе баян? Если эта задача решается элементарно.
На ШИМе задача решается однократной записью в 4-5 регистров. Жду (и, полагаю, не я один) более элементарного решения.
Цитата Сообщение от wizard41 Посмотреть сообщение
6. Автор явно начинающий и ему бы нужно начинать понимать с простых основ. Предложить ему ШИМы, DMA и еще что - просто выпендреж.
Автору надо подсказывать красивые, компактные, оптимальные решения, а не тупо в очередной раз городить ардуиноподобные задержки на циклах и ручное махание ногами - этого ему чятжопатэ навалит полную панамку.

Цитата Сообщение от Dushevny Посмотреть сообщение
Какая связь CRRx с периодом ШИМа?
А на этот вопрос вы решили тактично промолчать?
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,493
Записей в блоге: 3
11.09.2025, 15:14
Dushevny, ну если ваша задача показать как это работает на ШИМе, и чтоб он ничего не понял - то пожалуйста.
По итогу он не поймет как это работает, а так же не научится работать с таймерами руками..
Я не возражаю.
0
1182 / 458 / 68
Регистрация: 22.09.2023
Сообщений: 1,388
11.09.2025, 15:17
wizard41, у меня тут задач нет. Это вы с пеной у рта доказывали, что так эту задачу решать нельзя. При этом никакого другого решения не показали.

А я продолжаю ждать более элементарного решения. Просто любопытно.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3376 / 2678 / 573
Регистрация: 04.09.2018
Сообщений: 8,493
Записей в блоге: 3
11.09.2025, 15:19
Цитата Сообщение от Dushevny Посмотреть сообщение
Жду (и, полагаю, не я один) более элементарного решения.
Все что ему было нужно, что-то типа такого:
C
1
2
3
4
5
6
TIM1->ARR = 10000;
for (volitile uint8_t i = 0; i < 10; i++)
{
    TIM1->ARR -= 500;
    Delay(xxx);
}
Все!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2025, 15:19
Помогаю со студенческими работами здесь

Мигание светодиодом на PIC. Организация задержки
объясните пожалуйста как сформировать чередующуюся еденицу и нолик длительностью 1(2) секунды, при...

ATMega8. Управление миганием светодиода
Здравствуйте, извините за глупый вопрос решил собрать простую схему на proteus так проблема...

Мигание светодиода по переполнению счетчика
Проблема в том, что при проверке в AVRStudio, програмка не выходит из внутреннего цикла, где может...

Не видно мигания светодиода (AT89C51-24PI)
Добрый вечер всем. Возникла трабла, купил значит себе МК AT89C51-24PI, написал прошивку(на...

Мигание светодиодом на ATMega8515 (Proteus)
Доброго времени дня. Подскажите, как реализовать мигание светодиодом определенное количество раз?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru