1. 程式人生 > >筆記-模擬舵機:基於STM32F103ZET的SG90舵機控制

筆記-模擬舵機:基於STM32F103ZET的SG90舵機控制

寫在前面:筆者是一名小白,如有錯誤,還請及時指正。

1、舵機基本知識

1、SG90舵機是一個模擬舵機,而非數字舵機,這兩者的區別是這樣,數字舵機只要給一個PWM訊號即可,這個訊號是目的地的位置,舵機會自動旋轉到這個位置,而模擬舵機需要一直給予目的角度的PWM訊號。由於舵機需要的PWM訊號實際就是一個方波,所以模擬舵機就是需要不斷的重複發一樣的方波,直到舵機旋轉到指定 的位置,並且如果需要鎖定在這個位置,那麼還需繼續給予這個方波。 

2、廠家技術資料

尺寸:21.5mmX11.8mmX22.7mm
重量:9克
無負載速度:0.12秒/60度(4.8V)
堵轉扭矩:1.2-1.4公斤/釐米(4.8V)
使用溫度:-30~~+60攝氏度
死區設定:7微秒
工作電壓:4.8V-6V

3、PWM控制訊號的要求

頻率:50HZ

佔空比:週期為20ms,根據不同的脈衝寬度(佔空比)舵機會指定轉到不同的角度。

圖稍微有點錯誤:圓圈內分別時-90°,-45°,0°,45°,90°

4、程式

微控制器:STM32F103ZET(144引腳)

時鐘選擇:TIM2、CH3(重對映到PB10)

//==============================================================
//功能描述:Timer2 Channel3初始化,PWM模式
//引數://計數器TOP值,預分頻 (ARR,PSC)
//返回:無
//==============================================================
void TIM2_PWM_Init(u16 period, u16 prescaler)  //計數器TOP值,預分頻 (ARR,PSC)
{
    GPIO_InitTypeDef GPIO_InitStructure; 
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct;
    TIM_OCInitTypeDef TIM_OCInitTypeStruct;
    
    //部分重對映
    GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定時器5時鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
        
    //使能埠PB10
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB PB10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    //初始化TIM2
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2時鐘使能
    TIM_TimeBaseInitTypeStruct.TIM_Period = period;
    TIM_TimeBaseInitTypeStruct.TIM_Prescaler = prescaler;
    TIM_TimeBaseInitTypeStruct.TIM_CounterMode = TIM_CounterMode_Up; //上行計數
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruct); //TIM2初始化
    
    //初始化TIM2 Channel3 PWM2
    TIM_OCInitTypeStruct.TIM_OCMode = TIM_OCMode_PWM2; //CNT>CCR有效
    TIM_OCInitTypeStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitTypeStruct.TIM_OCPolarity = TIM_OCPolarity_Low;  //輸出極性低電平
    TIM_OC3Init(TIM2,&TIM_OCInitTypeStruct);
    
    //使能TIM2 Channel3預裝載暫存器
    TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
    TIM_Cmd(TIM2,ENABLE);
}

int main()
{
    TIM2_PWM_Init(39999,35); //使用定時器2的通道3,PB10
    TIM_SetCompare3(TIM2,3000);//初始化時旋轉角度為0    
    while(1) ;
}

//轉載請註明出處