= = File time1.h============================================================ #ifndef _time1_h_#define _TIME1_H_# The include "Stm32f0xx.h"//======== defines the frequency ================================================ of the PWM #defineDEF_PWMFREDEF_ pwmfre_16k#definedef_pwmfre_8k8000//Count period value is 48000000/8000=6000#definedef_pwmfre_16k16000//count period value is 48000000/16000= 0.02u/n#definedef_pwmfre_20k20000//count period value is 48000000/20000=2400#definedef_pwmfre_25k25000//count period value is 48000000/ 16000=1920#definedef_pwmfre_30k30000//count period value is 48000000/16000=1600//========PWM1 2 3 channel output enable bit operation ====================== =============== #definePWMA_EnbTIM1->ccer |= (uint16_t) (((uint16_t) tim_ccer_cc1e) #definePWMA_DisTIM1->ccer &= (uint16_t) (~ ((uint16_t) tim_ccer_cc1e)) #definePWMB_EnbTIM1->ccer |= (uint16_t) (((uint16_t) tim_ccer_cc2e) ) #definePWMB_DisTIM1->ccer &= (uint16_t) (~ (uint16_t) tim_ccer_cc2e) #definePWMC_EnbTIM1->ccer |= (uint16 _t) ((((uint16_t) tim_ccer_cc3e)) #definePWMC_DisTIM1->ccer &= (uint16_t) (~ ((uint16_t) tim_ccer_cc3e)) # DefinepwmD_enbtim1->ccer |= (uint16_t) (((uint16_t) tim_ccer_cc4e) #definePWMD_DisTIM1->ccer &= (uint16_t) (( uint16_t) (tim_ccer_cc4e)) #definePWMABC_Dis tim1->ccer &= (uint16_t) ((uint16_t) (tim_ccer_cc1e| tim_ccer_cc2e| tim_ccer_cc3e))//========PWM1 2 3-channel complementary output enable bit operation ===================================== #definePWMAN_EnbTIM1->ccer | = (uint16_t) (((uint16_t) tim_ccer_cc1ne)) #definePWMAN_DisTIM1->ccer &= (uint16_t) (~ (uint16_t) Tim_ccer_ cc1ne)) #definePWMBN_EnbTIM1->ccer |= (uint16_t) (((uint16_t) tim_ccer_cc2ne)) #definePWMBN_DisTIM1->ccer & = (uint16_t) (~ ((uint16_t) tim_ccer_cc2ne)) #definePWMCN_EnbTIM1->ccer |= (uint16_t) (((uint16_t) tim_ccer_cc3ne)) # Definepwmcn_distim1->ccer &= (uint16_t) (~ (uint16_t) tim_ccer_cc3ne) #definePWMDN_EnbTIM1->ccer |= ( uint16_t) (((uint16_t) tim_ccer_cc4ne)) #definePWMDN_DisTIM1->ccer &= (uint16_t) (~ ((uint16_t) tim_ccer_cc4ne) ) #definePWMABCN_Enb tim1->ccer |= (uint16_t) ((uint16_t) (tim_ccer_cc1ne| tim_ccer_cc2ne| Tim_ccer_cc3ne)))#definePWMABCN_Dis tim1->ccer &= (uint16_t) (~ (uint16_t) (tim_ccer_cc1ne| tim_ccer_cc2ne| Tim_ccer_cc3ne)))//======== enable CC4 compare interrupts ===================================== #defineTIM1_CMP4IEN_ENBTIM1->dier | = TIM_IT_CC4//((uint16_t) 0x0010) #defineTIM1_CMP4IEN_DISTIM1->dier &= ~tim_it_cc4////======== enable CC4 update Interrupt ===== ================================//#defineTIM1_UpdateIEN_ENBTIM1->dier |= tim_it_update//((uint16_t) 0x0010)//# Definetim1_updateien_distim1->dier &= ~tim_it_update//========= comparison 4 interrupt entry point in time =============================== = = #defineV_CCP4PW150////===================================================extern void tim1_gpio_init (void); extern void Tim1_pwm_config (void), extern void Topwmvalue (UInt16 Tcon), extern void Bldc_bak (uint16_t pwmduty), extern voi D bldc_bak_end (void), extern void Tim1_ccp4nvic_config (void), extern void Toccp4pwmvalue (UInt16 pwmduty), #endif/* _time 1_h_ *///== file time1.c============================================================ #include "global.h"#include" time1.h "Tim_timebaseinittypedef tim_time1basestructure; Tim_ocinittypedef tim_ocinitstructure;uint16_t timerperiod = 0;//#defineDEF_PWM_NCP_ENB1//PWM complementary enable definition/************** Function Name: tim1_gpio_init* function Description: TIM1--GPIO PIN Configuration---Here you can set 6 PWM output * Input parameters: void* return parameter: No *************************************************************** /void tim1_gpio_init (void) {gpio_inittypedef gpio_initstructure; /* Enable GPIO clock */Rcc_ahbperiphclockcmd (RCC_AHBPERIPH_GPIOA, enable); /* Configure GPIO Pin multiplexing PWM1 PWM2 PWM3 */gpio_initstructure.gpio_pin = Gpio_pin_8 | Gpio_pin_9 | gpio_pin_10;//| Gpio_pin_11 Gpio_initstructure.gpio_mode = GPIO_MODE_AF; Gpio_initstructure.gpio_speed = Gpio_speed_50mhz; Gpio_initstructure.gpio_otype = gpio_otype_pp; GPIO_INITSTRUCTURE.GPIO_PUPD = Gpio_pupd_down;//gpio_pupd_up; Gpio_init (Gpioa, &gpio_initstructure); Gpio_pinafconfig (Gpioa, Gpio_pinsource8, gpio_af_2); Turn on the PA8 multiplexing function gpio_pinafconfIG (Gpioa, Gpio_pinsource9, gpio_af_2); Open PA9 multiplexing function gpio_pinafconfig (Gpioa, Gpio_pinsource10, gpio_af_2); Open PA10 multiplexing function//Gpio_pinafconfig (Gpioa, Gpio_pinsource11, gpio_af_2); ----------Down tube PA7 PB0 PB1 configuration---------------------------------------------------gpio_initstructure.gpio_pin = Gpio_ pin_7;//Gpio_initstructure.gpio_mode = Gpio_mode_out; Gpio_initstructure.gpio_speed = Gpio_speed_50mhz; Gpio_initstructure.gpio_otype = gpio_otype_pp; GPIO_INITSTRUCTURE.GPIO_PUPD = Gpio_pupd_nopull; Gpio_init (Gpioa, &gpio_initstructure); -----------------------------------------------------------------------------------/* Configure GPIO PIN PWM2 PWM3 complementary gpio P B0 PB1 */Rcc_ahbperiphclockcmd (RCC_AHBPERIPH_GPIOB, ENABLE); Gpio_initstructure.gpio_pin = Gpio_pin_0 | gpio_pin_1;//| | Gpio_pin_11 Gpio_initstructure.gpio_mode = gpio_mode_out; Gpio_initstructure.gpio_speed = Gpio_speed_50mhz; Gpio_initstructure.gpio_otype = gpio_otype_pp; GPIO_INITSTRUCTURE.GPIO_PUPD = Gpio_pupd_nopull; Gpio_init (Gpiob, &gpio_initstructure); }/******************************************************************************** function Name: GPIO_DOWNPIN_ConfigRst* Function Description: BLDC down Tube io configured as normal mode * input parameter: void* return parameter: No ************************************************************************* /void Gpio_downpin_afconfigrst (void) {gpio_inittypedef gpio_initstructure; Gpio_initstructure.gpio_pin = gpio_pin_7;//Gpio_initstructure.gpio_mode = Gpio_mode_out; Gpio_initstructure.gpio_speed = Gpio_speed_50mhz; Gpio_initstructure.gpio_otype = gpio_otype_pp; GPIO_INITSTRUCTURE.GPIO_PUPD = Gpio_pupd_nopull; Gpio_init (Gpioa, &gpio_initstructure); Gpio_initstructure.gpio_pin = Gpio_pin_0 | gpio_pin_1;//| | Gpio_pin_11 Gpio_initstructure.gpio_mode = gpio_mode_out; Gpio_initstructure.gpio_speed = Gpio_speed_50mhz; Gpio_initstructure.gpio_otype = gpio_otype_pp; GPIO_INITSTRUCTURE.GPIO_PUPD = Gpio_pupd_nopull; Gpio_init (Gpiob, &gpio_initstructure); }/************************************Function Name: gpio_downpin_afconfig* function Description: BLDC down Tube io configured as AF mode * input parameter: void* return parameter: None * * /void gpio_downpin_afconfig (void) {Gpio_inittypedef gpio_initstructure; Gpio_initstructure.gpio_pin = gpio_pin_7;//Gpio_initstructure.gpio_mode = GPIO_MODE_AF; Gpio_initstructure.gpio_speed = Gpio_speed_50mhz; Gpio_initstructure.gpio_otype = gpio_otype_pp; GPIO_INITSTRUCTURE.GPIO_PUPD = gpio_pupd_up; Gpio_init (Gpioa, &gpio_initstructure); Gpio_pinafconfig (Gpioa, Gpio_pinsource7, gpio_af_2); ----------------------------------------------------------Gpio_initstructure.gpio_pin = Gpio_pin_0 | gpio_pin_1;//| | Gpio_pin_11 Gpio_initstructure.gpio_mode = GPIO_MODE_AF; Gpio_initstructure.gpio_speed = Gpio_speed_50mhz; Gpio_initstructure.gpio_otype = gpio_otype_pp; GPIO_INITSTRUCTURE.GPIO_PUPD = gpio_pupd_up; Gpio_init (Gpiob, &gpio_initstructure); Gpio_pinafconfig (GPIOB, Gpio_pinsource0, gpio_af_2); Gpio_pinafconfig (Gpiob, Gpio_pinsource1, gpio_af_2);} /******************************************************************************** function Name: TIM1_PWM_Config* function Description: TIM1-PWM configuration * Input parameters: void* return parameter: No ********************************************************************************/ The configuration of void tim1_pwm_config (void) {/* TIM1---------------------------------------------------TIM1 input Clock (TIM1CLK) is set to APB2 Clock (PCLK2) = TIM1CLK = PCLK2 = Systemcoreclock TIM1CLK = systemcoreclock, Prescaler = 0, TIM1 counter clock = Systemcoreclock Systemcoreclock is a 4-way PWM signal for our target at 17.57 KHz:-tim1_period = (systemcoreclock/17570 )-1 Channel 1 the duty ratio set for 50% Channel 2 is set to a duty ratio of 37.5% Channel 3 to the duty ratio set for 25% Channel 4 and the duty ratio for 12.5% timer pulses is calculated as follows:-Channelxpulse = Dutycy CLE * (TIM1_PERIOD-1)/100*//* Calculates the value of a predetermined table, that is, how many clocks count to one cycle *///timerperiod = (systemcoreclock/17570)-1; Timerperiod = (systemcoreclock/def_pwmfre)-1; Timerperiod = (systemcoreclock /Def_pwmfre); /* TIM1 Clock Enable */Rcc_apb2periphclockcmd (RCC_APB2PERIPH_TIM1, enable); /* Time Base setting */Tim_time1basestructure.tim_prescaler = 0; Tim_time1basestructure.tim_countermode = tim_countermode_up; /* Timing set to rising edge calculation mode */tim_time1basestructure.tim_period = Timerperiod; tim_time1basestructure.tim_clockdivision = 0; Tim_time1basestructure.tim_repetitioncounter = 0; Tim_timebaseinit (TIM1, &tim_time1basestructure); /* PWM mode setting for Channel 1,2,3,4 */tim_ocinitstructure.tim_ocmode = TIM_OCMODE_PWM1; Tim_ocinitstructure.tim_outputstate = tim_outputstate_disable;//tim_outputstate_enable; PWM output Enable bit tim_ocinitstructure.tim_outputnstate = tim_outputnstate_disable;//tim_outputnstate_enable; Complementary PWM output Enable bit tim_ocinitstructure.tim_ocpolarity = Tim_ocpolarity_high; The PWM 1 is the active level tim_ocinitstructure.tim_ocnpolarity = Tim_ocnpolarity_low; PWM complementary 0 is an effective level tim_ocinitstructure.tim_ocidlestate = Tim_ocidlestate_set; Tim_ocinitstructure.tim_ocnidlestate = Tim_ocidlestate_reset; Tim_oCinitstructure.tim_pulse = 0; Assignment duty ratio tim_oc1init (TIM1, &tim_ocinitstructure);//Enable Channel 1 configuration Tim_ocinitstructure.tim_pulse = 0; Assignment duty ratio tim_oc2init (TIM1, &tim_ocinitstructure);//Enable Channel 2 configuration Tim_ocinitstructure.tim_pulse = 0; Assignment duty ratio tim_oc3init (TIM1, &tim_ocinitstructure);//Enable Channel 3 configuration//------enable to compare Quad channel------------------------------------ Tim_ocinitstructure.tim_outputstate = tim_outputstate_disable;//tim_outputstate_enable; Tim_ocinitstructure.tim_pulse = V_CCP4PW; Tim_oc4init (TIM1, &tim_ocinitstructure); Tim_itconfig (TIM1,TIM_IT_CC4, ENABLE); TIM1 compare four interrupts//--------------------------------------------------------/* TIM1 Calculator Enable */Tim_cmd (TIM1, enable); /* TIM1 main output Enable */Tim_ctrlpwmoutputs (TIM1, enable);} /******************************************************************************** function Name: ToPwmValue* function Description: Assign each channel duty-free ratio * Input parameters: duty-free ratio * return parameter: no ********************************************************************************/void Topwmvalue (UInt16 pwmduty) {TIM1->CCR1 = Pwmduty ; TIM1->CCR2 = pwmduty; TIM1->CCR3 = pwmduty;//TIM1->CCR4 = pwmduty;} /******************************************************************************** function Name: BLDC_Bak* function Description: Brake * Input Parameters: Brake Duty * Return parameter: no ********************************************************************************/void BLDC_Bak ( uint16_t pwmduty) {gpio_downpin_afconfig (); Pwmabc_dis; Off PWM output Pwmabcn_enb; Enable complementary PWM output TIM1->CCR1 = pwmduty; Brake PWM value Tim1->ccr2 = pwmduty; TIM1->CCR3 = pwmduty;} /******************************************************************************** function Name: BLDC_Bak_End* function Description: At the end of the brake Initialize the pipe configuration to normal IO mode * input parameters: Brake Duty ratio * Return parameter: no ***************************************************************************** /void bldc_bak_end (void) {Pwmabcn_dis;//Inhibit complementary output gpio_downpin_afconfigrst ();//}/******************************** Function Name: tim1_ccp4nvic_config* function Description: TIM1 CCR4 Interrupt configuration * Input parameters: None * return parameter: NO * * * * ********************************************************/void tim1_ccp4nvic_config (void) {nvic_inittypedef nvic_initstructure; /* TIM1 Clock Enable */Rcc_apb2periphclockcmd (RCC_APB2PERIPH_TIM1, enable); /* TIM1 Interrupt nesting design */Nvic_initstructure.nvic_irqchannel = tim1_cc_irqn;//tim3_irqn; nvic_initstructure.nvic_irqchannelpriority = 0; Nvic_initstructure.nvic_irqchannelcmd = ENABLE; Nvic_init (&nvic_initstructure); }/******************************************************************************** function Name: ToCCP4PwmValue* function Description: Assign compare 4 Interrupt Time value * Input parameter: Duty ratio * Return parameter: no ********************************************************************************/ void Toccp4pwmvalue (UInt16 pwmduty) {TIM1->CCR4 = pwmduty;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
stm32f030 TIM1 PWM Applications (BLDC applications)