STM32控制舵機(多個舵機、附代碼)
1、基本介紹
2、代碼
#include "bsp_servo.h"
void Servo_PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;//定義定時器結構體變數
TIM_OCInitTypeDef TIM_OCInitStructure;//定義輸出比較結構體變數
GPIO_InitTypeDef GPIO_InitStructure;//定義GPIO結構體變數
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB時鐘使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能復用時鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//配置GPIO引腳
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置GPIO速率
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//配置GPIO為復用推挽輸出
GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIO初始化函式
TIM_TimeBaseStruct.TIM_Period=9999;//設定自動重裝載的周期值,計算方法多了
TIM_TimeBaseStruct.TIM_Prescaler=143;//設定預分頻系數
TIM_TimeBaseStruct.TIM_ClockDivision=0;//設定時鐘分割,0同TIM_CKD_DIV1
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上計數模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);//定時器初始化函式
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM模式1
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//輸出比較極性高
//多舵機,怎么控制,當然是同一個定時器下的4個通道了,所以,下面的8句就很重要,
TIM_OC1Init(TIM4,&TIM_OCInitStructure);//比較輸出初始化函式,通道1
TIM_OC2Init(TIM4,&TIM_OCInitStructure);//比較輸出初始化函式,通道2
TIM_OC3Init(TIM4,&TIM_OCInitStructure);//比較輸出初始化函式,通道3
TIM_OC4Init(TIM4,&TIM_OCInitStructure);//比較輸出初始化函式,通道4
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //輸出比較1預裝載暫存器使能
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);//輸出比較2預裝載暫存器使能
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);//輸出比較3預裝載暫存器使能
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);//輸出比較4預裝載暫存器使能
TIM_Cmd(TIM4,ENABLE);//TIM4使能,忘了就前功盡棄了
}
頭檔案
#ifndef __SERVO_H
#define __SERVO_H
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
void Servo_PWM_Init(void);
#endif
最后,最關鍵的來了,如何使用呢?當然是一句函式了,修改定時器下某一個通道的函式,TIM_SetCompare1(TIM4, 500); 注意:修改哪一個通道的占空比,就要把那個數字1修改為幾,
main函式中呼叫
int main()
{
/*初始化此處省略*/
while(1)
{
TIM_SetCompare1(TIM4,400);//時間到關閉
delay_ms(500);//此處就看你舵機性能了,連續動作時,如果能反應過來,就不用加延時了,自己實踐找規律吧,
TIM_SetCompare1(TIM4,1000);//時間到關閉
delay_ms(500);
//其它舵機也是一樣的,TIM_SetCompareX(TIM4,Compare);//時間到關閉
}
}
3、備注
關于不同占空比,對應舵機的角度,這個自己探索吧,計算也很好理解,

4、如果有錯誤,請大家積極指出,多謝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226299.html
標籤:其他
上一篇:Ubuntu安裝ROS系統
