STM32PWM驱动舵机(制作机械臂基础)

驱动舵机通常需要产生特定频率和占空比的PWM信号,以控制舵机转动到指定的位置。在STM32微控制器中,可以使用其内置的PWM模块来生成这样的信号,从而实现对舵机的精确控制。要在STM32上使用PWM模块来驱动舵机通常需要进行以下步骤:

1.打开RCC时钟 

2.设置时基单元的时钟

3.配置时基单元

4.初始化输出比较单元

5.启动定时器

详细的步骤和配置我写在了下面代码的注释里了,都有的哈。

通过合理配置和控制STM32的PWM模块,可以灵活地对舵机进行驱动和控制,从而在各种应用场景中实现精确的位置控制和运动控制。这种方法在机器人、自动化设备、遥控模型等领域广泛应用。

接线图和程序运视频如下所示:

PWM.c源码如下:

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	//第一步打开RCC时钟  注意TIM2是APB1的外设
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIOstucture;
	GPIOstucture.GPIO_Mode=GPIO_Mode_AF_PP;//改为复用推挽输出 (定时器控制引脚)
	GPIOstucture.GPIO_Pin=GPIO_Pin_1;
	GPIOstucture.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIOstucture);
	
	//第二步设置时基单元的时钟
	TIM_InternalClockConfig(TIM2);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef  TimeStructure;
	TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频
	TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	//CK_PSC=72M    
	TimeStructure.TIM_Period=20000-1;//ARR自动重装器的值 0——65535
	TimeStructure.TIM_Prescaler=72-1;//PSC就是预分频器的值  0——65535
	TimeStructure.TIM_RepetitionCounter = 0;   //重复计数器 高级计数器才有 所以置0
	TIM_TimeBaseInit(TIM2,&TimeStructure);
	
	//第四步初始化输出比较单元
	TIM_OCInitTypeDef  OCstructure;
	//OCstructure的函数很多 我在这只写了几个我们要用的
	//因为有些函数我们不需要用 为了避免影响程序所以不用的函数我们也要设置初始值
	//设置结构体初始值的函数是 TIM_OCStructInit
	TIM_OCStructInit(&OCstructure);
	OCstructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较的模式
	//TIM_OCNPolarity_High有效电平是高电平 PEF有效 输出高电平
	OCstructure.TIM_OCPolarity=TIM_OCPolarity_High ;//设置输出比较的极性 
	OCstructure.TIM_OutputState=TIM_OutputState_Enable ;//设置输出使能  ENABLE使能
    //上面的ARR和PSC 这里的CCR共同决定输出PWM的周期和占空比
	//公式  PWM频率: Freq=CK_PSC/(PSC+1)/(ARR+1)==舵机要求的频率(周期20ms 频率是1/20ms=50hz) CK_PSC=72M
	 //     PWM占空比: Duty=CCR/(ARR+1)  20K对应20ms  CCR 500 就是0.5ms     ARR 20K  PSC  72 
	 //     PWM分辨率: Reso =1/(ARR+1)
	OCstructure.TIM_Pulse=0;//用来设置CCR的
	TIM_OC2Init(TIM2,&OCstructure);
	//使用TIM2的OC1也就是CH1通道 输出PWM 就只能在PA0的引脚上面输出
	

	
	//第五步启动定时器
	TIM_Cmd(TIM2, ENABLE);
}
//使用下面这个函数再运行过程中设置CCR
void PWM_SetCompare2(uint16_t Compare)
{
	TIM_SetCompare2(TIM2, Compare);
}

PWM.h源码如下:

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);
void PWM_SetCompare2(uint16_t Compare);
#endif

Servo.c源码如下:

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Servo_Init(void)
{
    PWM_Init();	
}

//500--2500
//0--180
//500对应0度
//2500对应180度
void Servo_SetAngle(float Angle)
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}	

Servo.h源码如下:

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Servo_Init(void)
{
    PWM_Init();	
}

//500--2500
//0--180
//500对应0度
//2500对应180度
void Servo_SetAngle(float Angle)
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}	

main.c源码如下:

#include "stm32f10x.h"       // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"
 
float Angle;
 
int main(void)
{
	OLED_Init();
	Servo_Init();
	Key_Init();
 
	OLED_ShowString(1,1,"Angle:");
 
	while(1)
	{
		if(Key_GetNum() == 1)
		{
			Angle +=30;
			if(Angle>180)
			{
				Angle = 0;
			}
		}
		Servo_SetAngle(Angle);
		OLED_ShowNum(1,7,Angle,3);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elegent C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值