基于舵机SG92R的使用--精英板开发

基于舵机SG92R的使用–精英板开发

——舵机的基本参数——
外形尺寸:23×12.2×27mm
输入电压:4.2v-6v
工作温度:0-55℃
舵机有三条线:
信号线(黄线)
红线(电源线VCC)
棕色(底线GND)
舵机工作原理: 舵机的控制信号为周期是20ms的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。
基于舵机SG92R的使用--精英板开发_第1张图片
——正点原子精英板开发代码——
初始化定时器3输出PWM波



void TIM3_PWM_Init(u16 arr,u16 psc)

{
       

    RCC->APB2ENR|=1;//afio

    RCC->APB2ENR|=1<<3;//gpiob

    RCC->APB1ENR|=1<<1;//定时器三

    AFIO->MAPR|=1<<11;//部分重隐射  

    GPIOB->CRL&=0XFF0FFFFF;

    GPIOB->CRL|=0X00B00000;//配置pb5 fuy复用推挽输出

    TIM3->ARR=arr;

    TIM3->PSC=psc;


    TIM3->CR1|=0<<4;//向上计数

    TIM3->CR1|=0<<8;


    TIM3->CCER|=0<<5;//输出急性高

    TIM3->CCER|=1<<4;//通道输出使能


    TIM3->CCMR1|=7<<12;//pwm2

    TIM3->CR1|=1;//打开计数器

}

基于舵机SG92R的使用--精英板开发_第2张图片
main.c



int main(void)

 {
           

    u16 led0pwmval=0;

//  
Stm32_Clock_Init(9);   //系统时钟设置

//  LCD_Init(); 

//  u8 dir=1;   

     POINT_COLOR=RED;//设置字体为红色

    delay_init();            //延时函数初始化     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
     //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

    uart_init(115200);   //串口初始化为115200

    LED_Init();             //LED端口初始化

    TIM3_PWM_Init(1999,719);     //不分频。PWM频率=100000/2000=50hz


 while(1)

    {
     

        u8 i=0;

        int angle=0;

        for(i=0;i<=3;i++)

        {
     

           angle=60*i;

           led0pwmval=(int)(2000*(1-(
( 2.5-(angle/90.0) )/20.0 )  ))-1;

           //TIM_SetCompare2(TIM3,led0pwmval);

           TIM3->CCR2=led0pwmval;

           LED0=!LED0;

           delay_ms(500);
           

        }

    }

库函数



#include "timer.h"

#include "led.h"

#include "usart.h"

 

void TIM3_Int_Init(u16 arr,u16 psc)

{
     
 
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

    

    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//Timer3部分重映射  TIM3_C

    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBRCC_APB2Periph_AFIO,ENABLE); 

 

       //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形  GPIOB.5

    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5; //TIM_CH2

    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;  //复用推挽输出

    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

    GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIO

 

    TIM_TimeBaseStructure.TIM_Period= arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     计数到5000为500ms

    TIM_TimeBaseStructure.TIM_Prescaler=psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  

    TIM_TimeBaseStructure.TIM_ClockDivision= 0; //设置时钟分割:TDTS =Tck_tim

    TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;  //TIM向上计数模式

    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

        //初始化TIM3 Channel2 PWM模式   

    TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能

    TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

    TIM_OC2Init(TIM3,&TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3OC2

    

    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

    

    //TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

 

    TIM_Cmd(TIM3,ENABLE);  //使能TIMx外设
                          
}

如有错误,望各位大神指正!!!

你可能感兴趣的:(嵌入式,单片机)