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

相关推荐
_落纸3 天前
三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
笔记
Alice-YUE3 天前
【CSS学习笔记3】css特性
前端·css·笔记·html
2303_Alpha3 天前
SpringBoot
笔记·学习
萘柰奈3 天前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
沐矢羽3 天前
Tomcat PUT方法任意写文件漏洞学习
学习·tomcat
好奇龙猫3 天前
日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(10):91-100语法+考え方13
学习
F137298015573 天前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车·51单片机
向阳花开_miemie3 天前
Android音频学习(十八)——混音流程
学习·音视频
小莞尔3 天前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
工大一只猿3 天前
51单片机学习
嵌入式硬件·学习·51单片机