//TIM1 分頻 #define TIM1_DIV1 (1-1) #define TIM1_DIV2 (2-1) #define TIM1_DIV4 (4-1) #define TIM1_DIV8 (8-1) #define TIM1_DIV9 (9-1) #define TIM1_DIV18 (18-1) #define TIM1_DIV72 (72-1) #define TIM1PinA_Enb TIM1->CCER |= 0X0001 //比較通道1輸出到IO #define TIM1PinB_Enb TIM1->CCER |= 0X0010 //比較通道2輸出到IO #define TIM1PinC_Enb TIM1->CCER |= 0X0100 //比較通道3輸出到IO #define TIM1PinA_Dis TIM1->CCER &= ~0X0001 //比較通道1禁止輸出到IO #define TIM1PinB_Dis TIM1->CCER &= ~0X0010 //比較通道2禁止輸出到IO #define TIM1PinC_Dis TIM1->CCER &= ~0X0100 //比較通道3禁止輸出到IO #define VT_PWM 1000 //PWM 計數最大值 頻率8K //#define VT_PWM 500 //PWM 計數最大值 頻率16K //************************************* // 函數名稱:TIM1_PWMMode_Init // 函數功能:TIM1 作PWM模式初始化 用作比較輸出用 // 入口參數:計數個數 分頻數 // 出口參數:無 // 返回值 :無 // 此設置適合用作BLDC驅動控制中驅動三對MOS //*************************************** void TIM1_PWMMode_Init(int16_t Tcon,uint16_t psc) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); TIM_DeInit(TIM1); //復位定時器 TIM1->ARR = Tcon ; //定時器重裝載值 TIM1->PSC = psc ; //時鐘預分頻系數 TIM1->CR1 &= ~(1<<4) ; //向上計數 TIM1->CR1 |= (1<<7); //使能自動重裝載 //清除更新中斷 比較1234中斷標志 TIM1->SR &= ~0X001F ; // 通道1 2 3 配置為PWM1模式 TIM1->CCMR1 = 0X6868 ; // TIM1->CCMR2 = 0X0068 ; // 不使能比較通道1 2 3輸出到IO 且1電平為有效電平 TIM1->CCER = 0X0000 ; // TIM1->CCR1 = 0 ; TIM1->CCR2 = 0 ; TIM1->CCR3 = 0 ; TIM1->CCR4 = 0 ; // 關更新中斷 比較1-4中斷 TIM1->DIER &= ~0X001F ; // TIM1->DIER |= 0X0002 ; //開比較1 中斷 TIM1->BDTR |= (1<<15) ; //主輸出使能 !!! //清除更新事件標記位 並初始化所有寄存器 TIM1->EGR &= ~0X0001 ; TIM1->CR1 |= 0X0001 ; //開啟時鐘 } //************************************* // 函數名稱:ToPWM_Value // 函數功能:設置PWM占空比 // 入口參數:計數個數 分頻數 // 出口參數:無 // 返回值 :無 //***************************************/ void ToPWM_Value(uint16_t InValue) { TIM1->CCR1 = InValue ; TIM1->CCR2 = InValue ; TIM1->CCR3 = InValue ; } //************************************* // 函數名稱:BLDC_RUN_ONESTEP // 函數功能:電機六步走向 // 入口參數:電機運行的當前步 // 出口參數:無 //***************************************/ void BLDC_RUN_ONESTEP(uint32_t STEP) { switch(STEP) { case 1 : // AB TIM1PinB_Dis ; TIM1PinC_Dis ; TIM1PinA_Enb ; UdePinA_Off ; UdePinC_Off ; UdePinB_On ; break ; case 2 : //AC TIM1PinB_Dis ; TIM1PinC_Dis ; TIM1PinA_Enb ; UdePinA_Off ; UdePinB_Off ; UdePinC_On ; break ; case 3 : //BC TIM1PinA_Dis ; TIM1PinC_Dis ; TIM1PinB_Enb ; UdePinA_Off ; UdePinB_Off ; UdePinC_On ; break ; case 4 ://BA TIM1PinA_Dis ; TIM1PinC_Dis ; TIM1PinB_Enb ; UdePinB_Off ; UdePinC_Off ; UdePinA_On ; break ; case 5 ://CA TIM1PinA_Dis ; TIM1PinB_Dis ; TIM1PinC_Enb ; UdePinB_Off ; UdePinC_Off ; UdePinA_On ; break ; case 6 : //CB TIM1PinA_Dis ; TIM1PinB_Dis ; TIM1PinC_Enb ; UdePinA_Off ; UdePinC_Off ; UdePinB_On ; break ; default : break ; } } //----實例應用------ //72M/(9) = 8M pwm周期=(1/8)*1000=125U TIM1_PWMMode_Init(VT_PWM,TIM1_DIV9) ; //PWM 頻率設置初始化 頻率F=8K // ToPWM_Value(500) ; //設置三相驅動的PWM占空比 500/1000 = 50% // TIM1PinA_Enb ; //PWM輸出到IO 此時可在IO上看到有PWM信號輸出