STM32 实现PWM 库函数版

STM32 实现PWM 库函数版

TIM1和TIM7没有PWM输出
TIM0和TIM8 有七路PWM输出 27 = 14
通用定时器 都有4个 PWM 4
4 = 16
一共有30个PWM输出

在这里插入图片描述
图中,我们假定定时器工作在向上计数 PWM
模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。

PWM输出配置步骤

1. 使能定时器及端口时钟,并且设置引脚复用器映射
2. 初始化定时器参数,包括自动重装载,分频系数,计数方式等
3. 初始化PWM输出参数,包含PWM模式 输出极性 使能等
4. 开启定时器
5. 修改TIMx_CCRx的值控制占空比
TIM_SetComparel(TIMx,Compaarel);
6. 使能TIMx在CCRx上的预装载 寄存器
7. 使能TIMx在ARR上的预装载寄存器允许位

在这我使用TIM3进行PWM实现呼吸灯

TIM3重映射控制表
所以我能控制的小灯就是PC6 PC7

在此我将控制PC7

代码如下:


#include "Pwm.h"


void TIM3_Pwm_Init(u16 per,u16 psc)
{
	TIM_TimeBaseInitTypeDef timeT;
	TIM_OCInitTypeDef timeO;
	GPIO_InitTypeDef gpio;
	
	/* 开启时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	/*  配置GPIO的模式和IO口 */
	gpio.GPIO_Pin=GPIO_Pin_7;
	gpio.GPIO_Speed=GPIO_Speed_10MHz;
	gpio.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOC,&gpio);
	
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射	
	
	timeT.TIM_Period=per;   //自动装载值
	timeT.TIM_Prescaler=psc; //分频系数
	timeT.TIM_ClockDivision=TIM_CKD_DIV1;   //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1
	timeT.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
	TIM_TimeBaseInit(TIM3,&timeT);	
	
	timeO.TIM_OCMode=TIM_OCMode_PWM2;  // PWM模式2:CNT>CCR时输出有效
	timeO.TIM_OCPolarity=TIM_OCPolarity_High;  // 设置极性-有效为高电平
	timeO.TIM_OutputState=TIM_OutputState_Enable; // 输出使能
	TIM_OC2Init(TIM3,&timeO); TIM3的通道2PWM 模式设置
	
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的预装载寄存器
	TIM_ARRPreloadConfig(TIM3,ENABLE);//使能预装载寄存器
	
	TIM_Cmd(TIM3,ENABLE); //使能定时器
}

主函数如下:

#include "led.h"
#include "SysTick.h"
#include "Pwm.h"

int main()
{
	u16 i = 0;
	u8 fx = 0;
	
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组
	LED_Init();
//	BEEP_Init();
//	Key_Init();
//	Exti_Init();
	TIM3_Pwm_Init(500,71);  //2kh
	while(1)
	{
		if(fx == 0)
		{
			i++;
			if(i == 300)
			{
				fx = 1;
			}
		}
		else
		{
			i--;
			if(i == 0)
			{
				fx = 0;
			}
		}
		
		TIM_SetCompare2(TIM3,i);  //改变比较值TIM3->CCR2达到调节占空比的效果
		delay_ms(10);
	}
}


下一篇实现PWM 寄存器版本在这

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值