STM32 驅動舵機


 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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM