#ifndef _PWM_H__ #define _PWM_H__ #include "bsp/bsp.h" #include "os/os_type.h" #include "bsp/dma.h" #define TIMxCCER_MASK_CH012 ((uint16_t) (TIMER_CHCTL2_CH0EN|TIMER_CHCTL2_CH0NEN|\ TIMER_CHCTL2_CH1EN|TIMER_CHCTL2_CH1NEN|\ TIMER_CHCTL2_CH2EN|TIMER_CHCTL2_CH2NEN)) #define pwm_enable_channel() {TIMER_CHCTL2(pwm_timer) |= TIMxCCER_MASK_CH012;} #define pwm_disable_channel() {TIMER_CHCTL2(pwm_timer) &= ~TIMxCCER_MASK_CH012;} #define ch0_update_duty(duty) TIMER_CH0CV(pwm_timer) = (uint32_t)duty #define ch1_update_duty(duty) TIMER_CH1CV(pwm_timer) = (uint32_t)duty #define ch2_update_duty(duty) TIMER_CH2CV(pwm_timer) = (uint32_t)duty #define update_adc_trigger(time) TIMER_CH3CV(pwm_timer) = (uint32_t)time #define pwm_update_duty(dutyA, dutyB, dutyC) \ do {\ ch0_update_duty(dutyA);\ ch1_update_duty(dutyB);\ ch2_update_duty(dutyC);\ }while(0) #ifdef ENABLE_AUX_TIMER #define pwm_update_2smaples(samp1, samp2) \ do { \ TIMER_CH3CV(pwm_timer) = (uint32_t)samp1; \ TIMER_CH0CV(adc_timer) = (uint32_t)samp2; \ }while(0) #else #define pwm_update_2smaples(samp1, samp2) \ do { \ TIMER_CH3CV(pwm_timer) = (uint32_t)samp1; \ }while(0) #endif #define update_sample_time(samp1, samp2) do{adc_timer_dma_buf[2] = samp1; adc_timer_dma_buf[0] = samp2;}while(0) #define update_distort_chxcv(duty) do {pwm_timer_dma_buf[1] = duty;}while(0) #define enable_pwm_timer_dma() TIMER_DMAINTEN(pwm_timer) |= (uint32_t) TIMER_DMA_CH3D #define disable_pwm_timer_dma() TIMER_DMAINTEN(pwm_timer) &= ~((uint32_t) TIMER_DMA_CH3D) #define enable_sample_timer_dma() TIMER_DMAINTEN(adc_timer) |= (uint32_t) TIMER_DMA_CH0D #define disable_sample_timer_dma() TIMER_DMAINTEN(adc_timer) &= ~((uint32_t) TIMER_DMA_CH0D) extern u16 timer_update_buffer[6]; #define pwm_update_duty_dma(a, b, c, na, nb, nc) \ do { \ timer_update_buffer[0] = a; \ timer_update_buffer[1] = b; \ timer_update_buffer[2] = c; \ timer_update_buffer[3] = na; \ timer_update_buffer[4] = nb; \ timer_update_buffer[5] = nc; \ }while(0) #define pwm_clear_updata() \ timer_flag_clear(pwm_timer, TIMER_FLAG_UP); #define pwm_wait_and_clear_updata() \ do { \ while ( timer_flag_get(pwm_timer, TIMER_FLAG_UP) == RESET ); \ timer_flag_clear(pwm_timer, TIMER_FLAG_UP); \ }while(0) void pwm_3phase_init(void); void pwm_start(void); void pwm_stop(void); void pwm_turn_on_low_side(void); void pwm_enable_output(bool enable); #endif /*_PWM_H__*/