extern void __analogWrite(uint8_t pin, int value) { bool start_timer = false; if(value == 0) { digitalWrite(pin, LOW); prep_pwm_steps(); return; } if((pwm_mask & (1 << pin)) == 0) { if(pwm_mask == 0) { memset(&_pwm_isr_data, 0, sizeof(struct pwm_isr_data*)); start_timer = true; } pinMode(pin, OUTPUT); digitalWrite(pin, LOW); pwm_mask |= (1 << pin); } if((F_CPU / ESP8266_CLOCK) == 1) { value = (value+1) / 2; } pwm_values[pin] = value % (pwm_range + 1); prep_pwm_steps(); if(start_timer) { pwm_start_timer(); } }
void esc_init(void) { /* init timer2 with a period of 20ms */ // pwm_init_timer(&RCC_APB1ENR, RCC_APB1ENR_TIM2EN, LED_TIM, PWM_PRESCALE, PWM_PERIOD); pwm_init_timer(&RCC_APB1ENR, RCC_APB1ENR_TIM4EN, ESC_TIMER, PWM_PRESCALE, ESC_PWM_PERIOD); /* init output of channel2 of timer2 */ // pwm_init_output_channel(LED_TIM, LED_CH1, &RCC_APB2ENR, RCC_APB2ENR_IOPAEN, GPIOA, GPIO_TIM2_CH2); pwm_init_output_channel(ESC_TIMER, ESC_CHANNEL1, &RCC_APB2ENR, RCC_APB2ENR_IOPBEN, GPIOB, GPIO_TIM4_CH1); pwm_init_output_channel(ESC_TIMER, ESC_CHANNEL2, &RCC_APB2ENR, RCC_APB2ENR_IOPBEN, GPIOB, GPIO_TIM4_CH2); pwm_set_pulse_width(ESC_TIMER, ESC_CHANNEL1, ESC_LOW); pwm_set_pulse_width(ESC_TIMER, ESC_CHANNEL2, ESC_LOW); /* start timer1 */ // pwm_start_timer(TIM2); pwm_start_timer(ESC_TIMER); }
extern void __analogWrite(uint8_t pin, int value) { bool start_timer = false; if(value == 0){ pwm_mask &= ~(1 << pin); prep_pwm_steps(); digitalWrite(pin, LOW); if(pwm_mask == 0) timer1_disable(); return; } if((pwm_mask & (1 << pin)) == 0){ if(pwm_mask == 0) start_timer = true; pwm_mask |= (1 << pin); pinMode(pin, OUTPUT); digitalWrite(pin, LOW); } pwm_values[pin] = value % (pwm_range + 1); prep_pwm_steps(); if(start_timer){ pwm_start_timer(); } }