PWM概述
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM 原理如图:
STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。通过查看开发板的原理图(如下),可发现PF9引脚连接LED0,同时也是作为TIM14_CH1的复用输出端口,知道此前提,我们就可以开始搞事情了。
PWM输出步骤
使能定时器14和相关IO口时钟。
使能定时器14时钟:RCC_APB1PeriphClockCmd();
使能GPIOF时钟:RCC_AHB1PeriphClockCmd ();
初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIOF9复用映射到定时器14
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
初始化输出比较参数:TIM_OC1Init();
使能预装载寄存器: TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
使能自动重装载的预装载寄存器允许位 TIM_ARRPreloadConfig(TIM14,ENABLE);
使能定时器。
不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();
呼吸灯实现
pwm.c
#include "pwm.h"
/*
引脚说明:
LED0灯连接PF9,TIM14通道1
TIM14 -- APB1,定时器频率:84MHZ
*/
void Pwm_Led0_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStruct; //定时一个该结构体
//开启 TIM14 和 和 GPIO时钟,配置 PF9选择复用功能 AF9 (TIM14)输出。
//库函数使能 TIM14 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
//还需要使用到GPIOF9,所以也要使能该引脚
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//由于使用到PF9的复用功能,利用库函数使其引脚与TIM14定时器
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //GPIOF9
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //配置引脚为复用功能
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStruct); //初始化 PF9,用库函数寄存器
TIM_TimeBaseStruct.TIM_Prescaler = 84-1 ; //设置定时器的分频值 1MHZ
TIM_TimeBaseStruct.TIM_Period = 500-1; //设置定时器的的自动重装载的值 周期为500us
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置定时器为向上计数模式
TIM_TimeBaseStruct.TIM_ClockDivision= TIM_CKD_DIV1;//设置定时器的时钟分频因子
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStruct);//初始化定时器 14
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM的模式,选择PWM模式1
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; //输出的极性,输出是高电平还是低电平,这里选择低电平
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //用于设置输出的使能,使能PWM输出到端口
//根据设定信息配置TIM14 OC1 -- 通道1
TIM_OC1Init(TIM14, &TIM_OCInitStruct);
//使能预装载寄存器:
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
//使能自动重装载的预装载寄存器允许位
TIM_ARRPreloadConfig(TIM14,ENABLE);
//使能定时器。
TIM_Cmd(TIM14, ENABLE);
}
main.c
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
#include "pwm.h"
int main(void)
{
//NVIC分组(一个工程当中只能配置一次分组)抢占优先级2位,值范围:0~3;响应优先级2位,值范围:0~3;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//LED灯初始化
Led_Init();
Delay_Init();
Pwm_Led0_Init();
//对比的灯
GPIO_ResetBits(GPIOE, GPIO_Pin_14);
int i;
while(1)
{
//值范围:0~499 灯渐亮
for( i = 0; i<= 499 ; i++)
{
TIM_SetCompare1(TIM14, i);
delay_ms(5);
}
//灯渐灭
for( i = 499; i>= 0 ; i--)
{
TIM_SetCompare1(TIM14, i);
delay_ms(5);
}
}
return 0;
}
上一篇:初学stm32-通用定时器的使用
下一篇:STM32进阶-串口及蓝牙通信 控制开发板硬件详细步骤-USART1/2
推荐阅读最新更新时间:2024-11-10 12:31
推荐帖子
- PCB上的器件热耦合与散热解决方案
- 任何散热解决方案的目标都是确保设备的工作温度不超过其制造商规定的安全限值。在电子工业中,这个工作温度被称为器件的“结温”。例如,在处理器中,这个术语字面上指的是电能转换为热量的半导体结。为了保持工作,热量必须以确保可接受的结温的速率流出半导体。当热流从整个器件封装的结处移动时,这种热流遇到阻力,就像电子在流过导线时面对电阻一样。在热力学方面,这种电阻称为导电电阻,由几个部分组成。从结点开始,热量可以流向元件的壳体,可以放置散热器。这被称为ΘJC,或结至壳体的热阻。热量也可以从组件的顶
- ohahaha PCB设计
- 【NUCLEO-U083RC】4.驱动段式LCD屏(1)
- 本来在计划中准备使用LCD1602作为显示屏的,但是看过ST对U0延长电池使用时间的定义后,发现LCD1602对于电池供电貌似不是很友好。所以本次测评使用LCD数码管进行测试1.LCD简介段式LCD(LiquidCrystalDisplay,液晶显示屏)是一种显示屏技术,通过排列成段的单个液晶单元格来形成文字和数字。与全点阵LCD不同,段式LCD的显示能力较为有限,通常用于显示简单的文本和数字,如计算器、电子表、家用电器和工业设备上的显示屏。段式LCD的
- 电子烂人 stm32/stm8
- 瑞萨 M16C/6S系列单片机
- 瑞萨科技株式会社在亚洲能源周展示了PLC(PowerLineCommunication)组件和电力马达平台。通过PLC,可以远程控制对电力仪表的自动检测和终端电压监视、仪表和变压器的负荷的监视和调整。展出的PLC组件中使用了瑞萨科技的M16C/6S单片机。M16C/6S是内置于YITRAN公司开发的电力线调制解调器IT800的单片机,是最适用于有线通讯化的单片机。有线通讯使用的频带为100~400kHz,在最大值7.5Kbps的情况下也可能进行通讯。同时,适用于微软公司主要针对家用
- rain 单片机
- 高薪急聘硬件设计工程师兼职人员(北京)
- 职位介绍硬件设计工程师本公司正在做PDA项目的开发,使用的是ARM系统。已经完成第一版产品的开发和小批量生产。现欲招聘一名兼职硬件工程师,负责后续的生产以及后续产品的设计,调试和生产工作。PDA的硬件组成如下:单片机+ARM协处理器+Keyboard+LCD+NANDFlash+USB+RFModule(串口接口)。单片机负责扫描键盘,并启动ARM协处理器。职位描述及要求1.数字、模拟电子线路设计;2.电路调试、测试;3.小批量元器件采购;硬件实验室维护;4.电路
- hibozhou 嵌入式系统
- [求助]电压超限指示和报警电路的设计
- 这学期期末要搞一个电路设计,我们选择的课题是:电压超限指示和报警电路的设计,哪位大虾能帮我们设计一个,感激不尽!谢谢了.上面是参考电路~~~电压超限指示和报警电路的设计帮你是害了你,小弟电压超限指示可以使用比较器用运放或者专用比较器如LM339一类的然后输出电平驱动某一个东东报警Re:电压超限指示和报警电路的设计费劲一点的可以用电阻搭个分压电路,用ad采样电压值,用单片机控制。。可以实现模糊点的算法。比如持续超压500ms再报警之类的。这样可以避免毛刺等的误报!Re:电压超
- cntjpu 单片机
- 嵌入式课程体系最佳设计
- 嵌人式系统是当前最热门最有发展前景的IT应用领域之一,我们平常用的手机、可视电话、数码相机、摄像机、机顶盒、路由器、数控设备或仪表、医疗仪器、航天航空设备等都是嵌入式系统,各个行业对嵌人式技术人才的需求日益旺盛。下面就由卓跃教育为您做一个介绍。对于嵌入式开发工程师来说,在技术上需要逾越三道关卡,分别是\"硬件\"开发、操作系统开发和应用软件开发,三者缺一不可(如果缺一环,在工作中的技术发展会受限)。逾越三个堡垒的最佳途径是通过平台级的应用软件开发,锻造良
- zhenbaichi DIY/开源硬件专区
设计资源 培训 开发板 精华推荐
- OP113ESZ-REEL 低噪声运算放大器电压基准的典型应用
- LT6654BHS6-3.3 八路 DAC 电压基准的典型应用
- LTC4217 热插拔控制器的典型应用,电流由 ADC 监控
- 三菱 IGBT CM1800DY 带 ACPL-339J 和 ACPL-C87A 栅极驱动参考板
- LTM4643IV 4V 至 20V 输入、4 相、1.2V/12A 降压型稳压器的典型应用,具有温度监控功能
- AP7217C 1.25V 600mA CMOS LDO典型应用
- 使用 Microchip Technology 的 TCL1117-5.00 的参考设计
- UC2843B 高性能电流模式控制器的典型应用电路
- STGIPS14K60T专用电源IC和模块的典型应用
- 使用 Analog Devices 的 LT1767EMS8-2.5 的参考设计