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-10 11:37

STM32 Cotex-M3处理器系列编程】定时器灯亮
//定时一秒LED亮 #include stm32f10x.h unsigned int TimingDelay; void Delay(unsigned int x) { TimingDelay=x; while(TimingDelay--); } void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)//检查中断溢出标志位 { TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清中断溢出标志位 GPIO_SetBits(GPIOC, GPIO_Pin_7
[单片机]
stm32寄存器版学习笔记10 SPI
  SPI(Serial Peripheral Interface),串行外围设备接口。SPI是一种高速的、全双工、同步的通信总线。 SPI接口一般使用4条线通信:   MISO 主设备数据输入,从设备数据输出   MOSI 主设备数据输出,从设备数据输入   SCLK 时钟信号,有主设备产生   CS 从设备片选信号,有主设备控制   SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置。SPI_CR寄存器的CPOL(时钟极性)位,控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。CPOL=0,串行同步时钟的空闲状态为低电平;CPOL=1,
[单片机]
STM32基础知识2-分享PWM输入模式捕捉4路PWM波形的周期和占空比
前几天分享过一个帖子,因为网速原因没有上传源码,看到有人回复我说实验不成功,那么好吧!这是我的错误,这次就将源码和我的心得体会分享出来,供大家下载测试和成长。我其实也是菜鸟一个,如果讲解的地方有啥不对,或是程序设计的不好,欢迎大家提出意见,让我们一起来学习进步。 PWM输入是输入捕获的一个特殊应用,输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。 与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2
[单片机]
<font color='red'>STM32</font>基础知识2-分享<font color='red'>PWM</font>输入模式捕捉4路<font color='red'>PWM</font>波形的周期和占空比
STM32 CAN 波特率的计算
STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用. bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟: APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的, 总线时钟MHz (3+TS1+TS2)*(BRP+1) =================================================== 下面是我的计算: CAN_InitStructure.CAN_SJW = CAN_SJW_1
[单片机]
stm32学习之七
USART串口学习: 本篇主要是stm32板子与PC机器的连接,由于是初学,花了很长的时间思考的实验,才成功的配置成功串口的通信,煞费脑筋,所以自成一篇博客。 其实在买板子的时候,应该想到有能实现通信功能的连接线,但是主要是笔记本电脑,为了稳妥起见,不敢夸张的实验。 步骤: 1、有一个USB转(串口线)com(不专业的说法,但是清晰的可以看到板子上面有com1,就这样称呼)连接线,然后就有一根连接开发板的com线,这样可以实现PC机器和stm32的连接。如果电脑上显示驱动没有安装成功,那么这个时候就要想到驱动的安装问题了。可以网上找,或者......你知道的。 2、打开设备管理器,可以看到电脑上
[单片机]
意法半导体STM32软件包,让简单的物联网产品
意法半导体的X-CUBE-AVS软件包让亚马逊的Alexa语音服务(AVS)能够运行在STM32*微控制器上,使具有云智能功能(自动语音识别和自然语言理解)的高级会话用户界面出现在简单的物联网设备上,例如,智能家电、家庭自动化设备和办公设备。 作为STM32Cube软件平台的扩展包,X-CUBE-AVS包含直接可用的固件库和开放例行程序,这有助于将AVS SDK(软件开发套件)快速移植到微控制器上。此外,该软件包还集成应用代码示例,开发人员无需开发嵌入式设备运行AVS所需的复杂软件层。AVS开发工具通常是为能耗和价格较高的微处理器设计,而X-CUBE-AVS是同类首个微控制器专用软件包,让更多的开发人员和项目可以使用Ale
[物联网]
STM32之调试支持(DBG)
STM32F10xxx使用Cortex™-M3内核,该内核内含硬件调试模块,支持复杂的调试操作。硬件调试模块允许内核在取指(指令断点)或访问数据(数据断点)时停止。内核停止时,内核的内部状态和系统的外部状态都是可以查询的。完成查询后,内核和外设可以被复原,程序将继续执行。 SWJ调试端口(serial wire and JTAG) STM32F10xxx内核集成了串行/JTAG调试接口(SWJ-DP)。这是标准的ARM CoreSight调试接口,包括JTAG-DP接口(5个引脚)和SW-DP接口(2个引脚)。 ● JTAG调试接口(JTAG-DP)为AHP-AP模块提供5针标准JTAG接口。 ● 串行调试接口(SW-DP)
[单片机]
<font color='red'>STM32</font>之调试支持(DBG)
STM8S0 TIM1_PWM互补输出
目录: 1.定时器1和互补PWM基础 2.程序: 1、TIM1_CH1_PWM互补+死区 2、TIM1_CH2_PWM互补+死区 3、TIM1_CH1_PWM+TIM1_CH2_PWM互补+死区 3.采用IAR仿真需设置:选择IAR菜单ST-Link,选择Option Bytes,配置如图(见文章末尾) 一、定时器1互补PWM基础 1.TIM1为高级定时器,定时器是16位计数,有65536种分频,分频系数1-65536。可以选择计数方向(分为向上和向下两种计数方向)。 2.使能外设时钟寄存器(CLK_PCKENR):开启或者关闭外设时钟 3.TIM1_EGR:事件产生寄存器,可以重新初始化TIM1定时器 4.控制寄
[单片机]
STM8S0 TIM1_<font color='red'>PWM</font>互补<font color='red'>输出</font>

推荐帖子

TI无线鼠标的资料
收到论坛送出的无线鼠标,但是很杯具,怎么都用不起,那个简报笔倒是很好用的,那位兄弟有相关的资料分享下。在TI网站查到无线鼠标的文档和代码,文档里有原理图,共享出来,那位兄弟有兴趣玩可以玩玩看。TI无线鼠标的资料想要一个无线鼠标,但是不知道会不会好用,别到时候买来一两天就给坏了https://bbs.eeworld.com.cn/thread-312050-2-1.html看一下16楼,如果以上操作步骤还是不行,就联系我们吧,我们再补寄给你一个;如果新的可以,旧的证明确实
shower.xu 微控制器 MCU
求助:ir2110可以直接驱动E类逆变器吗?
求助:ir2110可以直接驱动E类逆变器吗?如果可以硬件该怎么连接?求助:ir2110可以直接驱动E类逆变器吗?怎么说呢楼主,能说出E类逆变器的,肯定是对逆变器有所研究为了搞清所谓E类,,在百度学术上有这种电路的mosfet管用ir2110驱动可以吗?频率可以达到多少?IR2110是双通道高压、高速电压型功率开关器件栅极驱动器,具有自举浮动电源,,IR2110即可利用自举驱动原理构成功率MOS,是常用逆变器驱动芯片之一吧,,网上资料应该有很多介绍在论坛中看到,有提到用信号发生
lhskkk 电源技术
谁做过fir滤波器啊?求教????
谁做过fir滤波器啊?求教????谁做过fir滤波器啊?求教????正想做,求解是软件还是硬件啊
青囊湿依 模拟电子
硬盘足够大的请进
硬盘足够大的请进现在开启上传模式现在开启上传模式先上图先上图帮你算下:所以貌似直接上传资料到下载中心是不是更给力呢点击“图片”上传,就可以直接在帖子中放图片了坚持下来就是胜利回复沙发电子爱好者ABC的帖子资料目测还不错,不过好似非常非常的大呢?具体是多大的?我现在下载了70M,但是显示还是0%我去,大哥你还真一口气全部下载下来啊,应该有几十G。你可以打开文件夹,选择性的下载。回复6楼fengxin的帖子这个资料确实不少,,十分感谢!:
电子爱好者ABC 嵌入式系统
《嵌入式软件的时间分析》第一章阅读分享-澄清嵌入式实时系统的实时究竟是什么
第一章分享本章1.1实时系统一小节就澄清了实时系统的实时指的及时,而不是指的快,这点很重要,大部分嵌入式开发者可能都没搞懂这个概念,主要原因就是网上各种资料,甚至各种书籍都是各种相互抄袭,源头就是错的。换句话说,所谓实时系统是指的对及时响应有不同程度需求的系统,这种需求程度不一样就对应不同的实时系统,要求很严格就是必须实时响应否则会导致严重问题,那么这种系统就是硬实时(需求)系统,如果是有及时性要求但是要求没那么严格,偶尔一两次响应没那么及时也能接受,那么就是软实时(需
qinyunti 汽车电子
宝钢的变频器应用
4、在宝钢,交流变频调速技术的应用尚有待开拓的新领域在宝钢,交流电动机变频调速技术虽然已得到了普遍的应用。但是,仍有待开拓的新领域:其一是风机、水泵设备的节能调速,其二是行车卷扬系统的节能调速。可以说交流调速技术应用于这两个方面其经济效益是十分可观的。4、1风机、水泵的节能调速虽然少数风机、水泵设备也用到了变频器。但是,其基本目的只是减小电动机的起动电流,以减小电动机在起动时对电网的冲击。如前所述,高炉鼓风机同步电动机的起动,1#、2#高炉出铁场除尘风机电动机的起动
beh 工控电子
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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