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