1 void TIM_Configuration(void) 2 { 3 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 4 TIM_OCInitTypeDef TIM_OCInitStructure; 5 GPIO_InitTypeDef GPIO_InitStructure; 6 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); 7 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 , ENABLE); 8 9 10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //TIM3的1、2通道 ,產生PWM 11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 12 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 13 GPIO_Init(GPIOA,&GPIO_InitStructure); //PA的6,7口對應TIM3的1、2通道,設置為復用推挽輸出 14 15 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //TIM4的1、2、3、4通道 16 GPIO_Init(GPIOB,&GPIO_InitStructure); //B口的6,7,8,9對應TIM4的1、2、3、4通道,設置為復用推挽輸出 17 18 TIM_TimeBaseStructure.TIM_Period =9999; //自動重載周期值 19 TIM_TimeBaseStructure.TIM_Prescaler =143; //預分頻值 ,這里是50HZ 20 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //時鍾分割 21 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數摸式為向上計數 22 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 23 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //TIM3,和TIM4用的相同配置,寫入配置 ,PWM頻率為50HZ 24 25 //設定占空比 26 27 TIM_OCStructInit(& TIM_OCInitStructure); //恢復初始 28 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //定時器模式為pwm模式1 29 TIM_OCInitStructure.TIM_Pulse =0; //脈沖值,即輸出都是低電平 30 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 31 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //極性為高 32 33 TIM_OC1Init(TIM3, &TIM_OCInitStructure); //將配置數據寫入TIM3的通道1 34 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //預裝載使能 35 TIM_OC2Init(TIM3, &TIM_OCInitStructure); 36 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); 37 38 TIM_OC1Init(TIM4, &TIM_OCInitStructure); 39 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); 40 TIM_OC2Init(TIM4, &TIM_OCInitStructure); 41 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); 42 TIM_OC3Init(TIM4, &TIM_OCInitStructure); 43 TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); 44 TIM_OC4Init(TIM4, &TIM_OCInitStructure); 45 TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//TIM4的4個通道都用相同的配置 46 TIM_Cmd(TIM3, ENABLE); 47 TIM_CtrlPWMOutputs(TIM3, ENABLE); 48 TIM_Cmd(TIM4, ENABLE); 49 TIM_CtrlPWMOutputs(TIM4, ENABLE); //使能PWM模式 50 }
1 void SetJointAngle(u8 ID, float angle) 2 { 3 switch(ID) 4 { 5 case 0: //-90°~90° 6 angle=angle+90.0; 7 angle=(u16)(50.0*angle/9.0+249.0); 8 TIM_SetCompare1(TIM3,angle); 9 break; 10 //0°~180° 11 case 1: 12 angle=(u16)(4.175*angle+409.25); 13 TIM_SetCompare2(TIM3,angle); 14 break; 15 16 17 case 2: //-150°~0° 18 angle=-angle; 19 angle=(u16)(4.175*angle+480.0); 20 TIM_SetCompare1(TIM4,angle); 21 break; 22 23 case 3: 24 angle=-180-angle; 25 angle=-angle; 26 angle=(u16)(4.175*angle+315.0); 27 28 29 TIM_SetCompare2(TIM4,angle); 30 break; 31 //-90°~90° 32 case 4: 33 angle=90.0+angle; 34 angle=(u16)(249.0+50.0*angle/9.0); 35 TIM_SetCompare3(TIM4,angle); 36 break; 37 38 39 default: break; 40 } 41 }
如:SetJointAngle(0,0);