现在学习使用STM32 F103C8T6的定时器PWM模式,使用PWM驱动舵机转动不同角度,文章提供源码,测试工程,测试动态效果图。
目录
基础原理:
实验目标:
测试视频结果:
测试工程下载:
基础原理:
这次依旧拿出之前学习过的舵机DS3115,它的基础原理不多加介绍,在往期讲MSP432的文章有所提及:
MSP432自主开发笔记4:DS3115舵机的0~180全角度驱动_NULL指向我的博客-CSDN博客
这里直接作总结:
舵机,一般接有三根线,其中俩根是供电使用,还有一根是信号线
我们需要给信号线一个相应频率PWM的信号,让其知道有控制信号要到来,然后同时调整PWM的占空比即可调整其旋转角度
需要知道的大致有三个重要点:1、电压电流 2、PWM频率 3、识别占空比范围
1.PWM频率范围50~330Hz
2.脉宽范围是500~2500 us
3.精度是3us
4.旋转方向是顺时针
实验目标:
使用STM32 C8T6的定时器3输出PWM驱动舵机转动,从0~180度,缓慢转动一周后再次返回0度开始,以此循环。
下面的代码是我初始化TIM3的1~3这三个通道来输出PWM控制舵机,
总体流程如下:
1.定义初始化结构体
2.打开APB2等总线的时钟,开启A\B端口
3.配置PWM输出管脚
4.配置TIM定时器ARR,PSC等
5.配置PWM模式
void Timer3_PWM_init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//开时钟
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);
//初始化定时器(配置定时器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模式配置(分通道进行配置)
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(); //初始化所有函数:
t1=150;t2=150;t3=150;
while(1)
{
delay_ms(300);
t1++;
t2++;
t3++;
printf("%d",t1);
//到达设定最大角度时返回到0度
if(t1==263) {t1=150;}
if(t2==263) {t2=150;}
if(t3==263) {t3=150;}
TIM_SetCompare1(TIM3,t1); //设置舵机占空比,控制舵机转动
TIM_SetCompare2(TIM3,t2); //设置舵机占空比,控制舵机转动
TIM_SetCompare3(TIM3,t3); //设置舵机占空比,控制舵机转动
}
}
//初始化所有函数:
void init_ALL(void)
{
Usart1_Init(115200); //初始化串口1
printf("HELLO \r\n"); //串口1 测试重定向Printf
SysTick_Init(72);
Timer2_Init();
Timer3_PWM_init(2000,719); //初始化定时器3PWM
}
测试视频结果:
STM32 F103C8T6控制舵机视频文章来源:https://www.toymoban.com/news/detail-641856.html
测试工程下载:
https://download.csdn.net/download/qq_64257614/88206611?spm=1001.2014.3001.5503文章来源地址https://www.toymoban.com/news/detail-641856.html
到了这里,关于STM32 F103C8T6学习笔记5:定时器输出不同占空比PWM驱动舵机旋转角度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!