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