void pwmInit(void) { uint8_t i; // preset channels to center for (i = 0; i < PWMIN_CHANNEL_NUM; i++) { Inputs[i].state = 0; Inputs[i].capture = 1500; Inputs[i].rise = 0; Inputs[i].fall = 0; } pwmInitializeInput(); }
bool pwmInit(drv_pwm_config_t *init) { GPIO_InitTypeDef GPIO_InitStructure = { 0, }; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = { 0, }; TIM_OCInitTypeDef TIM_OCInitStructure = { 0, }; uint8_t i; // Inputs // RX1 TIM2_CH1 PA0 [also PPM] [also used for throttle calibration] // RX2 TIM2_CH2 PA1 // RX3 TIM2_CH3 PA2 [also UART2_TX] // RX4 TIM2_CH4 PA3 [also UART2_RX] // RX5 TIM3_CH1 PA6 [also ADC_IN6] // RX6 TIM3_CH2 PA7 [also ADC_IN7] // RX7 TIM3_CH3 PB0 [also ADC_IN8] // RX8 TIM3_CH4 PB1 [also ADC_IN9] // Outputs // PWM1 TIM1_CH1 PA8 // PWM2 TIM1_CH4 PA11 // PWM3 TIM4_CH1 PB6 [also I2C1_SCL] // PWM4 TIM4_CH2 PB7 [also I2C1_SDA] // PWM5 TIM4_CH3 PB8 // PWM6 TIM4_CH4 PB9 // use PPM or PWM input usePPMFlag = init->usePPM; // preset channels to center for (i = 0; i < 8; i++) Inputs[i].capture = 1500; // Timers run at 1mhz. // TODO: clean this shit up. Make it all dynamic etc. if (init->enableInput) pwmInitializeInput(usePPMFlag); // Output pins (4x) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // Output timer TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1); TIM_TimeBaseStructure.TIM_Period = (1000000 / init->motorPwmRate) - 1; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = PULSE_1MS; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; // PWM1,2,3,4 TIM_OC1Init(TIM4, &TIM_OCInitStructure); TIM_OC2Init(TIM4, &TIM_OCInitStructure); TIM_OC3Init(TIM4, &TIM_OCInitStructure); TIM_OC4Init(TIM4, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_Cmd(TIM4, ENABLE); TIM_CtrlPWMOutputs(TIM4, ENABLE); TIM_OC1PreloadConfig (TIM4, TIM_OCPreload_Enable); // turn on more motor outputs if we're using ppm / not using pwm input if (!init->enableInput || init->usePPM) { // TODO } return false; }