STM32单片机(六)TIM定时器 -> 第四节:TIM输出比较练习(PWM驱动LED呼吸灯、PWM驱动舵机以及PWM驱动直流电机)

news2024/7/4 23:14:50

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf

链接里压缩包的解压密码:32

本大节主要学习TIM定时器的相关知识,包含八小节:
第一小节主要学习定时器基本定时的功能,第二小节是对第一小节的内容写两个程序进行练习,分别是定时器定时中断和定时器外部时钟;
第三小节主要学习定时器输出比较的功能,第四小节是对第三小节的内容写三个程序进行练习,分别是PWM驱动LED呼吸灯、PWM驱动舵机以及PWM驱动直流电机;
第五小节主要学习定时器输入捕获的功能,第六小节是对第五小节的内容写两个程序进行练习,分别是输入捕获模式测频率和PWMI模式测频率占空比;
第七小节主要学习定时器的编码器接口功能,第八小节是对第七小节的内容写一个程序进行练习,即编码器接口测速;
最终附上所有的源代码;

本小节是对第三小节TIM输出比较的内容写三个程序进行练习,分别是PWM驱动LED呼吸灯、PWM驱动舵机以及PWM驱动直流电机;也就是使用STM32输出PWM波形,来驱动舵机和直流电机;

文章目录

  • 一、本节目标
    • 目标1:PWM驱动LED呼吸灯
    • 目标2:PWM驱动舵机
    • 目标3:PWM驱动直流电机
  • 二、示例1:PWM驱动LED呼吸灯
    • 2.1 接线图
    • 2.2 程序源码
  • 三、示例2:PWM驱动舵机
    • 3.1 接线图
    • 3.2 程序源码
  • 四、示例3:PWM驱动直流电机
    • 4.1 接线图
    • 4.2 程序源码

一、本节目标

目标1:PWM驱动LED呼吸灯

现象:LED灯不断变换亮度,实现一个呼吸灯的效果

在这里插入图片描述

目标2:PWM驱动舵机

现象:每按下一次按键,舵机输出轴的角度就变化一次,另外OLED上也显示当前的角度;

在这里插入图片描述

目标3:PWM驱动直流电机

OLED显示当前电机的速度值,按下按键,电机速度由0变为20,再按一下变为40;以此类推,等加到一百后,电机转速达到正向的最大值;如果继续按,则速度变为-100,即反向的最大值,再按,-80,再按-60,以此类推,直到0,电机停止;

在这里插入图片描述

二、示例1:PWM驱动LED呼吸灯

2.1 接线图

在这里插入图片描述
这里的LED,我们采用的是正极接在PA0引脚,负极接在GND的驱动方法,这样就是高电平点亮,低电平熄灭; 这种方法观察更直接一些,即占空比越大,LED越亮,占空比越小,LED就越暗;

实物图如下:

在这里插入图片描述

2.2 程序源码

代码路径:

  • STM32入门教程资料\程序源码\STM32Project\6-3 PWM驱动LED呼吸灯\User
  • STM32入门教程资料\程序源码\STM32Project\6-3 PWM驱动LED呼吸灯\Hardware

具体代码:

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

uint8_t i;

int main(void)
{
	OLED_Init();
	PWM_Init();
	
	while (1)
	{
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(i);
			Delay_ms(10);
		}
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(100 - i);
			Delay_ms(10);
		}
	}
}

pwm.c

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//给输出比较结构体赋一个默认值
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);//配置输出比较模块OC1,选择TIM2定时器;
	
	TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);//用来单独更改CCR寄存器的值
}

代码解释:

整个开启PWM的流程也就是参考下图的流程:

在这里插入图片描述

  • 第一步:RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟都打开;
  • 第二步:配置时基单元,包括前面的时钟源选择和时基单元都配置好
  • 第三步:配置输出比较单元,包括CCR的值、输出比较模式、极性选择、输出使能这些参数,在库函数里也都是用结构体来统一配置的
  • 第四步,配置GPIO,把PWM对应的GPIO口,初始化为复用推挽输出的配置

具体每一步,及具体代码的解释,请参照代码中的注释。

三、示例2:PWM驱动舵机

3.1 接线图

在这里插入图片描述
第一个,黑线,GND,接在面包板的GND;第二个,红线,5V正极,接5V的电机电源,不要接面包板正极,面包板正极只有3.3V,带不动电机的;所以接在了STLINK的5V输出引脚;第三个,橙色线,PWM信号,接在PA1引脚;最后再在PB1接一个按键,用来控制舵机;

实物接线图如下:

在这里插入图片描述

3.2 程序源码

代码路径:

  • STM32入门教程资料\程序源码\STM32Project\6-4 PWM驱动舵机\User
  • STM32入门教程资料\程序源码\STM32Project\6-4 PWM驱动舵机\Hardware

具体代码:

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

uint8_t KeyNum;
float Angle;

int main(void)
{
	OLED_Init();
	Servo_Init();
	Key_Init();
	
	OLED_ShowString(1, 1, "Angle:");
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			Angle += 30;
			if (Angle > 180)
			{
				Angle = 0;
			}
		}
		Servo_SetAngle(Angle);
		OLED_ShowNum(1, 7, Angle, 3);
	}
}

Sero.c

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

void Servo_Init(void)
{
	PWM_Init();
}

void Servo_SetAngle(float Angle)
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}

四、示例3:PWM驱动直流电机

4.1 接线图

在这里插入图片描述

  • 红色的是TB6612电机驱动模块,第一个引脚VM,电机电源,同样的也是接在STLINK的5V引脚;第二个VCC,逻辑电源,接在面包板3.3V正极;第三个GNC,电源负极,接在面板吧的负极;之后AO1、AO2,电机输出端,接电机的两根线;STBY,待机控制脚,不需要待机,直接接逻辑电源正3.3V;剩下的三个是控制引脚,AIN1和AIN2是方向控制,任意接两个GPIO就行,这里我们接的是PA4和PA5两个脚;最后一个PWMA是速度控制,需要接PWM的输出脚,这里我们接在了PA2这个引脚;

硬件接线图如下:

在这里插入图片描述

4.2 程序源码

代码路径:

  • STM32入门教程资料\程序源码\STM32Project\6-5 PWM驱动直流电机\User
  • STM32入门教程资料\程序源码\STM32Project\6-5 PWM驱动直流电机\Hardware

具体代码:

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

uint8_t KeyNum;
int8_t Speed;

int main(void)
{
	OLED_Init();
	Motor_Init();
	Key_Init();
	
	OLED_ShowString(1, 1, "Speed:");
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			Speed += 20;
			if (Speed > 100)
			{
				Speed = -100;
			}
		}
		Motor_SetSpeed(Speed);
		OLED_ShowSignedNum(1, 7, Speed, 3);
	}
}

Motor.c

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

void Motor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	PWM_Init();
}

void Motor_SetSpeed(int8_t Speed)
{
	if (Speed >= 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_4);
		GPIO_ResetBits(GPIOA, GPIO_Pin_5);
		PWM_SetCompare3(Speed);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_4);
		GPIO_SetBits(GPIOA, GPIO_Pin_5);
		PWM_SetCompare3(-Speed);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS查缺补漏之如何优雅解决margin垂直方向塌陷与合并问题?

一&#xff1a;父子元素之间margin垂直方向塌陷问题 在处理margin垂直方向问题时&#xff0c;经常会遇到在给子元素设置margin时&#xff0c;导致效果出现在了父元素上&#xff1b;如下代码所示&#xff1a; 代码原义是想实现三方面&#xff1a; ① 将box1的margin-top调为5…

从实现到原理,总结11种延迟任务的实现方式(上)

1 前言 延迟任务在我们日常生活中比较常见&#xff0c;比如订单支付超时取消订单功能&#xff0c;又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式&#xff0c;这些方式并没有绝对的好坏之分&#xff0c;只是适用场景的不大相同。…

高频前端React面试题汇总

近期整理了一下高频的前端面试题&#xff0c;分享给大家一起来学习。如有问题&#xff0c;欢迎指正&#xff01; 一、组件基础 1. React 事件机制 <div onClick{this.handleClick.bind(this)}>点我</div>React并不是将click事件绑定到了div的真实DOM上&#xff0…

ChatGPT+Mermaid自然语言流程图形化产出小试 | 京东云技术团队

ChatGPTMermaid语言实现技术概念可视化 本文旨在介绍如何使用ChatGPT和Mermaid语言生成流程图的技术。在现代软件开发中&#xff0c;流程图是一种重要的工具&#xff0c;用于可视化和呈现各种流程和结构。结合ChatGPT的自然语言处理能力和Mermaid的简单语法&#xff0c;可以轻…

【北邮国院大三下】Intellectual Property Law 知识产权基础 Week3

北邮国院大三电商在读&#xff0c;随课程进行整理知识点。仅整理PPT和相关法条中相对重要的知识点&#xff0c;个人认为相对不重要的细小的知识点不列在其中。如有错误请指出。转载请注明出处&#xff0c;祝您学习愉快。 如需要pdf格式的文件请私信联系或微信联系 本Week的主…

供应链|多期库存系统中具有销售损失的最优联合补货和转运策略

封面图来源&#xff1a; https://www.pexels.com/photo/aerial-shot-of-cargo-ship-on-sea-3840441/ 作者&#xff1a;Hossein Abouee-Mehrizi, Oded Berman, Shrutivandana Sharma 引用&#xff1a;Abouee-Mehrizi, H., Berman, O., & Sharma, S. (2015). Optimal joint r…

马原第三章复习2.生产力和生产关系

目录 社会基本矛盾和运动规律 社会基本矛盾和运动规律 这两个问题是最重点 生产力和生产关系 经济基础和上层建筑 生产力和生产关系 生产力是生产的能力 生产力是人类在实践中形成的改造自然使其适应自然的能力 生产力包含两个重要的要素:三要素 劳动

年化收益 21%:lightGBM的WFA滚动训练,使用qlib的alpha158因子集

原创文章第242篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑与投资"。 开始之前&#xff0c;先说说感受。 把整个框架与思路都在社群里开源出来&#xff0c;就是希望大家看懂思路&#xff0c;而不是拿一两个策略。说实话&#xff0c;投资哪有这种高确定性的“…

通义听悟上线,强大的视频会议和学习直播分析能力,人工智能如何改变我们的生活和工作方式?

什么是通义听悟 通义听悟已开启公测&#xff0c;公测期&#xff08;2023年6月1日至30日&#xff09;用户可体验所有AI功能&#xff0c;含全文概要、章节速览、发言总结等高阶AI功能&#xff0c;通过阿里云主账号登录。 官方给的应用场景&#xff1a; 1、实时会议记录&#x…

4.MySQL表的增删改查(进阶)

文章目录 &#x1f36f;1. 数据库约束&#x1f36f;&#x1f34e;1.1 约束类型&#x1f34e;&#x1f34f;1.2 NULL约束&#x1f34f;&#x1f34a;1.3 UNIQUE&#xff1a;唯一约束&#x1f34a;&#x1f34b;1.4 DEFAULT&#xff1a;默认值约束&#x1f34b;&#x1f352;1.5 …

MySQL数据库语言三、DCL语句

&#x1f618;作者简介&#xff1a;正在努力的99年公司职员。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;…

绩效管理的本质是激发员工,而不是扣工资!

绩效管理是企业管理中非常重要的一个环节&#xff0c;通过对员工表现进行评估和奖励&#xff0c;可以提高整个团队的士气和生产力。 然而&#xff0c;在实际操作中&#xff0c;有些企业却将绩效管理变成了惩罚员工的手段&#xff0c;甚至使用绩效扣除员工的薪水。这种做法不仅…

VALSE 2023:版面分析技术如何赋能生产生活?

目录 0 写在前面1 文档版面分析2 版面元素检测3 文档排版引擎总结 0 写在前面 VALSE年度研讨会旨在为中国青年学者在计算机视觉、图像处理、模式识别与机器学习研究领域提供一个具有深度的学术交流平台。VALSE秉持理性批判、勇于探索、实证和创新等科学精神&#xff0c;倡导自…

光伏电池建模及温度光照的影响曲线

光伏电池建模及温度光照的影响MATLAB程序及仿真资源-CSDN文库https://download.csdn.net/download/weixin_56691527/87910193模型介绍&#xff1a; 需要MATLAB2018B及以上的版本&#xff01;&#xff01; 首先根据根据环境修正公式搭建光伏电池仿真模型&#xff1a; 温度变化…

传统机器学习算法解析(opencv实现)

前言 文本主要解析在传统机器学习当中一些小的算法与思想&#xff0c;只是传统机器学习算法当中的一小部分&#xff0c;更多传统机器学习算法可参考我的另外几篇博客 链接1: PCA主成分分析 链接2: Canny边缘检测算法 链接3: K-Means聚类算法 链接4: SIFT算法分析 1. opencv …

MMDeploy安装和pth转ONNX

参考&#xff1a; https://github.com/open-mmlab/mmdeploy/blob/main/README_zh-CN.md MMDeploy安装指导 MMDeploy 是 OpenMMLab 模型部署工具箱&#xff0c;为各算法库提供统一的部署体验。基于 MMDeploy&#xff0c;开发者可以轻松从训练 repo 生成指定硬件所需 SDK&#…

0x80080005 windows更新失败导致的net framework3.5安装失败

缘起 客户安装应用软件提示需要安装net framework3.5 sp1,但是下载了net framework的安装包后一直提示正在下载中&#xff0c;后来发现系统的windows更新功能都用不了&#xff0c;真的是坑啊。 解决方案 按Windows按键&#xff08;田字按键&#xff09;X&#xff0c;选择Powe…

2023-6-15-第六式适配器模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

如何通过java程序获取表的自增主键值?

获取自增主键&#xff1a; 在 Java 程序中&#xff0c;使用 JDBC 插入记录到 MySQL 数据库时&#xff0c;可以通过以下步骤获取自增主键的值&#xff1a; 第一步&#xff1a;在 PreparedStatement 对象中添加 Statement.RETURN_GENERATED_KEYS 常量作为参数&#xff0c;表示希…

Zabbix与信创、云原生、高可用等热点解析|Zabbix大会·上海站

根据信通院调研显示&#xff0c;超过90%的中国金融机构已经引入开源软件。工信部突出强调开源在驱动软件产业发展的重要作用。作为一个完全开源免费的企业级监控解决方案&#xff0c;Zabbix在IT基础监控、网络监控、Server监控和云监控等领域都获得了同行和用户极高的评价。 Za…