cortex_m3_stm32嵌入式学习笔记(九):PWM 输出实验

PWM 简介

脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。

STM32 的定时器除了
TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达
4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!

本实验仅使用 TIM1的 CH1 产生一路 PWM 输出,若要产生多路输出,只需修改几处代码即可。。

先看原理图

可以看到DS0是由 TIM1_CH1 即定时器1的通道1控制输出的

配置TIM1的PWM输出 pwm.c

#include "pwm.h"
#include "led.h"
//PWM 输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{
	GPIO_InitTypeDef GPIO_ist;
	TIM_TimeBaseInitTypeDef TIM_Base_ist;
  TIM_OCInitTypeDef TIM_OC_ist;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// ①使能tim1时钟

	GPIO_ist.GPIO_Pin=GPIO_Pin_8;//LED0-->PA.8
	GPIO_ist.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_ist.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_ist);

	TIM_Base_ist.TIM_Period=arr;
	TIM_Base_ist.TIM_Prescaler=psc;
	TIM_Base_ist.TIM_ClockDivision=0;
	TIM_Base_ist.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM1, &TIM_Base_ist);
	//设置 TIM1_CH1 的 PWM 模式及通道方向
	TIM_OC_ist.TIM_OCMode = TIM_OCMode_PWM2; //脉宽调制模式 2
  TIM_OC_ist.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
  TIM_OC_ist.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  TIM_OC_ist.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
  TIM_OC1Init(TIM1, &TIM_OC_ist); //③初始化外设 TIMx

  TIM_CtrlPWMOutputs(TIM1,ENABLE); //⑤MOE 主输出使能
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1 预装载使能
  TIM_ARRPreloadConfig(TIM1, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器
  TIM_Cmd(TIM1, ENABLE); //④使能 TIM1
}

pwm.h

#ifndef _PWM_
#define _PWM_
#include "sys.h"
void TIM1_PWM_Init(u16 arr,u16 psc);
#endif

PWM输出频率计算方式:72000/[(arr+1)*(psc+1)]

主函数

#include "led.h"
#include "delay.h"
#include "usart.h"
#include "pwm.h"
#include "sys.h"
void init(void)
{
	delay_init();
	LED_Init();
	TIM1_PWM_Init(899,0);//PWM频率80KHz
}
int main(void)
{
	u16 i;
	init();
	while(1)
	{
		for(i=1;i<=300;i++)
		{
			delay_ms(10);
			TIM_SetCompare1(TIM1,i);
		}
		for(i=300;i>0;i--)
		{
			delay_ms(10);
			TIM_SetCompare1(TIM1,i);
		}
	}
}

可以看到类似呼吸灯的效果

时间: 2024-10-10 12:07:41

cortex_m3_stm32嵌入式学习笔记(九):PWM 输出实验的相关文章

cortex_m3_stm32嵌入式学习笔记(十):输入捕捉实验(定时器的输入捕捉)

输入捕获模式可以用来测量脉冲宽度或者测量频率. STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能. STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值( TIMx_CNT)存放到对应的通道的捕获/比较寄存器( TIMx_CCRx)里面,完成一次捕获.同时还可以配置捕获时是否触发中断/DMA 等. 本章我们用到 TIM2_CH1 来捕获高电平脉宽,也就是要先设置输入捕获为上升沿

cortex_m3_stm32嵌入式学习笔记(十九):DMA实验(高速传输)

DMA,全称为: Direct Memory Access,即直接存储器访问. DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路, 能使 CPU 的效率大为提高. 即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU. 一个完整的DMA传输过程必须经过下面的4个步骤. 1.DMA请求 CPU对DMA控制器初始化,并向I/O接

cortex_m3_stm32嵌入式学习笔记(八):定时器中断实验

STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器. 本节学习通用定时器 TIM3 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等. STM3 的通用 TIMx (TIM2. TIM3. TIM4 和 TIM5)定时器功能包括: 1)16 位向上.向下.向上/向下自动装载计数器( TIMx_CNT). 2)16 位可

cortex_m3_stm32嵌入式学习笔记(四):外部中断实验

本章学习将STM32的IO口作为外部中断输入(实现和按键扫描一样的功能) STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处. STM32F103 的中断控制器支持 19 个外部中断/事件请求.每个中断设有状位,每个中断/事件都有独立的触发和屏蔽设置. STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断.(本章只学习这一种) 线 16:连接到 PVD 输出. 线 17:连接到 RTC 闹钟事件. 线 18:连接到 USB

cortex_m3_stm32嵌入式学习笔记(十八):DAC实验(数模转换)

STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC. DAC可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用. DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐. DAC 模块有 2 个输出通道,每个通道都有单独的转换器.在双 DAC 模式下, 2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出. 本节实验,我们将利用按键(或 USMART) 控制 STM32 内部 DAC1来输出电压,通过 A

cortex_m3_stm32嵌入式学习笔记(二十三):红外遥控实验(输入捕捉+解码)

红外遥控是一种无线.非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中. 红外遥控的编码方式目前广泛使用的是: PWM(脉冲宽度调制)的 NEC 协议和 PhilipsPPM(脉冲位置调制) 的 RC-5 协议的.ALIENTEK MiniSTM32 开发板配套的遥控器使用的是NEC 协议,其特征如下: 1. 8 位地址和 8 位指令长度: 2.地址和命令 2 次传输(确保可靠性) 3. PWM

cortex_m3_stm32嵌入式学习笔记(二):独立按键实验(IO输入)

上一个也就是第一个实验做的是关于LED的,属于IO口的输出使用,这一节实验是独立按键的使用,即IO 口的输入使用 ministm32 开发板上一共有3个独立按键,分别为 KEY0  KEY1 WK_UP 原理图如下: 注意: KEY0 KEY1 是低电平有效(即它们为低电平时代表按键按下)而 WK_UP 是高电平有效,为什么呢..很明显,这个问题要分析上面的原理图才能知道的,好吧本渣没学过数模电电路也就勉强70多分(半本书..还没学完),就硬着头皮来分析一下吧(对错可不保证啊..QAQ):很明显

cortex_m3_stm32嵌入式学习笔记(三):串口实验(串口通信)

串口,可以理解为是用来和上位机(比如电脑)对话的,本节实验实现的是stm32接收上位机发送过来的信息,在原原本本的返回过去 stm32有5路串口,本节学习的是其中之一的USB串口(USART1)和学习IO口一样,首先要配置串口,由于原子已经配好了写在sys文件里,本渣就本着不造轮子的理念(其实是太难不懂orz),先跳过去了.. 所以本工程只需要一个main函数即可 #include "led.h" #include "sys.h" #include "de

cortex_m3_stm32嵌入式学习笔记(十六):ADC实验(模数转换)

之前没学过数模电,对A/D D/A转换一窍不通,也百度了很多资料大都深奥难懂..算了,先自以为是一下吧,等以后学了专业课再说..(寒假回家一定要学..恩 就这么决定了)看了那么多资料,感觉 A/D转换就是将电压(或者是其他模拟量:如 压力,图像等)转换为数字,D/A就是反过来,而ADC就是A/D转换器,他可以采集外部电压转化为数字.本节实验通过ADC采集外部电压转换为数字显示在屏幕上. STM32 拥有 1~3 个 ADC( STM32F101/102 系列只有 1 个 ADC),这些 ADC