05:【江科大stm32】:定时器输出比较功能(PWM)

news2024/12/22 14:24:53

定时器输出比较功能(PWM)

  • 1、LED呼吸灯
  • 2、PWM驱动舵机
  • 3、PWM驱动电机

在这里插入图片描述
在这里插入图片描述

1、LED呼吸灯

①PWM.c文件的代码如下:

#include "stm32f10x.h"                  // Device header

/*
	使用定时器TIM2,通过通道CH1(PA0)输出PWM波
*/
void PWM_Init(void)
{
	//1.使能时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//2.选择内部时钟
	TIM_InternalClockConfig(TIM2);
	
	//3.对时基单元进行配置
	TIM_TimeBaseInitTypeDef TIM_TimeInitStruct;
	TIM_TimeInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源分频
	TIM_TimeInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeInitStruct.TIM_Period = 100 - 1;//计数器
	TIM_TimeInitStruct.TIM_Prescaler = 7200 - 1;//预分频器
	TIM_TimeInitStruct.TIM_RepetitionCounter = 0;//重复计数器
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeInitStruct);
	
	//4.对输出比较单元进行配置
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);//给结构体默认初始值
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//选择PWM1模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//选择正极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//通道使能
	TIM_OCInitStruct.TIM_Pulse = 0;//CCR的初始值
	
	TIM_OC1Init(TIM2, &TIM_OCInitStruct);
	
	//5.配置CH1通道对应的引脚PA0
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//6.使能定时器
	TIM_Cmd(TIM2,ENABLE);
}

②PWM.h文件的代码如下:

#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h"                  // Device header

void PWM_Init(void);

#endif

③主程序文件的代码如下:

/*
	LED呼吸灯,LED正极接PA0引脚,负极接GND。
*/

#include "stm32f10x.h"                 
#include "PWM.h"
#include "Delay.h"

uint16_t i;
int main(void)
{
	PWM_Init();
	
	while(1)
	{
		for(i = 0;i <= 100 ;i++)
		{
			TIM_SetCompare1(TIM2,i);//改变CH1通道的CCR的值
			Delay_ms(10);
		}
		
		for(i = 0;i <= 100 ;i++)
		{
			TIM_SetCompare1(TIM2,100 - i);
			Delay_ms(10);
		}
	}
}	

2、PWM驱动舵机

在这里插入图片描述
①PWM.c文件的代码如下:

#include "stm32f10x.h"                  // Device header

/*
	使用定时器TIM2,通过通道CH1(PA0)输出PWM波
*/
void PWM_Init(void)
{
	//1.使能时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//2.选择内部时钟
	TIM_InternalClockConfig(TIM2);
	
	//3.对时基单元进行配置
	TIM_TimeBaseInitTypeDef TIM_TimeInitStruct;
	TIM_TimeInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源分频
	TIM_TimeInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeInitStruct.TIM_Period = 20000 - 1;//计数器,周期为20ms
	TIM_TimeInitStruct.TIM_Prescaler = 72 - 1;//预分频器,分辨率为0.001ms 
	TIM_TimeInitStruct.TIM_RepetitionCounter = 0;//重复计数器
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeInitStruct);
	
	//4.对输出比较单元进行配置
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);//给结构体默认初始值
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//选择PWM1模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//选择正极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//通道使能
	TIM_OCInitStruct.TIM_Pulse = 0;//CCR的初始值
	
	TIM_OC1Init(TIM2, &TIM_OCInitStruct);
	
	//5.配置CH1通道对应的引脚PA0
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//6.使能定时器
	TIM_Cmd(TIM2,ENABLE);
}

②PWM.h文件的代码如下:

#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h"                  // Device header

void PWM_Init(void);

#endif

③Servo.c文件的代码如下:

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

void Servo_Init(void)
{
	PWM_Init();
}
/*
	  角度—— CCR

		 0度 --- 500
		45度 --- 1000
	  90度 --- 1500
	 135度 --- 2000
	 180度 --- 2500
*/

void Set_Angle(float Angle)
{
	uint16_t compare = Angle / 180 * 2000 + 500;
	TIM_SetCompare1(TIM2,compare);
}

④Servo.h文件的代码如下:

#ifndef __Servo_H
#define __Servo_H
#include "stm32f10x.h"                  // Device header

void Servo_Init(void);
void Set_Angle(float Angle);

#endif

⑤主程序文件的代码如下:

/*
	PWM驱动舵机,通过按键改变PWM的占空比
*/

#include "stm32f10x.h" 
#include "OLED.h"
#include "Key.h"
#include "Servo.h"

float Angle = 0;
int main(void)
{
	OLED_Init();
	OLED_Clear();
	Servo_Init();
	Key_Init();
	OLED_ShowString(1,1,"Angle:");
	while(1)
	{	
		if(Key_Num() == 1)//按键按下
		{
			Angle += 30;
			if(Angle > 180)
			{
				Angle = 0;	
			}
		Set_Angle(Angle);
		OLED_ShowNum(1,7,Angle,3);
		}
	}
}	

3、PWM驱动电机

使用的是TB6612模块驱动电机。
在这里插入图片描述

PWM.c文件代码如下:

#include "stm32f10x.h"                  // Device header

/*
	使用定时器TIM2,通过通道CH1(PA0)输出PWM波
*/
void PWM_Init(void)
{
	//1.使能时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//2.选择内部时钟
	TIM_InternalClockConfig(TIM2);
	
	//3.对时基单元进行配置
	TIM_TimeBaseInitTypeDef TIM_TimeInitStruct;
	TIM_TimeInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源分频
	TIM_TimeInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeInitStruct.TIM_Period = 100 - 1;//计数器,周期为20ms
	TIM_TimeInitStruct.TIM_Prescaler = 36 - 1;//预分频器
	TIM_TimeInitStruct.TIM_RepetitionCounter = 0;//重复计数器
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeInitStruct);
	
	//4.对输出比较单元进行配置
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);//给结构体默认初始值
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//选择PWM1模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//选择正极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//通道使能
	TIM_OCInitStruct.TIM_Pulse = 0;//CCR的初始值
	
	TIM_OC1Init(TIM2, &TIM_OCInitStruct);
	
	//5.配置CH1通道对应的引脚PA0
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//6.使能定时器
	TIM_Cmd(TIM2,ENABLE);
}

②Motor.c文件代码如下:

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


void Motor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//AIN1和AIN2引脚
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	PWM_Init();
}

void Motor_SetSpeed(int8_t Speed)
{
	if(Speed > 0)//正转
	{
		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
		GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_SET);
		TIM_SetCompare1(TIM2,Speed);
	}
	if(Speed == 0)
	{
		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
		GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);
		TIM_SetCompare1(TIM2,Speed);
	}
	if(Speed < 0)
	{
		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
		GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);
		TIM_SetCompare1(TIM2,-Speed);
	}
}

③Motor.h文件代码如下:

#ifndef __Motor_H
#define __Motor_H
#include "stm32f10x.h"                  // Device header

void Motor_Init(void);
void Motor_SetSpeed(int8_t Speed);

#endif

④主程序文件代码如下:

/*
	PWM驱动电机,通过按键改变PWM的占空比
*/

#include "stm32f10x.h" 
#include "OLED.h"
#include "Key.h"
#include "Motor.h"

int8_t Speed = 0;
int main(void)
{
	OLED_Init();
	OLED_Clear();
	Motor_Init();
	Key_Init();
	OLED_ShowString(1,1,"Speed:");

	while(1)
	{	
		if(Key_Num() == 1)//按键按下
		{
			Speed += 20;
			if(Speed > 100)
			{
				Speed = -100;	
			}
			Motor_SetSpeed(Speed);
		}
		OLED_ShowSignedNum(1,7,Speed,3);
	}
}	

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

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

相关文章

模型 PMI思考法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。全面评估&#xff0c;三思而后行。 1 PMI思考法的应用 1.1 个人职业发展中的PMI思考法应用 张华是一位有志于提升自己职业竞争力的职场人士。他正在考虑报名参加一个专业认证课程&#xff0c;以期提…

Windows安装Ora2Pg(迁移表结构,表数据)

版本&#xff1a; windows server 2012 R2 oracle 12 说明&#xff1a; 目前该操作是在安装了oracle的机子上做的。 1、安装perl Strawberry Perl下载地址&#xff1a; Strawberry Perl for Windows - Releases 选择一个合适的版本&#xff0c;下载下来之后只需要选择…

百度广告联盟:抢占流量蓝海,精准营销新引擎

百度广告联盟&#xff1a;抢占流量蓝海&#xff0c;精准营销新引擎 在数字营销时代&#xff0c;争夺消费者的注意力与流量成为品牌竞争的关键。百度广告联盟&#xff0c;作为互联网营销领域的佼佼者&#xff0c;凭借其广泛的平台覆盖、精准的受众定位以及丰厚的合作回报…

水稻病害-目标检测数据集(包括VOC格式、YOLO格式)

水稻病害-目标检测数据集&#xff08;包括VOC格式、YOLO格式 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1eiygobnVJklOdgyCwb2RVg?pwdvsoc 提取码&#xff1a;vsoc 数据集信息介绍&#xff1a; 共有 2148 张图像和一一对应的标注文件 标注文件格式提供了…

《深入浅出WPF》读书笔记.8路由事件

《深入浅出WPF》读书笔记.8路由事件 背景 路由事件是直接响应事件的变种。直接响应事件&#xff0c;事件触发者和事件响应者必须显示订阅。而路由事件的触发者和事件响应者之间的没有显示订阅&#xff0c;事件触发后&#xff0c;事件响应者安装事件监听器&#xff0c;当事件传…

MySQL EXPLAIN 完全解读

MySQL EXPLAIN 完全解读 一、一个EXPLAIN简单执行二、简单了解2.1. id&#xff1a;查询的标识符。2.2. select_type&#xff1a;查询的类型。2.3. table&#xff1a;输出结果集的表。2.4. type&#xff1a;连接类型&#xff0c;这是MySQL决定如何查找表中行的方法。2.5. possib…

学习之数据库相关概念

数据库相关概念 主流的关系型数据库管理系统&#xff1a;

HIVE 数据仓库工具之第一部分(讲解部署)

HIVE 数据仓库工具 一、Hive 概述1.1 Hive 是什么1.2 Hive 产生的背景1.3 Hive 优缺点1.3.1 Hive的优点1.3.2 Hive 的缺点 1.4 Hive在Hadoop生态系统中的位置1.5 Hive 和 Hadoop的关心 二、Hive 原理及架构2.1 Hive 的设计原理2.2 Hive 特点2.3 Hive的体现结构2.4 Hive的运行机…

数据集的使用

一、 Transform与dataset数据集的使用 import torchvisionfrom torch.utils.tensorboard import SummaryWriterdataset_transform torchvision.transforms.Compose([torchvision.transforms.ToTensor()])train_set torchvision.datasets.CIFAR10(root "./dataset"…

《中文Python穿云箭量化平台二次开发技术03》利用Tkinter高级模块设计自己策略代码编辑器及策略运行窗口

《中文Python穿云箭量化平台》是纯Python开发的量化平台&#xff0c;因此其中很多Python模块&#xff0c;我们可以自己设计新的量化工具&#xff0c;例如自己新的行情软件、新的量化平台、以及各种量化研究工具。 穿云箭自带指标公式源码运行模块&#xff0c;可以为其他量化平台…

基于云原生的一体化监控系统Day1

7.1 监控体系部署管理 7.2k8s集群层面监控 准备&#xff1a;部署k8s集群 master&#xff1a;192.168.192.128 node01&#xff1a;192.168.192.129 node02&#xff1a;192.168.192.130 1.prometheus架构&#xff1a; prometheus工作原理&#xff1a; 1.数据采集&#xff…

AI视频平台精选:国内外对比与推荐

原文&#xff1a;AI视频平台精选&#xff1a;国内外对比与推荐 国内外有多个平台可以生成AI视频&#xff0c;这些平台各有其独特的优点和缺点。以下是对一些主要平台的详细介绍&#xff0c;包括它们的优缺点&#xff0c;以及针对个人和自媒体用户的推荐。 国内平台 1. 快手可…

为Windows Terminal 配置zsh + Oh-My-Zsh

参考&#xff1a; 为Windows Terminal 配置zsh Oh-My-Zsh 【核心】https://juejin.cn/post/7229507721795993661 https://blog.cloudorz.com/post/configure-zsh-for-windows-terminal/ https://zhuanlan.zhihu.com/p/455925403 本文以 Git Bash 终端为基础&#xff0c;来…

android openGL ES详解——剔除

一、正面剔除 在绘制3D场景的时候,我们需要决定哪些部分是对观察者 可见的,或者哪些部分是对观察者不可⻅的.对于不可见的部分,应该及早丢弃.例如在⼀个不透明的墙壁后,就不应该渲染.这种情况叫做”隐藏⾯消除”(Hidden surface elimination). 立方体中的正背面 任何物体都有…

Vue 项目中使用路由鉴权实现网页进度条

概述 在 Web 开发中&#xff0c;用户界面的流畅性和交互性对用户体验至关重要。为了在页面跳转时给用户提供反馈&#xff0c;我们可以利用 NProgress 这样的第三方库来实现一个进度条。本文档将指导您如何在 Vue 项目中结合路由鉴权来实现这一功能。 准备工作 确保您已经安装…

YOLO后处理trick - 减少nms的计算次数、比较次数和空间消耗

目录 前言 1.问题分析 问题1&#xff1a;排序问题 问题2&#xff1a;极大值抑制问题 2.优化比较和计算次数 优化1&#xff1a;跳过reshape直接置信度筛选 优化2&#xff1a;减少用于nms的bbox数 3.举个荔枝 总结 前言 减少YOLO后处理nms的计算和比较次数。 YOLO-det…

一 初识爬虫

一 爬虫和python 二 爬虫的合法性 三 爬虫的介绍 通过程序去访问网站&#xff0c;网站肯定希望用户来访问网站&#xff0c;而不是程序来访问&#xff0c;可以使用一些技术手段。设置障碍。 越过障碍。 四 爬虫示例 需求:用程序模拟浏览器。输入一个网址。从该网址中获取到资源或…

从短视频到AIGC,快手字节重开一局

作者 | 辰纹 来源 | 洞见新研社 从短视频到剪辑工具&#xff0c;从电商到外卖&#xff0c;再到如今的AIGC大模型&#xff0c;快手和字节的竞争从来就没有停止过。 通用大模型方面&#xff0c;快手有快意&#xff0c;字节有豆包&#xff1b;AI图片创作快手有可图&#xff0c;…

docker续3:

一、使用Dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令&#xff0c;使⽤ docker build创建镜像&#xff0c;过程中会按照dockerfile所定义的内容进⾏打开临时性容器&#xff0c;把docker file中命令全部执⾏完成&#xff0c;就得到了⼀个容器应⽤镜像&#xff…

星河社区升级命令行工具,一站式完成大模型实训

飞桨PFCC社区成员卢畅贡献。卢畅&#xff0c;飞桨 PFCC 成员&#xff0c;飞桨开源之星&#xff0c;飞桨开发者专家&#xff08;PPDE&#xff09;&#xff0c;长期参加飞桨黑客松、护航计划等开源活动&#xff0c;参与过飞桨执行器预分析性能优化、静态图自动并行架构升级等任务…