??
????
作者簡介:大家好啊,我叫DW,每天分享一些我新學(xué)到的知識,期待和大家一起進步
??
????
系列專欄:STM32
??
????
??????
??小實驗?zāi)繕?biāo):控制舵機旋轉(zhuǎn)??
??如有寫得不好的地方歡迎大家指正??
創(chuàng)作時間:??????2022年5月2日??????
1. 舵機簡介
在機器人機電控制系統(tǒng)中,舵機控制效果是性能的重要影響因素。舵機可以在微機電系統(tǒng)和航模中作為基本的輸出執(zhí)行機構(gòu),其簡單的控制和輸出使得單片機系統(tǒng)非常容易與之接口。
舵機是一種位置(角度)伺服的驅(qū)動器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。目前在高檔遙控玩具,如航模,包括飛機模型,潛艇模型;遙控機器人中已經(jīng)使用得比較普遍。舵機是一種俗稱,其實是一種伺服馬達。
本次實驗使用的舵機是MG90S。
1.1 舵機控制
舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms范圍內(nèi)的角度控制脈沖部分。以180度角度伺服為例,那么對應(yīng)的控制關(guān)系是這樣的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
因此,我們只需要讓IO口產(chǎn)生相應(yīng)的脈寬就可以控制舵機的角度。如何產(chǎn)生PWM波:11.[STM32]PWM脈寬調(diào)制-呼吸燈
2. 占空比調(diào)節(jié)函數(shù)
PWM占空比的調(diào)節(jié)通過TIM_SetCompare函數(shù)進行相應(yīng)調(diào)節(jié)。通過查找資料,我們可以知道有
TIM_SetCompare1
TIM_SetCompare2
TIM_SetCompare3
TIM_SetCompare4共四個,它們分別可以控制著CH1-CH4的占空比。
函數(shù)原形:
void TIM_SetCompare1(TIM_TypeDef* TIMx, u16 Compare1)
第一個參數(shù)傳入相應(yīng)定時器,本次實驗選擇TIM3的CH1,故選擇TIM_SetCompare1、TIM3。
第二個參數(shù)是捕獲比較 1 寄存器新值,即定時時間。
例如,我們想要控制舵機旋轉(zhuǎn),需要產(chǎn)生周期為20ms的脈沖,其操作如下:
PWM_UserConfig(200-1,7200-1);//50hz 20ms 72000
//72 000 000/7200=10 000 Hz
//10 000*0.020=200
每次進入中斷服務(wù)程序間隔時間為:時間=1/頻率×次數(shù)
重裝載值Period為200,也就是計數(shù)到200產(chǎn)生一個更新事件或者中斷(定時到了)。
計算過程:
時間=1/頻率×次數(shù) ,次數(shù)=時間x頻率=0.020(20ms)x10 000=200
PWM_UserConfig(200-1,7200-1);
那么,我們想要產(chǎn)生1ms的脈寬該如何操作呢?
x=10 000hz*0.001=10,即Compare1=10,就可以實現(xiàn)舵機旋轉(zhuǎn)45°。
TIM_SetCompare1(TIM3,10);
按照這個方法我們可以計算出其他對應(yīng)的角度:
TIM_SetCompare1(TIM3,5);//0°
TIM_SetCompare1(TIM3,10);//45°
TIM_SetCompare1(TIM3,15);//90°
TIM_SetCompare1(TIM3,20);//135°
TIM_SetCompare1(TIM3,25);//180°
3.結(jié)語
今天的分享就到這里,謝謝大家的耐心閱讀,如果覺得有用的話給個??????
??????本章結(jié)束,我們下一章見??????
參考資料:
1.STM32固件庫手冊
2.正點原子STM32不完全手冊_庫函數(shù)版本
3.學(xué)習(xí)視頻鏈接文章來源:http://www.zghlxwxcb.cn/news/detail-414539.html
資料已上傳,需要自取文章來源地址http://www.zghlxwxcb.cn/news/detail-414539.html
附錄:全部程序
//main.c
#include "sys.h"
#include "delay.h"
#include "pwm.h"
int main(void)
{
//u8 flag = 0,time = 0;
delay_init();
PWM_UserConfig(200-1,7200-1);//50hz 20ms 72000
while(1){
TIM_SetCompare1(TIM3,5);//0
delay_ms(500);
TIM_SetCompare1(TIM3,10);//45
delay_ms(500);
// TIM_SetCompare1(TIM3,15);//90
//TIM_SetCompare1(TIM3,20);//135
//TIM_SetCompare1(TIM3,25);//180
//DuoJi();
}
}
//pwm.c
#include "pwm.h"
void PWM_UserConfig(u16 Period,u16 Prescaler){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_InitStructure;
TIM_OCInitTypeDef PWM_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//PA1 TIM2_CH2
GPIO_InitStructure.GPIO_Pin = CH1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//復(fù)用推挽輸出
GPIO_Init(PWM_PROT,&GPIO_InitStructure);
TIM_InitStructure.TIM_Period = Period;
TIM_InitStructure.TIM_Prescaler = Prescaler;
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分割
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計數(shù)
TIM_InitStructure.TIM_RepetitionCounter = DISABLE;//不重復(fù)計數(shù)
TIM_TimeBaseInit(TIM3,&TIM_InitStructure);
TIM_Cmd(TIM3,ENABLE);//開啟全局使能
//PWM配置
PWM_InitStructure.TIM_OCMode = TIM_OCMode_PWM1;
PWM_InitStructure.TIM_OutputState = TIM_OutputState_Enable;//輸出使能
PWM_InitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//輸出極性高
TIM_OC1Init(TIM3,&PWM_InitStructure);//通道幾就選oc幾
TIM_OC1PreloadConfig(TIM3,ENABLE);//預(yù)裝在寄存器
TIM_SetCompare1(TIM3,0);//控制占空比
}
void DuoJi(void){
u16 com[] = {5,10,15,20,25,20,15,10,5};
for(u8 i = 0;i<9;i++){
TIM_SetCompare1(TIM3,com[i]);
delay_ms(500);
}
}
//pwm.h
#ifndef __PWM_H
#define __PWM_H
#include "sys.h"
#include "delay.h"
#define CH1 GPIO_Pin_6
#define PWM_PROT GPIOA
void PWM_UserConfig(u16 Period,u16 Prescaler);
void DuoJi(void);
#endif
到了這里,關(guān)于12.[STM32]PWM脈寬調(diào)制-舵機控制(一篇足以)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!