一、PWM简介
要使STM32的通用定时器TIMx产生PWM输出,除了定时器中断实验中提到的寄存器外,还会用到另外三个寄存器,这三个寄存器是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有两个,TIMx_CCMR1和TIMx_CCMR2。TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和4。
在这章用到该寄存器的模式设置位OCxM,此部分由3位组成。总共可以配置为7种模式,这里我们使用的是PWM模式,所以这三位设置为110/111。这两种PWM模式的区别就是输出电平的极性相反。
接下来介绍捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。这里用到CC2E位,将该位置1即可。
最后,介绍捕获/比较寄存器(TIMx_CCR1~4),该寄存器一共有4个,对应了4个通道CH1~4。下面以TIMx_CCR1为例,在输出模式下,该寄存器的值与CNT的值比较,根据比较结果产生相应动作。利用这一点我们就可以通过修改寄存器的值来控制脉冲宽度了。
二、PWM输出实验步骤
1.开启TIM3时钟及输出通道对应的GPIO口时钟。
点击(此处)折叠或打开
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
2.初始化TIM3,设置TIM3的ARR和PSC。
点击(此处)折叠或打开
- TIM_TimeBaseInitStruct.TIM_Period=arr; //设置在自动重装载周期值
- TIM_TimeBaseInitStruct.TIM_Prescaler=psc; //设置预分频值
- TIM_TimeBaseInitStruct.TIM_ClockDivision=0; //设置时钟分割:TDTS=Tck_tim
- TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
3.设置TIM3_CH2的PWM模式,使能TIM3的CH2输出。
点击(此处)折叠或打开
- TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
- TIM_OCInitStruct.TIM_Pulse = 500;
- TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
- TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
- TIM_OC1Init(TIM3,&TIM_OCInitStruct);
4.使能TIM3。
5.修改TIM3_CCR2来控制占空比。
点击(此处)折叠或打开
- TIM_SetCompare1(TIM3,led0pwmval);
三、主程序
点击(此处)折叠或打开
- #include"pwm.h"
- #include"sys.h"
- #include"delay.h"
- #include"led.h"
- #include"usart.h"
-
- int main(void)
- {
- u16 led0pwmval=0;
- u8 dir=1;
- SystemInit();
- TIM3_PWM_Init(899,0);
- while(1)
- {
- // delay_ms(10);
- if(dir) led0pwmval++;
- else led0pwmval--;
- if(led0pwmval>300) dir=0;
- if(led0pwmval==0) dir=1;
- TIM_SetCompare1(TIM3,led0pwmval);
- }
- }
四、总结
1、主程序中delay_ms(10)添加后不能正常运行。
2、原理图中的TIM3_CH2与实际运行不符,原理图上应该是标错了。
关键字:STM32 PWM输出
引用地址:
STM32PWM输出实验
推荐阅读最新更新时间:2024-03-16 15:15
STM32开发笔记29:STM32L0低功耗设计——STOP_RTC模式的真实功耗
单片机型号:STM32L053R8T6 本例程测试STOP_RTC模式的真实功耗,主程序如下: int main(void) { while(1) { HAL_Delay(5000); Target.HAL.Rtc.EnterStopRtcMode(); Target.HAL.SystemClock.SetMode(2); } } 系统进入主循环后,先进行5秒延时,然后进入低功耗模式,低功耗模式设置的RTC时间为4秒,4秒过后退出低功耗模式,重新进行时钟设置。 在进入main函数之前,执行了3个操作:时钟设置、低功耗设置和RTC设置,如下面程序: class CHAL { public:
[单片机]
STM32RTC实时时钟
我用的是STM32库函数:两个知识点: 一、RTC时钟框图分析(重要) 二、时间是怎样显示出来的(简析) 一、RTC时钟框图分析(重要) 先熟悉一下几个知识点: 1、STM32的实时时钟(RTC)是一个独立的定时器! 2、RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位火从待机模式唤醒后RTC的设置和时间维持不变。 RTC这章中,对RTC相关的寄存器的操作特别重要,我在这里不解释了,请查阅手册。。 先上图! RTC时钟框图分为完全独立的两个部分:1、APB1接口部分(用来RTC相关的寄存器);2、RTC核心; 第一部分:APB1接口。注意:这里涉及到寄存器RTC_
[单片机]
stm32库函数学习篇----通用定时器(PWM功能)
上午花了半天时间熟悉了stm32的PWM模块。中午利用午饭时间把PWM功能调试成功。当然,很简单的东西,也许很多前辈估计都不屑一顾的东西。 今天最大的感叹就是网络资源实在是个巨大的宝库,真的很庆幸,在这个复杂的社会环境里,在一个到处充斥着私心、私利的时代,各个网站,各个论坛上的众多网友都时刻保持着开源的氛围。学习一定要和他人交流,而网络提供了这么一个极好的平台。 废话少说,言归正传。 实现功能:采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运行。 首先熟悉一下定时器的PWM相关部分。看图最明白 其实PWM就是定时器的一个比较功能而已。 CNT里的值不断++
[单片机]
基于STM32的物联网环境监测系统
本应用笔记以STM32单片机作为控制和数据处理的单元,使用AHT10、BH1750和BMP280传感器去监测周围的环境参数,在LCD屏完成传感器数据和相关信息的显示。 同时,采用了无线模组与单片机之间进行数据交互。当无线通讯模组成功连接网络,并接入机智云物联网云平台时,用户可以通过登录物联网云平台后台查看传感器上报的数据和进行远程控制。 01 总体方案设计 本环境监测系统设计选取了控制和数据处理能力强的ST32单片机作为核心部件。使用温湿度传感器对周围环境中的温度与湿度监测,选取高精度的光强度传感器完成对周围环境的光照强度的测量,对于气压数据的测量,将选取高精度的气压传感器完成工作。 该系统使用液晶显示屏幕完成对
[单片机]
PIC单片机输出比较(PWM)模块介绍
在Android红外遥控器项目中使用了输出比较OC1(PWM)模块来产生38KHz PWM脉冲,脉冲占空比与红外信号发射距离以及产品功耗有关。其中占空比越大,发射距离越远,功耗越大。红外载波的占空比一般在1/3左右。 将输出比较模块配置为PWM 操作,需要以下步骤: 1.将OCx输出配置为可用的外设引脚选择引脚之一。 2.计算所需的占空比并将计算结果装入 OCxR 寄存器。 3.计算所需的周期并将计算结果装入 OCxRS 寄存器。 4.选择当前的 OCx 作为同步源,方法是把 0x1F写入SYNCSEL 4:0 (OCxCON2 4:0 ),把 0 写入OCTRIG (OCxCON2 7 )。 5.通过写 OCTSEL2 2:
[单片机]
STM32问题记录:外设初始化与外设时钟使能
最近在STM32上写了一份串口通信的程序,但下载复位后串口却不能工作,初始化的代码如下: //发送/接收的GPIO、串口和中断的初始化结构体 GPIO_InitTypeDef GPIO_InitStructureTx; GPIO_InitTypeDef GPIO_InitStructureRx; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //设置发送和接收引脚 GPIO_InitStructureTx.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructureRx.GPIO_
[单片机]
STM32 对外设基地址,总线外设基地址和寄存器基地址的理解
前言 本博文基于STM32F103ZET6和MDK以及V3.5.0库函数; 本博文从Cortex-M3内核的寻址空间映射一直聊到库函数是怎样配置具体的某一个寄存器; 如有不足之处,多多指教; Cortex-M3存储器映射 由于STM32系列芯片为32位处理器,所谓32位处理器,也即是地址总线有32根,可寻址空间为2^32=4GB;如下图 从图片上可以看出,ARM公司已经为芯片生产厂商们划分好了存储映射空间;并且,0x40000000~0x5FFFFFFF这段地址,映射片上外设的寄存器地址;STM32F10x.h这个头文件正是吧STM32的所有寄存器进行地址映射,此文件通过宏定义的方式,将各个寄存器的地址转换为相应的符号名称,如
[单片机]
关于LM3S与STM32的粗浅对比
我用过STM32,现在又用LM3S。用后者的原因就是因其集成有网口。通过对比,我发现LM3S有一点不如STM32,就是外设的更新事件。STM32中可以通过更新事件机制实现外设之间直接打交道,而不必打扰CPU,从而大大提高了处理效率。但LM3S中就没这种机制,这是其一大不足。不知TI能否予以改进。 另外,LM3S的网口既然集成了MAC+PHY,为设么不集成协议?还要通过软件实现,耽误事。据我所知,对上述三者全部硬件实现的只有南韩的一款芯片W7100,是51核的。不知TI下一步能否硬件集成协议。
[单片机]