基于舵機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外設
}
如有錯誤,望各位大神指正!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/172775.html
標籤:其他
