目录
一、PWM基本概念
(1)目的
(2)分析
(3)相关的概念介绍
二、MDK5仿真输出PWM波形
(一)程序例程
(二)仿真调试
三、运用示波器输出PWM波形
一、PWM基本概念
(1)目的
PWM是脉宽调制(Pulse Width Modulation)的简称,被广泛的应用在从测量、通信到功率控制与变换的许多领域中,PWM利用微处理器的数字输出实现对于模拟信号进行控制的一种有效技术,PWM是一种对模拟信号电平进行数字编码的方法。通过计数器的使用,方波的占空比被调制用于对一个具体模拟信号的电平进行编码,本实验使用的STM32F103单片机的TIM3定时器产生PWM输出,进而控制开发板上LED灯的亮灭并在示波器上显示PWM输出波形
(2)分析
在STM32单片机中,除了定时器TIM6和TIM7,其余的定时器都可以用来产生PWM输出,本实验中调用TIM3定时器的CH2输出PWM控制DS0的亮灭情况。在F1的板子中,TIM3_CH2是接在单片机的PA7端口上,而DS0是接在PB5上,这里使用STM32的重映射功能,将TIM3_CH2映射到PB5上。STM32的重映射控制是由复用重映射和调试IO配置寄存器(AFIO_MAPR)控制的,该寄存器的各位描述如下表:
TIM3_REMAP[1:0]重映射控制表如下表所示:
(3)相关的概念介绍
占空比:在固定周期输出的PWM波中,高电平保持的时间与该PWM的时钟周期的时间之比。
分辨率:和PWM输出的位数有关,即占空比最小能够达到的值,比如8位的PWM输出,理论上的分辨率就是1/(2^8-1)=1:255。
参考
二、MDK5仿真输出PWM波形
(一)程序例程
本文采用的是正点原子手把手教你STM32教程-STM32F103精英版库函数开发指南-PWM输出实验的源码
(1)PWM配置函数的步骤
1)首先需要开启TIM3的时钟和复用功能时钟,配置PB5为复用输出。利用库函数设置AFIO时钟。
2)设置TIM3_CH2重映射到PB5上。
3)初始化TIM3,设置TIM3的ARR和PSC。
4)设置TIM3_CH2的PWM模式,使能TIM3的CH2输出。
5)使能TIM3。
6)修改TIM3_CCR2来控制占空比。
(2)PWM配置部分源码
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//设置该引脚为复用输出功能,输出TIM3_CH2的PWM输出脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
(3)主程序
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化波特率为115200
LED_Init(); //LED端口初始化
TIM3_PWM_Init(699,0); //不分频,PWM频率=72000000/900=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}
(二)仿真调试
(1)编译无误后,点击魔法棒
(2)进入调试界面
进入调试界面之后点击逻辑分析仪(Logic Analyzer)
配置PWM输出管脚为PB5,显示类型为二进制位
点击运行,一段时间后便可看到波形
三、运用示波器输出PWM波形