实验目的
通过上一张的学习,我们知道知道STM32的通用定时器和高级定时器拥有PWM输出功能,本章我们将利用TIM3的CH3通道输出波形,数据手册请参看第14章中的相关内容。
实验简介
脉宽调制器(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。
STM32的定时器除了TIM6和TIM7,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出。这里我们仅利用TIM3的CH3产生一路PWM输出。
PWM原理
上图就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM 模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的 PWM 示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候, IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。 改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的 频率,这就是 PWM 输出的原理。
电路设计
TIM3的CH3通道映射到PB0上,外接了红色LED灯D4,PWM输出波形可以控制LED的亮度,改变占空比,可以改变LED亮度,电路图如下图。
有关寄存器
捕获/比较模式寄存器 1(TIMx_CCMR1)
这里我们主要了解 110和111这两种相反的模式
** 捕获/比较使能寄存器(TIMx_CCER) **
因为TIM3的CH3通道映射到PB0上
捕获/比较寄存器 1(TIMx_CCR1)
小、中和大容量产品的寄存器映像和位定义
寄存器代码
test.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
int main(void)
{
u16 led0pwmval = 0;
u8 dir = 1;
Stm32_Clock_Init(9);
uart_init(72,115200);
delay_init(72);
LED_Init();
TIM3_PWM_Init(899,0);
//频率= 72000/(899+1)=80khz
while(1)
{
delay_ms(10);
if(dir)
led0pwmval++;
else
led0pwmval--;
if(led0pwmval > 300)
dir = 0;
if(led0pwmval == 0)
dir =