Changeset 23 for trunk/firmware_v2/Core
- Timestamp:
- Aug 21, 2025, 3:14:57 PM (6 days ago)
- Location:
- trunk/firmware_v2/Core
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/firmware_v2/Core/Inc/main.h
r17 r23 47 47 #define BLINK_CODE_ERROR_FAULT_INPUT 3 48 48 #define BLINK_CODE_ERROR_VOLTAGE_DROP 4 49 49 #define BLINK_CODE_ERROR_TEMP 5 50 50 51 51 … … 56 56 #define LED_RT_ON_TIME_WARN_OVP_AND_LVP_INPUT 200 57 57 #define LED_RT_ON_TIME_WARN_VOLTAGE_DROP 200 58 #define LED_RT_ON_TIME_WARN_TEMP 200 58 59 59 60 #define LED_GN_OFF_TIME 1000 -
trunk/firmware_v2/Core/Inc/stm32c0xx_it.h
r20 r23 53 53 void SysTick_Handler(void); 54 54 void DMA1_Channel1_IRQHandler(void); 55 void DMA1_Channel2_3_IRQHandler(void); 56 void TIM3_IRQHandler(void); 55 void TIM16_IRQHandler(void); 57 56 /* USER CODE BEGIN EFP */ 58 57 -
trunk/firmware_v2/Core/Inc/tim.h
r20 r23 33 33 /* USER CODE END Includes */ 34 34 35 extern TIM_HandleTypeDef htim 3;35 extern TIM_HandleTypeDef htim16; 36 36 37 37 extern TIM_HandleTypeDef htim17; … … 39 39 /* USER CODE BEGIN Private defines */ 40 40 41 #define STATE_NUM (3U) 42 41 43 /* USER CODE END Private defines */ 42 44 43 void MX_TIM 3_Init(void);45 void MX_TIM16_Init(void); 44 46 void MX_TIM17_Init(void); 45 47 … … 48 50 /* USER CODE BEGIN Prototypes */ 49 51 50 void SetFANSpeed(unsigned speed); 52 void SetFANSpeed(unsigned speed); // Von 0 bis 100 53 unsigned GetLastSpeed(void); 51 54 52 55 /* USER CODE END Prototypes */ -
trunk/firmware_v2/Core/Src/dma.c
r19 r23 47 47 HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); 48 48 HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); 49 /* DMA1_Channel2_3_IRQn interrupt configuration */50 HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);51 HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);52 49 53 50 } -
trunk/firmware_v2/Core/Src/main.c
r20 r23 95 95 MX_TIM17_Init(); 96 96 MX_USART1_UART_Init(); 97 MX_TIM 3_Init();97 MX_TIM16_Init(); 98 98 /* USER CODE BEGIN 2 */ 99 99 -
trunk/firmware_v2/Core/Src/stm32c0xx_it.c
r22 r23 26 26 #include <stdio.h> 27 27 28 #include "tim.h" 29 28 30 /* USER CODE END Includes */ 29 31 … … 60 62 /* External variables --------------------------------------------------------*/ 61 63 extern DMA_HandleTypeDef hdma_adc1; 62 extern DMA_HandleTypeDef hdma_tim3_ch1; 63 extern TIM_HandleTypeDef htim3; 64 extern TIM_HandleTypeDef htim16; 64 65 /* USER CODE BEGIN EV */ 65 66 … … 161 162 162 163 /** 163 * @brief This function handles DMA1 channel 2 and channel 3 interrupts. 164 */ 165 void DMA1_Channel2_3_IRQHandler(void) 166 { 167 /* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */ 168 169 /* USER CODE END DMA1_Channel2_3_IRQn 0 */ 170 HAL_DMA_IRQHandler(&hdma_tim3_ch1); 171 /* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */ 172 173 /* USER CODE END DMA1_Channel2_3_IRQn 1 */ 174 } 175 176 /** 177 * @brief This function handles TIM3 global interrupt. 178 */ 179 void TIM3_IRQHandler(void) 180 { 181 /* USER CODE BEGIN TIM3_IRQn 0 */ 182 183 /* USER CODE END TIM3_IRQn 0 */ 184 HAL_TIM_IRQHandler(&htim3); 185 /* USER CODE BEGIN TIM3_IRQn 1 */ 186 187 /* USER CODE END TIM3_IRQn 1 */ 164 * @brief This function handles TIM16 global interrupt. 165 */ 166 void TIM16_IRQHandler(void) 167 { 168 /* USER CODE BEGIN TIM16_IRQn 0 */ 169 170 /* USER CODE END TIM16_IRQn 0 */ 171 HAL_TIM_IRQHandler(&htim16); 172 /* USER CODE BEGIN TIM16_IRQn 1 */ 173 174 /* USER CODE END TIM16_IRQn 1 */ 188 175 } 189 176 190 177 /* USER CODE BEGIN 1 */ 191 178 192 193 194 //uint32_t capturedValue;195 //uint32_t previousCaptureValue;196 //uint32_t frequency;197 //uint32_t overflowCnt;198 //uint32_t T[STATE_NUM];199 200 //static uint32_t avg;201 //static uint32_t psc;202 //static uint32_t freq;203 //static uint32_t rpm;204 205 206 179 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef* htim) 207 180 { 208 extern uint32_t ic_overflows; 209 210 if (htim->Instance == TIM3) 181 extern uint32_t ic_overflows, freq; 182 extern uint32_t period[STATE_NUM]; 183 184 if (htim->Instance == TIM16) 211 185 { 212 printf("Full\n"); 186 static unsigned state; 187 188 period[state] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + 65536 * ic_overflows; 189 //__HAL_TIM_SetCounter(htim, 0U); 213 190 ic_overflows = 0U; 214 /*static unsigned stateCnt; 215 216 capturedValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); 217 T[stateCnt++] = capturedValue + 65536U * overflowCnt; 218 overflowCnt = 0U; 219 220 if (stateCnt >= STATE_NUM - 1) 191 state++; 192 if (state >= STATE_NUM) 221 193 { 222 static uint32_t i; 223 224 ibuf[i++] = T[0] + T[1] + T[2] + T[3]; 225 226 if (i >= AVG_NUM) 227 { 228 uint32_t sum = 0U; 229 for (unsigned j = 0U; j < AVG_NUM; j++) sum += ibuf[j]; 230 avg = sum / AVG_NUM; 231 psc = htim->Instance->PSC + 1; 232 freq = HAL_RCC_GetPCLK1Freq() / (psc * avg); 233 rpm = freq * 60U; 234 printf("%u\n", rpm); 235 } 236 237 stateCnt = 0U; 238 }*/ 239 } 240 } 241 242 //----------------------------------------------------------------------------- 243 244 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) 245 { 246 extern uint32_t ic_overflows; 247 248 if (htim->Instance == TIM3) 249 { 250 if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1OF)) 251 { 252 ic_overflows++; 253 //printf("Ovf\n"); 254 //ic_overflows %= 194 state = 0; 195 HAL_TIM_Base_Stop_IT(htim); 196 HAL_TIM_IC_Stop_IT(htim, TIM_CHANNEL_1); 197 uint32_t timerClock_Hz = HAL_RCC_GetPCLK1Freq(); 198 uint32_t icClock_Hz = timerClock_Hz / (htim->Instance->PSC + 1); 199 freq = (icClock_Hz * 30U) / (period[2] - period[1]); 255 200 } 256 201 } … … 259 204 //----------------------------------------------------------------------------- 260 205 261 void HAL_TIM_ IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim)262 { 263 extern uint32_t ic_overflows ;264 265 if (htim->Instance == TIM 3)206 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) 207 { 208 extern uint32_t ic_overflows, freq; 209 210 if (htim->Instance == TIM16) 266 211 { 267 printf("Half\n");268 i c_overflows = 0U;212 ic_overflows++; 213 if (ic_overflows > 10U) freq = 0; 269 214 } 270 215 } -
trunk/firmware_v2/Core/Src/tim.c
r22 r23 23 23 /* USER CODE BEGIN 0 */ 24 24 25 # define STATE_NUM (2U)26 #define AVG_NUM (8U) 27 28 uint 16_t ic_buf[AVG_NUM][STATE_NUM];25 #include <stdio.h> 26 27 uint32_t period[STATE_NUM]; 28 uint32_t freq; 29 29 uint32_t ic_overflows; 30 30 31 31 /* USER CODE END 0 */ 32 32 33 TIM_HandleTypeDef htim 3;33 TIM_HandleTypeDef htim16; 34 34 TIM_HandleTypeDef htim17; 35 DMA_HandleTypeDef hdma_tim3_ch1; 36 37 /* TIM3 init function */ 38 void MX_TIM3_Init(void) 39 { 40 41 /* USER CODE BEGIN TIM3_Init 0 */ 42 43 /* USER CODE END TIM3_Init 0 */ 44 45 TIM_ClockConfigTypeDef sClockSourceConfig = {0}; 46 TIM_SlaveConfigTypeDef sSlaveConfig = {0}; 47 TIM_MasterConfigTypeDef sMasterConfig = {0}; 35 36 /* TIM16 init function */ 37 void MX_TIM16_Init(void) 38 { 39 40 /* USER CODE BEGIN TIM16_Init 0 */ 41 42 /* USER CODE END TIM16_Init 0 */ 43 48 44 TIM_IC_InitTypeDef sConfigIC = {0}; 49 45 50 /* USER CODE BEGIN TIM3_Init 1 */ 51 52 /* USER CODE END TIM3_Init 1 */ 53 htim3.Instance = TIM3; 54 htim3.Init.Prescaler = 1; 55 htim3.Init.CounterMode = TIM_COUNTERMODE_UP; 56 htim3.Init.Period = 65535; 57 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 58 htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; 59 if (HAL_TIM_Base_Init(&htim3) != HAL_OK) 60 { 61 Error_Handler(); 62 } 63 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; 64 if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) 65 { 66 Error_Handler(); 67 } 68 if (HAL_TIM_IC_Init(&htim3) != HAL_OK) 69 { 70 Error_Handler(); 71 } 72 sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET; 73 sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; 74 sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; 75 sSlaveConfig.TriggerFilter = 0; 76 if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK) 77 { 78 Error_Handler(); 79 } 80 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; 81 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; 82 if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) 46 /* USER CODE BEGIN TIM16_Init 1 */ 47 48 /* USER CODE END TIM16_Init 1 */ 49 htim16.Instance = TIM16; 50 htim16.Init.Prescaler = 23; 51 htim16.Init.CounterMode = TIM_COUNTERMODE_UP; 52 htim16.Init.Period = 65535; 53 htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 54 htim16.Init.RepetitionCounter = 0; 55 htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; 56 if (HAL_TIM_Base_Init(&htim16) != HAL_OK) 57 { 58 Error_Handler(); 59 } 60 if (HAL_TIM_IC_Init(&htim16) != HAL_OK) 83 61 { 84 62 Error_Handler(); … … 88 66 sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; 89 67 sConfigIC.ICFilter = 0; 90 if (HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) 91 { 92 Error_Handler(); 93 } 94 /* USER CODE BEGIN TIM3_Init 2 */ 95 96 __HAL_TIM_ENABLE_IT(&htim3, TIM_IT_UPDATE); 97 HAL_TIM_IC_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t*)ic_buf, STATE_NUM * AVG_NUM); 98 99 /* USER CODE END TIM3_Init 2 */ 68 if (HAL_TIM_IC_ConfigChannel(&htim16, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) 69 { 70 Error_Handler(); 71 } 72 /* USER CODE BEGIN TIM16_Init 2 */ 73 74 /* USER CODE END TIM16_Init 2 */ 100 75 101 76 } … … 132 107 } 133 108 sConfigOC.OCMode = TIM_OCMODE_PWM1; 134 sConfigOC.Pulse = 64;109 sConfigOC.Pulse = 0; 135 110 sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; 136 111 sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; … … 167 142 168 143 GPIO_InitTypeDef GPIO_InitStruct = {0}; 169 if(tim_baseHandle->Instance==TIM 3)170 { 171 /* USER CODE BEGIN TIM 3_MspInit 0 */172 173 /* USER CODE END TIM 3_MspInit 0 */174 /* TIM 3clock enable */175 __HAL_RCC_TIM 3_CLK_ENABLE();144 if(tim_baseHandle->Instance==TIM16) 145 { 146 /* USER CODE BEGIN TIM16_MspInit 0 */ 147 148 /* USER CODE END TIM16_MspInit 0 */ 149 /* TIM16 clock enable */ 150 __HAL_RCC_TIM16_CLK_ENABLE(); 176 151 177 152 __HAL_RCC_GPIOA_CLK_ENABLE(); 178 /**TIM 3GPIO Configuration179 PA6 ------> TIM 3_CH1153 /**TIM16 GPIO Configuration 154 PA6 ------> TIM16_CH1 180 155 */ 181 156 GPIO_InitStruct.Pin = FAN_TACHO_Pin; … … 183 158 GPIO_InitStruct.Pull = GPIO_PULLUP; 184 159 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 185 GPIO_InitStruct.Alternate = GPIO_AF 1_TIM3;160 GPIO_InitStruct.Alternate = GPIO_AF5_TIM16; 186 161 HAL_GPIO_Init(FAN_TACHO_GPIO_Port, &GPIO_InitStruct); 187 162 188 /* TIM3 DMA Init */ 189 /* TIM3_CH1 Init */ 190 hdma_tim3_ch1.Instance = DMA1_Channel2; 191 hdma_tim3_ch1.Init.Request = DMA_REQUEST_TIM3_CH1; 192 hdma_tim3_ch1.Init.Direction = DMA_PERIPH_TO_MEMORY; 193 hdma_tim3_ch1.Init.PeriphInc = DMA_PINC_DISABLE; 194 hdma_tim3_ch1.Init.MemInc = DMA_MINC_ENABLE; 195 hdma_tim3_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; 196 hdma_tim3_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; 197 hdma_tim3_ch1.Init.Mode = DMA_CIRCULAR; 198 hdma_tim3_ch1.Init.Priority = DMA_PRIORITY_LOW; 199 if (HAL_DMA_Init(&hdma_tim3_ch1) != HAL_OK) 200 { 201 Error_Handler(); 202 } 203 204 __HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_CC1],hdma_tim3_ch1); 205 206 /* TIM3 interrupt Init */ 207 HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); 208 HAL_NVIC_EnableIRQ(TIM3_IRQn); 209 /* USER CODE BEGIN TIM3_MspInit 1 */ 210 211 /* USER CODE END TIM3_MspInit 1 */ 163 /* TIM16 interrupt Init */ 164 HAL_NVIC_SetPriority(TIM16_IRQn, 0, 0); 165 HAL_NVIC_EnableIRQ(TIM16_IRQn); 166 /* USER CODE BEGIN TIM16_MspInit 1 */ 167 168 /* USER CODE END TIM16_MspInit 1 */ 212 169 } 213 170 else if(tim_baseHandle->Instance==TIM17) … … 256 213 { 257 214 258 if(tim_baseHandle->Instance==TIM 3)259 { 260 /* USER CODE BEGIN TIM 3_MspDeInit 0 */261 262 /* USER CODE END TIM 3_MspDeInit 0 */215 if(tim_baseHandle->Instance==TIM16) 216 { 217 /* USER CODE BEGIN TIM16_MspDeInit 0 */ 218 219 /* USER CODE END TIM16_MspDeInit 0 */ 263 220 /* Peripheral clock disable */ 264 __HAL_RCC_TIM 3_CLK_DISABLE();265 266 /**TIM 3GPIO Configuration267 PA6 ------> TIM 3_CH1221 __HAL_RCC_TIM16_CLK_DISABLE(); 222 223 /**TIM16 GPIO Configuration 224 PA6 ------> TIM16_CH1 268 225 */ 269 226 HAL_GPIO_DeInit(FAN_TACHO_GPIO_Port, FAN_TACHO_Pin); 270 227 271 /* TIM3 DMA DeInit */ 272 HAL_DMA_DeInit(tim_baseHandle->hdma[TIM_DMA_ID_CC1]); 273 274 /* TIM3 interrupt Deinit */ 275 HAL_NVIC_DisableIRQ(TIM3_IRQn); 276 /* USER CODE BEGIN TIM3_MspDeInit 1 */ 277 278 /* USER CODE END TIM3_MspDeInit 1 */ 228 /* TIM16 interrupt Deinit */ 229 HAL_NVIC_DisableIRQ(TIM16_IRQn); 230 /* USER CODE BEGIN TIM16_MspDeInit 1 */ 231 232 /* USER CODE END TIM16_MspDeInit 1 */ 279 233 } 280 234 else if(tim_baseHandle->Instance==TIM17) … … 293 247 /* USER CODE BEGIN 1 */ 294 248 249 static unsigned lastSpeed; 250 295 251 void SetFANSpeed(unsigned speed) 296 252 { 297 const unsigned MAX_RPM = 100 0U; // 100.0%253 const unsigned MAX_RPM = 100U; // 100.0% 298 254 299 255 if (speed > MAX_RPM) speed = MAX_RPM; 300 256 301 const unsigned MAX_PWM = __HAL_TIM_GET_AUTORELOAD(&htim17); 257 lastSpeed = speed; 258 259 const unsigned MAX_PWM = __HAL_TIM_GET_AUTORELOAD(&htim17) + 1U; 260 //printf("%u", MAX_PWM); 302 261 const unsigned newPWM = (MAX_PWM * speed/ MAX_RPM); 303 262 … … 305 264 } 306 265 266 //----------------------------------------------------------------------------- 267 268 unsigned GetLastSpeed(void) 269 { 270 return lastSpeed; 271 } 272 307 273 /* USER CODE END 1 */
Note: See TracChangeset
for help on using the changeset viewer.