【STM32】【STM32CubeMX】STM32CubeMX的使用之六:定时器配置输出PWM,实现变色呼吸灯
文章目录
- 0、前言
- 1、硬件设计
- 2、CubeMX配置
- 3、软件设计
下载工程文件:
https://gitee.com/Joseph_Cooper/stm32-cube-mx-stm32-l151-c8-t6
MCU:STM32L151C8T6-A
IDE:MDK-Keil5
固件库:STM32Cube FW_L1 V1.10.1
0、前言
有关STM32实现PWM的理论知识戳这里。
1、硬件设计
▲ 核心板上的RGB_LED原理图
查阅数据手册可知引脚对应的定时器通道:
▲ STM32L151手册截图
2、CubeMX配置
▲ CubeMX PWM配置图
时基设置,设置2ms
定时器溢出,即500Hz
的PWM
。
▲定时器时基设置
3、软件设计
在配置占空比参数之前需要先使能定时器的各个通道。
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
逻辑实现:
main.c
...
int main(void)
{/* USER CODE BEGIN 1 */uint8_t ColorIndex = 1; //颜色索引double Duty = 0; //待计算的占空比double DutyTempR = 0; //占空比临时值Rdouble DutyTempG = 0; //占空比临时值Gdouble DutyTempB = 0; //占空比临时值Bdouble OperateTemp = 0; //计算产生的临时变量,用于使DutyTemp逼近Duty //RGB数值列表uint8_t ValR[] = {255, 255, 255, 0 , 0 , 0 , 255};uint8_t ValG[] = {0 , 125, 255, 255, 255, 0 , 0 };uint8_t ValB[] = {0 , 0 , 0 , 0 , 255, 255, 255};/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM2_Init();/* USER CODE BEGIN 2 */HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);Duty = 100 - ((ValR[0] / 255) * 100); //根据RGB数值计算出相应的占空比参数DutyTempR = Duty;__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, DutyTempR*(2000-1)/100); //赋值Duty = 100 - ((ValG[0] / 255) * 100); //根据RGB数值计算出相应的占空比参数DutyTempG = Duty;__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, DutyTempG*(2000-1)/100); //赋值Duty = 100 - ((ValB[0] / 255) * 100); //根据RGB数值计算出相应的占空比参数DutyTempB = Duty;__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3, DutyTempB*(2000-1)/100); //赋值/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){//RDuty = 100 - ((ValR[ColorIndex] / 255) * 100); //根据RGB数值计算出相应的占空比参数OperateTemp = Duty - DutyTempR; //计算总差值OperateTemp /= 15; //差值分10次补偿给DutyTempwhile (DutyTempR != Duty){if (OperateTemp > 0 && DutyTempR > Duty) //解决因小数精度问题而无法满足循环解除条件的问题break;if (OperateTemp < 0 && DutyTempR < Duty) //解决因小数精度问题而无法满足循环解除条件的问题break;DutyTempR += OperateTemp; //差值补偿if(DutyTempR > 100) //防溢出操作DutyTempR = 100;else if(DutyTempR < 0)DutyTempR = 0;__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, DutyTempR*(2000-1)/100); //赋值HAL_Delay(100); //延时100ms}__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, DutyTempR*(2000-1)/100);//最终赋确定值,此时DutyTemp=Duty//GDuty = 100 - ((ValG[ColorIndex] / 255) * 100); //根据RGB数值计算出相应的占空比参数OperateTemp = Duty - DutyTempG; //计算总差值OperateTemp /= 15; //差值分10次补偿给DutyTempwhile (DutyTempG != Duty){if (OperateTemp > 0 && DutyTempG > Duty) //解决因小数精度问题而无法满足循环解除条件的问题break;if (OperateTemp < 0 && DutyTempG < Duty) //解决因小数精度问题而无法满足循环解除条件的问题break;DutyTempG += OperateTemp; //差值补偿if(DutyTempG > 100) //防溢出操作DutyTempG = 100;else if(DutyTempG < 0)DutyTempG = 0;__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, DutyTempG*(2000-1)/100); //赋值HAL_Delay(100); //延时100ms}__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, DutyTempG*(2000-1)/100);//最终赋确定值,此时DutyTemp=Duty//BDuty = 100 - ((ValB[ColorIndex] / 255) * 100); //根据RGB数值计算出相应的占空比参数OperateTemp = Duty - DutyTempB; //计算总差值OperateTemp /= 15; //差值分10次补偿给DutyTempwhile (DutyTempB != Duty){if (OperateTemp > 0 && DutyTempB > Duty) //解决因小数精度问题而无法满足循环解除条件的问题break;if (OperateTemp < 0 && DutyTempB < Duty) //解决因小数精度问题而无法满足循环解除条件的问题break;DutyTempB += OperateTemp; //差值补偿if(DutyTempB > 100) //防溢出操作DutyTempB = 100;else if(DutyTempB < 0)DutyTempB = 0;__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3, DutyTempB*(2000-1)/100); //赋值HAL_Delay(100); //延时100ms}__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3, DutyTempB*(2000-1)/100);//最终赋确定值,此时DutyTemp=DutyHAL_Delay(1000);if(ColorIndex < 6) //使颜色于红~紫轮流切换ColorIndex += 1;elseColorIndex = 0;/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
...
本程序的逻辑部分移植于https://blog.csdn.net/weixin_43444989/article/details/107401333。
【STM32】【STM32CubeMX】STM32CubeMX的使用之六:定时器配置输出PWM,实现变色呼吸灯相关推荐
- 通用定时器输出PWM波实现呼吸灯
STM32F1系列含有8个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO.通用定时器 TIM2/3/ ...
- 使用STM32输出PWM波形LED呼吸灯的效果
文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...
- 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)
1.软件准备 (1)编程平台:Keil5 (2)CubeMX 2.硬件准备 (1)本此使用最小核心板STM32F103C8T6为例 (2)一个舵机:SG90或者MG996等均可 (3)ST-link ...
- STM32单片机:定时器TIM输出PWM波
学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...
- STM32F407高级定时器TIM8_CH1N输出PWM配置
STM32的TIM1和TIM8是两个高级定时器,TIM8_CH1N和TIM8_CH1如果两路都需要输出PWM则不能独立输出不同的占空比,他们只能输出可以带死区控制的互补波形.这里只讨论如何在TIM8_ ...
- STM32F7同一定时器多路输出PWM波通道之间相互影响问题
--------------------------2020/8/12更新-------------------------------- 这次用Cube直接生成PWM控制代码,然后再RT-Threa ...
- STM32H743+CubeMX-低功耗定时器LPTIM输出PWM波
文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.LPTIM2 Mode and Configuration 2.3.Parameter Settings ...
- stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果
实验的STM32型号: STM32F103C8T6 48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...
- 基于STM32的PWM驱动LED呼吸灯
一,PWM基本原理 所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比.频率,就是周期的倒数:占空比,就是高电平在一个周期内所占的比例.如当周期T=T1+T2:T1为高电平时间,T ...
最新文章
- nginx rewrite中last和break的区别
- Javascript简明教程四 作用域
- Nagios安装部署与Cacti整合文档超精细版本
- java环境变量javac不能成功 win7_配置Java环境
- 1017.UML类图笔记
- close wait 过多原因_time_wait 详解和解决方案
- 写了个项目 Web-Rtmp: 使用 WebSocket 在网页上播放 RTMP 直播流
- webgl图库研究(包括BabylonJS、Threejs、LayaboxJS、SceneJS、ThingJS等框架的特性、适用范围、支持格式、优缺点、相关网址)
- win7电脑如何提升开机速度?
- 如何计算机内存的品牌,如何检查计算机内存模块的品牌?如何检查计算机的内存...
- c语言判断字符是否为某字母,判断字符是否为字母
- Java SE Day-10
- Linux 下配置JDK 并运行springboot项目进行访问 Tomcat的安装
- 2020计算机二级报名时间表下半年山东,2020年3月山东省计算机二级报名时间|网上报名入口【12月20日9:00开通】...
- 高校计算机课程建设研讨会通知,大学计算机教改与课程建设研讨会召开
- 机器学习:参数模型、非参数模型
- JS获取日期(年/月/日/时/分/秒)以及完整格式转化(补0)
- Java stream流式计算详解
- 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表
- 点云处理工具——pclpy安装
热门文章
- OC 获取view相对位置_【全职业P4阶段世界BUFFS和药剂】BUFFS获取方法药剂自己查询出处...
- java中复制图片_如何在Java中实现复制图片
- Java 算法 素数对猜想
- python换算消费品价格,做折实
- python 二叉树递归时明明已经得到了结果,但是返回None
- vmware linux 编译内核,VMWare编译linux内核的注意事项
- oracle视图无法使用rowid,请问:无法从没有键值保存表的连接视图中选择 ROWID 这个是什么原因啊?...
- mysql表增加一行_数据库表增加一行数据
- php 导出excel 2007,使用PHPExcel导出Excel表
- 牛客网——约数的个数