STM32 F103C8T6学习笔记5:定时器输出不同占空比PWM驱动舵机旋转角度

现在学习使用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模式

cpp 复制代码
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); 
}
cpp 复制代码
#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);
		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);
	
}

测试视频结果:

STM32 F103C8T6控制舵机视频

测试工程下载:

https://download.csdn.net/download/qq_64257614/88206611?spm=1001.2014.3001.5503

相关推荐
问心无愧05132 小时前
ctf show web 入门39
android·前端·笔记
Yeh2020582 小时前
Mybatis笔记一
java·笔记·mybatis
羊群智妍3 小时前
2026 AI搜索优化技术:GEO监测工具选型与应用
笔记
wuxinyan1233 小时前
工业级大模型学习之路011:RAG 零基础入门教程(第七篇):查询优化技术
人工智能·学习·rag
chen_ever3 小时前
大模型学习规划
人工智能·python·学习
山西瀚辰信安科技有限公司3 小时前
git下载安装及使用
git·学习
半导体守望者3 小时前
MKS elite 300 600 750W RF Plasma Generator 射频电源 OPERATIONMANUAL
经验分享·笔记·机器人·自动化·制造
05候补工程师3 小时前
【线性代数笔记】初等变换、正交化与特殊矩阵性质核心总结
经验分享·笔记·线性代数·考研·矩阵
暗夜猎手-大魔王3 小时前
OpenAI API 协议学习
人工智能·学习
It's Q3 小时前
SKILL学习总结
学习