定时器PWM

更新时间:2024-04-26 18:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

天水师范学院

TIANSHUI NORMAL UNIVERSITY

《微机原理与接口技术》

实验报告

名称:定时器PWM输出 学院:电子信息与电气工程学院 专业:电子信息工程 班级:16级电信一班 姓名:张响生秦汉柱

学号: 20161060107 20161060132

一、实验目的;

1、掌握使用 STM32 的通用定时器的方法

2、掌握使用STM32 的 TIM3 来产生 PWM 输出

二、实验原理;

1、STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动

装载计数器(CNT)构成。可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 2、STM32的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括:

1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。 3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: A.输入捕获 B.输出比较

C.PWM 生成(边缘或中间对齐模式) D.单脉冲模式输出

4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。 5)如下事件发生时产生中断/DMA:

A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获 D.输出比较

E.支持针对定位的增量(正交)编码器和霍尔传感器电路 F.触发输入作为外部时钟或者按周期的电流管理

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

术。

1)PWM 模式

脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

在PWM模式下,TIMx_CNT和TIMx_CCRx始终在进行比较,(依据计数器的计数方向)以确定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx,以便输出某一电平信号。

PWM模式1在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

PWM模式2在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 2)PWM输出配置步骤

三、实验电路图;

四、关键代码;

Init.h

/************************RCC寄存器组定义*******************/ #define RCC_CR *((unsigned volatile int *)0X40021000) #define RCC_CFGR *((unsigned volatile int *)0X40021004) #define RCC_APB2ENR *((unsigned volatile int *)0X40021018) #define RCC_APB1ENR *((unsigned volatile int *)0X4002101c)

/************************TIM寄存器组定义*******************/

#define TIM3_CR1 *((unsigned volatile int *)0X40000400) #define TIM3_SMCR *((unsigned volatile int *)0X40000408) #define TIM3_DIER *((unsigned volatile int *)0X4000040c) #define TIM3_SR *((unsigned volatile int *)0X40000410) #define TIM3_EGR *((unsigned volatile int *)0X40000414) #define TIM3_CCMR1 *((unsigned volatile int *)0X40000418) #define TIM3_CCMR2 *((unsigned volatile int *)0X4000041c) #define TIM3_CCER *((unsigned volatile int *)0X40000420) #define TIM3_CNT *((unsigned volatile int *)0X40000424) #define TIM3_PSC *((unsigned volatile int *)0X40000428) #define TIM3_ARR *((unsigned volatile int *)0X4000042c) #define TIM3_CCR1 *((unsigned volatile int *)0X40000434) #define TIM3_CCR2 *((unsigned volatile int *)0X40000438)

oid Stm32_Clock_Init(unsigned char PLL); void LED_Init(void);

void Delay(long counder); void TIM3_PWM_Init(void); init.c

void TIM3_PWM_Init() { RCC_APB1ENR|=1<<1; //TIM3时钟使能 RCC_APB2ENR|=1<<3; //使能PORTB时钟 GPIOB_CTRL&=0XFF0FFFFF; //PB5输出 GPIOB_CTRL|=0X00B00000; //复用功能输出 RCC_APB2ENR|=1<<0; //开启辅助时钟 AFIO_MAPR&=0XFFFFF3FF; //清除MAPR的[11:10] AFIO_MAPR|=1<<11; //部分重映像,TIM3_CH2->PB5 TIM3_ARR=899; //设定计数器自动重装值 TIM3_PSC=0; //预分频器不分频

TIM3_CCMR1|=7<<12; //CH2 PWM2模式 TIM3_CCMR1|=1<<11; //CH2预装载使能 TIM3_CCER|=1<<4; //OC2 输出使能 TIM3_CR1=0x0080; //ARPE使能 TIM3_CR1|=0x01; //使能定时器3 } Main.c

int main(void) { Stm32_Clock_Init(9); LED_Init();

TIM3_PWM_Init(); while(1) { for (val=0;val<=300;val++) { TIM3_CCR2=val; Delay(60000); } for (val=300;val>=0;val--) { TIM3_CCR2=val; Delay(60000); }

五、功能与结果分析;

本文来源:https://www.bwwdw.com/article/vlup.html

Top