现在学习使用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"//211uint16_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); //初始化串口1printf("HELLO \r\n"); //串口1 测试重定向PrintfSysTick_Init(72);Timer2_Init();Timer3_PWM_init(2000,719);}
测试视频结果:
STM32 F103C8T6控制舵机视频
测试工程下载:
https://download.csdn.net/download/qq_64257614/88206611?spm=1001.2014.3001.5503