//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信號輸出