Turn PWM channels on only when needed
This commit is contained in:
parent
778e0ae272
commit
ffd90a6a36
1
Hardware/~sensor-node.kicad_pcb.lck
Normal file
1
Hardware/~sensor-node.kicad_pcb.lck
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"hostname":"nagata","username":"oskar"}
|
1
Hardware/~sensor-node.kicad_sch.lck
Normal file
1
Hardware/~sensor-node.kicad_sch.lck
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"hostname":"nagata","username":"oskar"}
|
@ -27,6 +27,8 @@
|
|||||||
|
|
||||||
/* Private includes ----------------------------------------------------------*/
|
/* Private includes ----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "mappings.h"
|
#include "mappings.h"
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
@ -54,6 +56,8 @@ static uint8_t dio_values[NUM_DIO_PINS];
|
|||||||
|
|
||||||
// See mappings.h pwm_tim_t
|
// See mappings.h pwm_tim_t
|
||||||
TIM_HandleTypeDef* PWM_TIM_MAP[3] = {&htim1, &htim4, &htim3};
|
TIM_HandleTypeDef* PWM_TIM_MAP[3] = {&htim1, &htim4, &htim3};
|
||||||
|
|
||||||
|
static uint8_t pwm_ch_active[8];
|
||||||
/* USER CODE END PV */
|
/* USER CODE END PV */
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
@ -157,15 +161,8 @@ int main(void)
|
|||||||
if (HAL_FDCAN_Start(hMainCAN) != HAL_OK)
|
if (HAL_FDCAN_Start(hMainCAN) != HAL_OK)
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
|
|
||||||
|
// Init all channels as stopped
|
||||||
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
|
memset(pwm_ch_active, 0, 8);
|
||||||
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
|
|
||||||
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
|
|
||||||
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
|
|
||||||
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
|
|
||||||
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
|
|
||||||
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
|
|
||||||
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
|
|
||||||
|
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
@ -352,14 +349,19 @@ void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *handle, uint32_t RxFifo0ITs)
|
|||||||
for (int i = 0; i < header.DataLength; i++) {
|
for (int i = 0; i < header.DataLength; i++) {
|
||||||
|
|
||||||
TIM_HandleTypeDef* htim = PWM_TIM_MAP[PWM_CH_MAP[i].tim];
|
TIM_HandleTypeDef* htim = PWM_TIM_MAP[PWM_CH_MAP[i].tim];
|
||||||
|
|
||||||
|
if ((pwm_ch_active[i] == 0) && (dcs[i] == 0)) {
|
||||||
|
HAL_TIM_PWM_Stop(htim, PWM_CH_MAP[i].ch << 2);
|
||||||
|
pwm_ch_active[i] = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
SetCCR(htim->Instance, PWM_CH_MAP[i].ch, dcs[i]);
|
SetCCR(htim->Instance, PWM_CH_MAP[i].ch, dcs[i]);
|
||||||
// TODO: This does not work, apparently they don't start in RESET
|
|
||||||
// Maybe have our own init bool array instead
|
if (pwm_ch_active[i] == 0) {
|
||||||
// Manually enabling doesn't seem to work either
|
|
||||||
if (htim->ChannelState[PWM_CH_MAP[i].ch] == HAL_TIM_CHANNEL_STATE_RESET)
|
|
||||||
HAL_TIM_PWM_Start(htim, PWM_CH_MAP[i].ch << 2);
|
HAL_TIM_PWM_Start(htim, PWM_CH_MAP[i].ch << 2);
|
||||||
// MAYBE: Stop Timer when DC == 0 on all channels?
|
pwm_ch_active[i] = 1;
|
||||||
// HAL_TIM_PWM_Stop(htim, channel);
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user