STM32 高级定时器 输出PWM (用DHT11测得的温度去调节RGB灯的亮度)

发布者:星光闪耀最新更新时间:2022-05-26 来源: eefocus关键字:STM32  高级定时器  输出PWM  DHT11 手机看文章 扫描二维码
随时随地手机看文章

开发平台

野火STM32F429开发板

使用标准库开发

高级定时器

高级定时器其实就是基本定时器加上输入捕获、输出比较和断路死区,所以有四个初始化函数:

定时器时基初始化函数

TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

输出比较初始化函数

TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

输入捕获初始化函数

TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

死区初始化函数

TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);

编程思路

初始化RGB灯的引脚

驱动DHT11(上一篇)

定时器时基初始

定时器输出比较初始化

配置基本定时器:


  void BASE_Tim_Config (void)

  {

  TIM5_CLK_ENABLE();

  

  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

  TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;

  TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;

  TIM_TimeBaseInitStruct.TIM_Period=100-1;(定时器周期,实际上就是ARR重装载值)

  TIM_TimeBaseInitStruct.TIM_Prescaler=90-1;

      TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;

  TIM_TimeBaseInit(TIMX,&TIM_TimeBaseInitStruct);

  

  TIM_Cmd(TIMX,ENABLE);

  }


(1) 基本定时器只有向上计数

(2) 配置ARR的值

(3) 配置分频系数

(4) 基本定时器没有重复计数器

(5)使能定时器


配置高级定时器的输出比较:


  void TIM_OC_Config(void)

  {

      TIM_OCInitTypeDef TIM_OCInitStruct;

  TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;

  TIM_OCInitStruct.TIM_Pulse=0;

  TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;

  TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;


  TIM_OC3Init(TIMX,&TIM_OCInitStruct);

  TIM_CtrlPWMOutputs(TIMX,ENABLE);

  TIM_ARRPreloadConfig(TIMX,ENABLE);

  

  TIM_Cmd(TIMX,ENABLE);


}


(1) 选择PWM模式

(2) 脉宽初始化为0,是决定占空比

(3) 设置极性决定定时器通道有效电平

(4) 比较输出使能

(5) 主动输出使能

(6) 使能ARR重装载

(7)使能定时器


补充:

初始化输出比较函数有四个,每个定时器的通道不一样,所要选择的初始化函数也不一样,要查看手册(这里用的是TIM5,通道为CH3)

定时器周期:T=(ARR+1)*(PSC+1)/TCK

占空比:脉宽/ARR重装载的值


代码如下:

PWM.h


#ifndef __PWM__H

#define __PWM__H


#include "stm32f4xx.h"

#include "DHT11.h"


#define GPIOH_CLK_ENABLE()      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE)

#define TIM5_CLK_ENABLE()       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE)


#define LED_R_PIN               GPIO_Pin_10

#define LED_G_PIN               GPIO_Pin_11

#define LED_B_PIN               GPIO_Pin_12

#define LED_R_S_PIN             GPIO_PinSource10

#define LED_G_S_PIN             GPIO_PinSource11

#define LED_B_S_PIN             GPIO_PinSource12

#define LED_R_PORT              GPIOH

#define LED_G_PORT              GPIOH

#define LED_B_PORT              GPIOH

#define TIMX                    TIM5


void GPIO_Config(void);

void BASE_Tim_Config (void);

void TIM_OC_Config(void);

void TIMx_Config(void);


#endif 


PWM.c


#include "PWM.h"


void GPIO_Config(void)

{

    GPIOH_CLK_ENABLE();

    

    //GPIO_PinAFConfig(LED_R_PORT,LED_R_S_PIN,GPIO_AF_TIM5);    GPIO_PinAFConfig(LED_G_PORT,LED_G_PIN,GPIO_AF_TIM5);

    GPIO_PinAFConfig(LED_B_PORT,LED_B_S_PIN,GPIO_AF_TIM5);



    GPIO_InitTypeDef GPIO_InitStruct;

    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;

    GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;

    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;

    

    //GPIO_InitStruct.GPIO_Pin=LED_R_PIN;

    //GPIO_Init(LED_R_PORT,&GPIO_InitStruct);

    

    //GPIO_InitStruct.GPIO_Pin=LED_G_PIN;

    //GPIO_Init(LED_G_PORT,&GPIO_InitStruct);

    

    GPIO_InitStruct.GPIO_Pin=LED_B_PIN;

    GPIO_Init(LED_B_PORT,&GPIO_InitStruct);

    

}


void BASE_Tim_Config (void)

{

    TIM5_CLK_ENABLE();

    

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

    TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;

    TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;

    TIM_TimeBaseInitStruct.TIM_Period=100-1;

    TIM_TimeBaseInitStruct.TIM_Prescaler=90-1;

    TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;

    TIM_TimeBaseInit(TIMX,&TIM_TimeBaseInitStruct);

    

    TIM_Cmd(TIMX,ENABLE);

}


void TIM_OC_Config(void)

{

    TIM_OCInitTypeDef TIM_OCInitStruct;

    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;

    TIM_OCInitStruct.TIM_Pulse=0;

    TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;

    TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;

  

    TIM_OC3Init(TIMX,&TIM_OCInitStruct);

    //TIM_OC3PreloadConfig(TIMX,TIM_OCPreload_Enable);

    TIM_CtrlPWMOutputs(TIMX,ENABLE);

    TIM_ARRPreloadConfig(TIMX,ENABLE);

    

    TIM_Cmd(TIMX,ENABLE);

}


void TIMx_Config(void)

{

    BASE_Tim_Config ();

    TIM_OC_Config();

    

}   


main.c


#include "stm32f4xx.h"

#include "DHT11.h"

#include "USART.h"

#include "stdio.h"

#include "systick.h"

#include "PWM.h"



int main(void)

{

    GPIO_Config();

    USART_config();

    Systick_Init ();

    TIMx_Config();

    printf("温度传感器控制led亮灭n");

    while(1)    

    {

        TIM_SetCompare3(TIMX,(DHT11_Data()-25)*6);

        DELAY_us(1500000);

    }

     

 

}

关键字:STM32  高级定时器  输出PWM  DHT11 引用地址:STM32 高级定时器 输出PWM (用DHT11测得的温度去调节RGB灯的亮度)

上一篇:RCC—使用HSE配置系统时钟
下一篇:硬件I2C驱动MPU6050

推荐阅读最新更新时间:2024-11-16 19:58

STM32之EXTI(中断)
什么叫中断?(学过51单片机的肯定不陌生!!) EXTI(External interrupt)指的是外部中断,通过GPIO检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后,再返回到之前中断的代码继续执行 stm32的中断和异常(在stm32中,所有的GPIO都可以用作外部中断源的输入端) 在stm32的中断向量表是重新进行编排的,(Cortex内核中,打断代码执行流程的事件分为异常(exception)以及中断(interrupt),编号0~15为内核异常,16以上都是外部中断(外部,是相对内核而言)) 把编号-3至6的中断向量定义为系统异常,编号为负的内核异常不能被设置优先
[单片机]
<font color='red'>STM32</font>之EXTI(中断)
stm32定时器运用———呼吸灯
呼吸灯原理 1.在模拟电路中,呼吸灯的实现可以通过一个呈现正弦的电压控制,这个电压是连续变化的,所以肉眼看上去就是逐渐变暗,逐渐变亮。 2.而在数字电路中如何实现这种效果呢?就需要通过pwm,也就是脉冲宽度调制,将模拟量转换为数字量。只要能够用连续电压控制的东西都是可以通过pwm方式来驱动,效果是一样的。 3. 上面一块区域的面积等于对应下来的矩形的面积,当然,取得块的间隔越小(即pwm的周期越小),效果越好。这时,如果周期定了,就可以通过改变占空比来实现面积的改变,从而模拟出上面那张图的电压的连续变化。 注意:pwm波的高度是一定的,所以只能通过改变宽度(占空比)来实现面积的改变 4.说明:观察这张图,会发现
[单片机]
<font color='red'>stm32</font>之<font color='red'>定时器</font>运用———呼吸灯
STM32管脚的复用与重映像关系
最近记忆力以指数形式下降,以前弄明白的东西结果又忘了,故而将之写下避免下次又得重新查阅资料 这里讲的是关于STM32F10X的,和STM32F0XX系列的还是有一些区别的,F0的下次有空在写了.... 概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出2.其他外设的输入输出(比如I2C,TIM,SPI等等),这就是复用。 重映射就是将引脚功能重新定义到其他引脚,例如PA9是USART1-TX默认的管脚,但是现在PA9用做它用了,那可以将USART1-TX重新映射到PB6,当然这种映射不是随意的想映射到哪个脚就哪个脚,芯片内部已经固定了只能映射到固定的地方 OK,说完了概念 下面是用法 MCU复位后PA8的默认功能是普通
[单片机]
<font color='red'>STM32</font>管脚的复用与重映像关系
谈谈STM32(CM3)的Faults异常
1写在前面 回归现实,本文带领大家学习下STM32中Fault的一些相关知识。 应该有许多朋友在学习,或者开发时遇到过程序进入HardFault_Handler的情况。 那么,你们有多少人认真去分析过Fault这类异常中断呢?下面结合STM32F103,也就是Cortex‐M3内核来给大家讲述一下这些异常中断的内容。 2 Cortex‐M3异常 说起Fault,我们就要说一下Cortex‐M3的异常。 Cortex‐M3 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。 CM3部分异常列表: 这些异常中断的优先级,有些却是固定的,有些是可以通过软件来配置,如UART发送中断
[单片机]
谈谈<font color='red'>STM32</font>(CM3)的Faults异常
STM32库函数EXTI_GetFlagStatus和EXTI_GetITStatus区别是什么?
一个是获取状态的,一个是获取中断的。 EXTI_GetFlagStatus只是纯粹读取中断标志位的状态,但是不一定会响应中断(EXT_IMR寄存器对该中断进行屏蔽);而EXTI_GetITStatus除了读取中断标志位,还查看EXT_IMR寄存器是否对该中断进行屏蔽,在中断挂起&没有屏蔽的情况下就会响应中断。仔细看看代码就知道区别了 FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) { FlagStatus bitstatus = RESET; assert_param(IS_GET_EXTI_LINE(EXTI_Line)); if ((EXTI- PR & EXTI_
[单片机]
STM32之学习笔记--串口通信
  在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。   b) 初始化函数定义:   void USART_Configuration(void); //定义串口初始化函数   c) 初始化函数调用:   void UART_Configuration(void); //串口初始化函数调用   初始化代码:   void USART_Configuration(void) //串口初始化函数   {   //串口参数初始化   USART_InitTypeDef USART_InitStructure; //串口设置恢复默
[单片机]
STM32-(36):CAN总线(概述)
CAN 是 Controller Area Network 的缩写(以下称为 CAN) ,是ISO国际标准化的串行通信协议。 在当前的汽乍产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来 。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN 进行大量数据的高速通信”的需要,1986年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后, CAN 通过 ISO 1898及 ISO 11519进行了标准化,现在在欧洲已是汽车网络的标准协议。 现在, CAN 的高性能和可靠性己被认同,
[单片机]
STM32-(36):CAN总线(概述)
基于STM32微控制器处理先进电机控制方法
    变频器的问世和先进的电机控制方法让三相无刷电机(交流感应电机或永磁同步电机)曾经在调速应用领域取得巨大成功。这些高性能的电机驱动器过去主要用于工厂自动化系统和机器人。十年来,电子元器件的大幅降价使得这些电机驱动器能够进入对成本敏感的市场,例如:家电、空调或个人医疗设备。本文将探讨基于ARM的标准微控制器如何在一个被DSP和FPGA长期垄断的市场上打破复杂的控制模式,我们将以意法半导体的基于Cortex-M3 内核的STM32系列微控制器为例论述这个过程。     首先,我们回顾一下电机控制的基本原理。在电机控制系统内,为什么处理器非常重要?我们为什么需要非常好的计算性能?毕竟,Nicolas Tesla在一个世纪前发明
[嵌入式]

推荐帖子

“全数控、积木式TI方案电源”分工,期待你加入!
“全数控、积木式TI方案电源”的项目,现在需要大量人员参与开发,对每一部分的电路拓扑、元器件选择及定型作一下实验,需要第一手的数据。希望大家多协助,踊跃参加。现把整个项目分为几个部分,由不同人员分别调试,最后将调试数据(包括中间数据和最终数据)汇总整理。其划分如下:一、PFC部分。指标:输入AC160V~230V,输出DC390V+10V-20V;功率250W;频率100KHz~150KHz电路拓扑:受CP
dontium DIY/开源硬件专区
机器人编程设计与实现
《机器人编程设计与实现》由浅入深、由简单到复杂地讲述机器人编程设计与实现方法相关内容,共5篇,23章,主要内容包括:RobotBASICIDE使用方法,常用基本运动控制算法的程序编制,真实机器人的组装及控制,RobotBASIC语言中的常用指令等。以丰富典型的实例及其对应的详细程序,引导读者一步步走进快乐而又富有成就感的机器人编程世界。每章最后附有的思考练习题可以用来检验读者的学习效果,帮助读者复习、巩固和提高所学知识。《机器人编程设计与实现》适合机器人爱好者和准备参加机器人竞赛的读者
arui1999 下载中心专版
555+4017流水灯
比较久以前画的,可以改造下做个电子色子玩玩此内容由EEWORLD论坛网友xutong原创,如需转载或用于商业用途需征得作者同意并注明出处555+4017流水灯
xutong PCB设计
请教运行EVC时的一个错误,麻烦大家帮帮忙
我在运行一个简单的HELLO程序,该程序无错误,我选的是EMULATOR模式,就是在XP上模拟,编译无错,运行是出现如下错误oneormorefilesfromtheemulatorforwindowsCEinstallationismissing,我电脑上没装platformbuilders,有关系吗是不是我有什么没设置好呢请教运行EVC时的一个错误,麻烦大家帮帮忙解决了ToresolvethisproblemandtorunWindow
houge 嵌入式系统
Brightsign 核心板HS124,HS144硬件软件开发. Brightsign播放器
群里有哪位大神会Brightsign核心板HS124,HS144硬件软件开发.Brightsign播放器软件开发,或者配套的电路板定制开发。急需急需急需Brightsign核心板HS124,HS144硬件软件开发.Brightsign播放器你是需要核心板的外围开发还是?软件的话也可以开发的可以加我微信13732579405
qsx123456 测评中心专版
求汽车MBD开发资料
现在正在做有关4轮独驱的电动车辆,向各位坛友求推荐与汽车相关的MBD开发资料或书籍求汽车MBD开发资料《汽车MBD开发入门、技巧和实战》 可以发下资料的相关链接吗?
grarrow 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved