文章目录

  • 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定时器溢出,即500HzPWM

▲定时器时基设置


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,实现变色呼吸灯相关推荐

  1. 通用定时器输出PWM波实现呼吸灯

    STM32F1系列含有8个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO.通用定时器 TIM2/3/ ...

  2. 使用STM32输出PWM波形LED呼吸灯的效果

    文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...

  3. 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

    1.软件准备 (1)编程平台:Keil5 (2)CubeMX 2.硬件准备 (1)本此使用最小核心板STM32F103C8T6为例 (2)一个舵机:SG90或者MG996等均可 (3)ST-link ...

  4. STM32单片机:定时器TIM输出PWM波

    学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...

  5. STM32F407高级定时器TIM8_CH1N输出PWM配置

    STM32的TIM1和TIM8是两个高级定时器,TIM8_CH1N和TIM8_CH1如果两路都需要输出PWM则不能独立输出不同的占空比,他们只能输出可以带死区控制的互补波形.这里只讨论如何在TIM8_ ...

  6. STM32F7同一定时器多路输出PWM波通道之间相互影响问题

    --------------------------2020/8/12更新-------------------------------- 这次用Cube直接生成PWM控制代码,然后再RT-Threa ...

  7. STM32H743+CubeMX-低功耗定时器LPTIM输出PWM波

    文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.LPTIM2 Mode and Configuration 2.3.Parameter Settings ...

  8. stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果

    实验的STM32型号: STM32F103C8T6   48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...

  9. 基于STM32的PWM驱动LED呼吸灯

    一,PWM基本原理 所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比.频率,就是周期的倒数:占空比,就是高电平在一个周期内所占的比例.如当周期T=T1+T2:T1为高电平时间,T ...

最新文章

  1. nginx rewrite中last和break的区别
  2. Javascript简明教程四 作用域
  3. Nagios安装部署与Cacti整合文档超精细版本
  4. java环境变量javac不能成功 win7_配置Java环境
  5. 1017.UML类图笔记
  6. close wait 过多原因_time_wait 详解和解决方案
  7. 写了个项目 Web-Rtmp: 使用 WebSocket 在网页上播放 RTMP 直播流
  8. webgl图库研究(包括BabylonJS、Threejs、LayaboxJS、SceneJS、ThingJS等框架的特性、适用范围、支持格式、优缺点、相关网址)
  9. win7电脑如何提升开机速度?
  10. 如何计算机内存的品牌,如何检查计算机内存模块的品牌?如何检查计算机的内存...
  11. c语言判断字符是否为某字母,判断字符是否为字母
  12. Java SE Day-10
  13. Linux 下配置JDK 并运行springboot项目进行访问 Tomcat的安装
  14. 2020计算机二级报名时间表下半年山东,2020年3月山东省计算机二级报名时间|网上报名入口【12月20日9:00开通】...
  15. 高校计算机课程建设研讨会通知,大学计算机教改与课程建设研讨会召开
  16. 机器学习:参数模型、非参数模型
  17. JS获取日期(年/月/日/时/分/秒)以及完整格式转化(补0)
  18. Java stream流式计算详解
  19. 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表
  20. 点云处理工具——pclpy安装

热门文章

  1. OC 获取view相对位置_【全职业P4阶段世界BUFFS和药剂】BUFFS获取方法药剂自己查询出处...
  2. java中复制图片_如何在Java中实现复制图片
  3. Java 算法 素数对猜想
  4. python换算消费品价格,做折实
  5. python 二叉树递归时明明已经得到了结果,但是返回None
  6. vmware linux 编译内核,VMWare编译linux内核的注意事项
  7. oracle视图无法使用rowid,请问:无法从没有键值保存表的连接视图中选择 ROWID 这个是什么原因啊?...
  8. mysql表增加一行_数据库表增加一行数据
  9. php 导出excel 2007,使用PHPExcel导出Excel表
  10. 牛客网——约数的个数