現(xiàn)在學(xué)習(xí)使用STM32 F103C8T6的定時(shí)器PWM模式,使用PWM驅(qū)動(dòng)舵機(jī)轉(zhuǎn)動(dòng)不同角度,文章提供源碼,測(cè)試工程,測(cè)試動(dòng)態(tài)效果圖。
目錄
基礎(chǔ)原理:
?實(shí)驗(yàn)?zāi)繕?biāo):
測(cè)試視頻結(jié)果:
測(cè)試工程下載:
基礎(chǔ)原理:
這次依舊拿出之前學(xué)習(xí)過的舵機(jī)DS3115,它的基礎(chǔ)原理不多加介紹,在往期講MSP432的文章有所提及:
MSP432自主開發(fā)筆記4:DS3115舵機(jī)的0~180全角度驅(qū)動(dòng)_NULL指向我的博客-CSDN博客
這里直接作總結(jié):
舵機(jī),一般接有三根線,其中倆根是供電使用,還有一根是信號(hào)線
我們需要給信號(hào)線一個(gè)相應(yīng)頻率PWM的信號(hào),讓其知道有控制信號(hào)要到來,然后同時(shí)調(diào)整PWM的占空比即可調(diào)整其旋轉(zhuǎn)角度
需要知道的大致有三個(gè)重要點(diǎn):1、電壓電流?? 2、PWM頻率?? 3、識(shí)別占空比范圍
1.PWM頻率范圍50~330Hz
2.脈寬范圍是500~2500 us
3.精度是3us
4.旋轉(zhuǎn)方向是順時(shí)針
?實(shí)驗(yàn)?zāi)繕?biāo):
使用STM32 C8T6的定時(shí)器3輸出PWM驅(qū)動(dòng)舵機(jī)轉(zhuǎn)動(dòng),從0~180度,緩慢轉(zhuǎn)動(dòng)一周后再次返回0度開始,以此循環(huán)。
下面的代碼是我初始化TIM3的1~3這三個(gè)通道來輸出PWM控制舵機(jī),
?總體流程如下:
1.定義初始化結(jié)構(gòu)體
2.打開APB2等總線的時(shí)鐘,開啟A\B端口
3.配置PWM輸出管腳
4.配置TIM定時(shí)器ARR,PSC等
5.配置PWM模式
void Timer3_PWM_init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//開時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//PWM輸出管腳配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//初始化定時(shí)器(配置定時(shí)器TIM3頻率)
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//PWM模式配置(分通道進(jìn)行配置)
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
#include "main.h"
//211
uint16_t t1,t2,t3;
int main(void)
{
init_ALL(); //初始化所有函數(shù):
t1=150;t2=150;t3=150;
while(1)
{
delay_ms(300);
t1++;
t2++;
t3++;
printf("%d",t1);
//到達(dá)設(shè)定最大角度時(shí)返回到0度
if(t1==263) {t1=150;}
if(t2==263) {t2=150;}
if(t3==263) {t3=150;}
TIM_SetCompare1(TIM3,t1); //設(shè)置舵機(jī)占空比,控制舵機(jī)轉(zhuǎn)動(dòng)
TIM_SetCompare2(TIM3,t2); //設(shè)置舵機(jī)占空比,控制舵機(jī)轉(zhuǎn)動(dòng)
TIM_SetCompare3(TIM3,t3); //設(shè)置舵機(jī)占空比,控制舵機(jī)轉(zhuǎn)動(dòng)
}
}
//初始化所有函數(shù):
void init_ALL(void)
{
Usart1_Init(115200); //初始化串口1
printf("HELLO \r\n"); //串口1 測(cè)試重定向Printf
SysTick_Init(72);
Timer2_Init();
Timer3_PWM_init(2000,719); //初始化定時(shí)器3PWM
}
測(cè)試視頻結(jié)果:
STM32 F103C8T6控制舵機(jī)視頻文章來源:http://www.zghlxwxcb.cn/news/detail-641856.html
測(cè)試工程下載:
https://download.csdn.net/download/qq_64257614/88206611?spm=1001.2014.3001.5503文章來源地址http://www.zghlxwxcb.cn/news/detail-641856.html
到了這里,關(guān)于STM32 F103C8T6學(xué)習(xí)筆記5:定時(shí)器輸出不同占空比PWM驅(qū)動(dòng)舵機(jī)旋轉(zhuǎn)角度的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!