STM32F103C8T6 实现舵机与电机的控制 2个定时器输出不同频率的PWM

本文介绍了一个使用STM32微控制器通过PWM控制舵机和电机的项目。作者在实践中发现,由于不同设备对PWM信号的需求不同,需要使用两个不同的时钟频率。于是,他们使用TIM2和TIM3分别配置为50Hz(舵机)和更高频率(电机),实现了舵机角度调整和电机速度控制。此外,还计划添加呼吸灯功能,并邀请读者分享更好的实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

智能小家居------舵机开门,电机做风扇 or 拉窗帘、呼吸灯做提示,小OLED屏幕显示当前状态。

在这里插入图片描述

直接上代码

背景:我觉得我看了那么多教程了,然而只会玩单个东西,串起来就不太懂。
本项目的代码部分实现用到了2个时钟,TIM2 和 TIM3。
经历的问题:原本我是想只用一个时钟,不同通道来实现PWM的输出,但是我发现 我如果把TIM_TimeBaseInitStructure.TIM_Period = ARR ; //ARR 自动重装器的值
ARR = 20000 -1 时,只能驱动舵机,不能驱动电机。
ARR = 100 -1 时,只能驱动电机,不能驱动舵机。
后来发现: SG90舵机接收的PWM信号频率为50HZ,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。
解决方案:所以后来使用了2个时钟,分别输出上面这2个ARR的PWM。
明天准备再加一个呼吸灯功能
如果你有更好的方案,可以留言或者私信我哦,我们可以交流交流哈哈哈,一起进步呀。

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "Servo.h"
#include "PWM.h"
#include "Motor.h"

extern void Motor_Set_Dir(int8_t Speed);
extern void Exti_Test_Pull_Level_Set(void);
//extern void PWM_SetCompare3(uint16_t Compare);

uint8_t i,KeyNum;

int main(void)
{
   
	Key_Init();
	OLED_Init();
	Servo_Init();
	Motor_Init();
	
	OLED_ShowString(1,1,"Angle:");
	OLED_ShowString(2,1,"KeyNum:");
	OLED_ShowString(3,1,"Speed:");
	
	Servo_Set_Angle(0);//设置舵机初始角度
	while (1)
	{
   		
		KeyNum = Key_GetNum();
		Servo_Turn(KeyNum);
		Motor_Speed_Set(KeyNum);
	}
}

pwm.h

#ifndef __PWM_H
#define __PWM_H

#include "stm32f10x.h"                  // Device header

void Servo_PWM_Init
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KevinGuo457

哈哈哈资助我买两包辣条叭

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

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

打赏作者

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

抵扣说明:

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

余额充值