定时器中断实验和PWM输出实验(寄存器)

定时器分为高级定时器(TIM1,TIM8),基本定时器(TIM6,TIM7),以及通用定时器(TIM2,TIM3,TIM4,TIM5)。

TIM2-5支持向上,向下以及向上/向下的自动装载计数,TIM9-14只支持向上计数模式且只有两个通道

STM32 的通用定时器是一个通过可编程预分频器( PSC )驱动的 16 位自动装载计数器( CNT
构成。
STM3 的通用 TIMx (TIM2 TIM3 TIM4 TIM5) 定时器功能包括:
1)16 位向上、向下、向上 / 向下自动装载计数器( TIMx_CNT) 。且位于低速的APB1总线上(干哈高级定时器位于APB2总线上)
向上计数:从0开始计数到自动装载值(TIMX_ARR),然后从0开始计数产生一个计数器溢出时间。
向下计数:从自动装载值(TIMX_ARR)开始计数到0,然后从自动装载值开始重新计数,并产生一个计数器溢出事件
中央对齐模式:从0开始计数到自动装载值(TIMX_ARR)-1并产生一个溢出事件,然后从自动装载值减到1,并产生一个溢出事件,然后从0开始计数。
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 .触发输入作为外部时钟或者按周期的电流管理
//定时器3中断服务程序	 
void TIM3_IRQHandler(void)
{ 		    		  			    
	if(TIM3->SR&0X0001)//溢出中断
	{
		LED1=!LED1;			    				   				     	    	
	}				   
	TIM3->SR&=~(1<<0);//清除中断标志位 	    
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<1;	//TIM3时钟使能    
 	TIM3->ARR=arr;  	//设定计数器自动重装值 
	TIM3->PSC=psc;  	//预分频器设置
	TIM3->DIER|=1<<0;   //允许更新中断				
	TIM3->CR1|=0x01;    //使能定时器3
  	MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2									 
}

理解思考:定时器时钟借助公式计算,当产生溢出的时候,时钟会继续走,而不会的等待中断进行完毕才进行新的计数(相当于早上起床闹钟响了,你需要关闭闹钟并且起床,但是时钟的时间还是在一直走,不会停止)。

PWM输出:

首先使能你需要使用的时钟,设置arr自动重载值(顶峰值),设置预分频器的数值借助公式算出计数器的溢出时间,在产生更新事件的时候产生中断(在中断中反转状态)。

PWM简而言之就是对脉宽的调制

PWM频率:1s内,电平从高电平到低电平又在回到高电平的次数,也就是1s内有多少个PWM周期,单位:HZ。

占空比:脉宽时间占一个PWM周期的比例。【也就是高电平占单个周期的时间】

计算周期的方法:72000000/(7199+1)= 10KHZ   算出计一个数的时间,T = 1/f = 1/10000s,然后乘以arr可以算出一个pwm周期的时间, 

PWM频率 = 时钟频率/(PSC+1)*(ARR+1)

信号频率:由TIMX_ARR决定

占空比:由TIMX_CCRX决定

计时器时钟源来源分为4类:

● 内部时钟(CK_INT)

● 外部时钟模式1:外部输入脚(TIx)

● 外部时钟模式2:外部触发输入(ETR)

● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器

但往往都是默认的内部时钟(CK_INT)

通用定时器时钟是由APB总线通过PSC预分频分配而来的,TIM1和8是在APB2上面,而TIM2-7全部都在APB1上面,若分频系数为1,则定时器时钟就是APB原有时钟频率,否则需要*2。

计数器时钟(CK_CNT)是由内部时钟(CK_INT)通过PSC预分频器分频得到的。但需要使用计数器时钟需要进行使能(将TIMX_CR1的GEN位写入1)。

时基单元包含的:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。

TIMx_CCMR1 控制 CH1 和 2,而TIMx_CCMR2 控制 CH3 和 4

 在向上计数的时候,当CNT的值从0开始增加,当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。

改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。

这里需要注意你选择的PWM模式是1还是2

110 PWM 模式 1 - 在向上计数时,一旦 TIMx_CNT<TIMx_CCR1 时通道 1 为有效电平,否则为
无效电平;在向下计数时,一旦 TIMx_CNT>TIMx_CCR1 时通道 1 为无效电平 (OC1REF=0) ,否
则为有效电平 (OC1REF=1)
111 PWM 模式 2 - 在向上计数时,一旦 TIMx_CNT<TIMx_CCR1 时通道 1 为无效电平,否则为
有效电平;在向下计数时,一旦 TIMx_CNT>TIMx_CCR1 时通道 1 为有效电平,否则为无效电
平。
紧接着要设置CHX的预装载使能,新设置的ARR以及CCRX的数值,将会存放进入ARR预装载寄存器,但实际起作用的是影子寄存器,而从ARR预装载寄存器到影子寄存器的方式有两种:
1.立即更新。
2.触发事件后进行更新。
此时需要看TIMX_CR1的“ARPE”位,为1,则在下一次触发事件(UEV)时才会更新数值,反之,若为0,则会立即更新数值。
特别注意:当时钟为高级定时器的时候,需要将TIMX_BDTR的MOE位置为1,否则无法运行

 设置PWM模式的,并且进行比较输出的使能 

    ​​TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

选择完pwm模式,还需要选择极性


 设置当前的极性

TIM_OCPolarity_High   --  高电平

TIM_OCPolarity_Low    --  低电平

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜路难行々

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值