基于stm32f103rct6的呼吸灯实现

2023-11-02

一、PWM

在stm32中,输出pwm的方式有很多,第一种是可以用普通IO口输出pwm,第二种是利用定时器的pwm的IO口或复用IO口。

①pwm端口:

STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出

②普通IO口:

一般能够输出PWM的端口都会在主要功能那一栏出现CHx的标志,而普通定时器没有出现这种标志。

       我们可以通过改变灯的有效电压占空比来实现呼吸灯效果。其中我们要用到PWM(脉宽调制),通过pwm我们可以来改变高电平的占空比

        ·占空比:在一个周期中,高电平所占整个周期的百分比

具体如图:

当我们用pwm来生成呼吸灯时,因为在stm32f103rct6中PA8LED灯是通过给PA8输入一个低电平点亮的,所以低电平在一个周期中维持的时间越长,灯越亮。

具体实现看代码:

void Pwm_Init()
{
    GPIO_InitTypeDef  	GPIO_InitStruct;
	TIM_OCInitTypeDef 	TIM_OCInitStruct;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
    /*1、使能时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA |RCC_APB2Periph_TIM1,ENABLE);
    
    /*2、配置GPIO*/
	GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_8;  		//引脚8 LED1
	GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF_PP;		//复用
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz; //速度
	GPIO_Init(GPIOA,&GPIO_InitStruct);	
	 
	
	//4、初始化定时器,配置ARR,PSC。
	TIM_TimeBaseInitStruct.TIM_Prescaler	= psc; 	//分频系统  ,每秒数多少个数 
	TIM_TimeBaseInitStruct.TIM_Period		= per; 	//重装值
	TIM_TimeBaseInitStruct.TIM_CounterMode	= TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0x00;
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);		

	/*配置pwm*/
	TIM_OCInitStruct.TIM_OCMode		=  TIM_OCMode_PWM1; 	  //PWM1模式
	TIM_OCInitStruct.TIM_OutputState=  TIM_OutputState_Enable;//输出使能
	TIM_OCInitStruct.TIM_OCPolarity =  TIM_OCPolarity_Low; 	  //极性低
	TIM_OCInitStruct.TIM_Pulse = 0x00;
	TIM_OC1Init(TIM1,&TIM_OCInitStruct);
	//5、使能预装载寄存器: 
	TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); 
	
	//6、使能自动重装载的预装载寄存器允许位	
	TIM_ARRPreloadConfig(TIM1,ENABLE);

	/*pwm输出通道使能*/
	TIM_CtrlPWMOutputs(TIM1,ENABLE);
		
	//7、使能定时器。
	TIM_Cmd(TIM1,ENABLE);

}

 主函数:


void HardWare_Init(void)
{
	SysTick_Init(72);
	Pwm_Init(100-1,7200-1);
}

int main(void)
{
	u8 cnt = 0;
	u8 fx = 1;
	HardWare_Init();
	while(1)
	{
		if(fx)
		{
			cnt++;
			if(cnt>99)
				{
					fx = 0;
				}
		}
		else
		{
			cnt--;
			if(cnt < 1)
			{
				fx = 1;
			}
		}
		TIM_SetCompare1(TIM1,cnt);
		delay_ms(20);
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于stm32f103rct6的呼吸灯实现 的相关文章

  • MySQL查询语句的执行顺序

    SQL语句执行顺序 FROM ON JOIN WHERE GROUP BY AGG FUNC WITH HAVING SELECT UNION DISTINCT ORDER BY LIMIT 在实际执行过程中 每个步骤都会为下一个步骤生成一
  • [django项目] 后台菜单管理功能

    后台菜单管理功能 菜单的管理功能其实就是 对菜单的增删改查 I 业务功能分析 1 gt 业务需求分析 后台首页菜单根据用户权限动态生成 不同菜单对应不同的功能视图 菜单的增删改查 2 gt 功能分析 菜单列表 添加菜单 修改菜单 删除菜单
  • Python Tree库绘制多叉树的用法介绍

    Python Tree库绘制多叉树的用法介绍 Tree 库是一个 Python 的第三方库 这个库主要用于生成树和绘制树的图形 一 安装Tree pip install Tree 使用 Tree 库需要配合 PIL 库来实现绘图 二 官方案

随机推荐

  • Qt控件之QCheckBox复选框控件使用详解

    Qt控件之QCheckBox复选框控件使用详解 在Qt的控件中 QCheckBox是常用的一种复选框控件 用于用户进行多选操作 本篇文章将为大家详细介绍QCheckBox的使用方法 一 QCheckBox控件的创建 在Qt中创建QCheck
  • Windows下配置 MinGW - Gcc、G++构建C++编译环境,并在Notepad++编写C++程序

    win10 64位系统参考博文 MinGW w64安装教程 著名C C 编译器GCC的Windows版本 工具 win7 Notepad MinGW MinGW是什么 MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环
  • spark的安装与部署

    目录 前言 一 spark是什么 二 知识回顾 1 启动zookeeper 2 启动hdfs和yarn 3 通过jps查看是否启动成功 4 进入MySQL 5 进入hive之后验证 6 启动hbase 7 查看进程 8 进入hbase并测试
  • 数值的整数次方(剑指offer 16)Java快速幂

    目录 一 题目描述 二 思路讲解 三 Java代码实现 四 时空复杂度分析 五 另一种方法 一 题目描述 实现 pow x n 即计算 x 的 n 次幂函数 即 xn 不得使用库函数 同时不需要考虑大数问题 示例 1 输入 x 2 0000
  • GPIO应用编程

    开发平台 正点原子阿尔法开发板 PS 可以用cat sys kernel debug gpio命令查看引脚被占用情况 文章目录 GPIO应用编程 编程步骤 应用编程 遇到的问题 GPIO应用编程 sys class gpio export
  • 印章生成工具类开发

    Java代码见我的资源 免费使用印章生成工具类 Java开发 Java文档类资源 CSDN下载印章生成工具类 Java开发更多下载资源 学习资料请访问CSDN下载频道 https download csdn net download jlo
  • wss socket java_有用过websocket的吗,wss://咋弄,现在ws://访问没问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 将ws 改为wss ServerEndpoint value ws id Component public class WebSocket public static final String
  • linux中ElasticSearch的安装 安装ES&Kibana 配置IK分词器(环境搭建)

    以docker为基础安装ES Kibana 1进入 opt文件夹创建yml文件所在目录 然后编辑文件 拷贝笔记配置内容过来 启动容器 root localhost cd opt root localhost opt ls container
  • 最新Visual studio 2017无法支持最新Unity3d 2017相关解决方案

    最近换了台电脑于是乎也就装了最新的VS2017来尝尝鲜 U3D也是用的2017版本 结果在使用过程中发现一些问题 可能有一些问题在老版本上也是会出现的 只是没有发现而已 以后遇到一些相关的坑会陆续在这里更新 希望对大家有帮助 1 我安装了V
  • 磁盘的动态扩容和缩减

    主旨 在日常运维过程中 经常会出现磁盘爆满 不足以维持未来业务量 或者磁盘太大 造成资源浪费的情况 这种情况下最好的方式就是采用磁盘的动态扩容和缩减 LVM是什么 在这里我们推荐使用LVM逻辑卷的方式 为什么使用这个方式呢 这个方式有什么值
  • Android之window中的WSL读取devices

    window中的WSL读取devices步骤 在WSL中下载adb 可以通过windows下载linux版本 然后在WSL中进行安装 SDK Platform Tools 版本说明 Android 开发者 Android Developer
  • 关于curl库的介绍(数据的获得)

    1 function get cookie url params referer 2 3 if url null echo get cookie url null exit 4 if params null echo get params
  • integer对比==与equals区别

    对于 与equals区别在于 在于对象和值两者之间都会比较 而equals只是值得比较 大部分数据情况下最好用equlas integer的取值范围在 128 127之间的 在这之间的值在integerCache cache中产生无论出现多
  • 【小程序】小程序如何实现滑动翻页(类似刷短视频的交互效果)

    在微信小程序中实现上下滑动翻页的效果其实非常简单 可以说一学就会 这篇文章将非常详细地教大家如何实现这一交互 数据准备 首先我们在 Page 的 data 属性中添加两个变量 data biases title Fundenmental A
  • SQL查询语句

    目录 1 回顾SQL查询语句 2 SQL查询子句 3 WHERE子句 4 DISTINCT数据去重 5 GROUP BY子句 5 1 统计函数 5 2 GROUP BY分组 6 ORDER BY子句 7 LIMIT子句 8 SQL多表查询
  • 科技新技术

    3D打印 智慧城市 人脸识别 NFC 无线充电 in cell
  • 基于单边jacobi的奇异值分解(SVD)

    基于单边jacobi的奇异值分解 SVD 对于奇异值分解 SVD 相信很多学过线性代数 高等代数的同学都不会很陌生 但是怎么实现呢 接下来就来详细说说 为了方便讨论 本文所有的讨论仅限定于实数空间 奇异值分解的含义就是将矩阵A分解成一个酉矩
  • springmvc中,post,get请求接收参数的常用方式

    在Spring MVC中 可以使用以下几种方式来接收GET请求中的参数 使用 RequestParam注解 可以将请求参数绑定到方法的参数上 例如 GetMapping example public String example Reque
  • 设置WPF的DataGrid多行显示不同的颜色

    两种方式 1 直接设置样式
  • 基于stm32f103rct6的呼吸灯实现

    一 PWM 在stm32中 输出pwm的方式有很多 第一种是可以用普通IO口输出pwm 第二种是利用定时器的pwm的IO口或复用IO口 pwm端口 STM32 的定时器除了 TIM6 和 7 其他的定时器都可以用来产生 PWM 输出 其中高