STM32使用PWM

STM32使用PWM

  • 一、PWM简介(Pulse width modulation)
  • 二、频率
  • 三、占空比(Duty Ratio)
  • 四、分辨率
  • 五、STM32使用pwm
    • 1.输出比较OC(Output Compare)
    • 2.输出比较电路
    • 3.通用计时器
  • 六、通过STM32输出50%占空比的PWM
    • 1.思路
    • 2.代码(PWM.c)
    • 3.计算
    • 4.示波器检测

一、PWM简介(Pulse width modulation)

1.定义:PWM,就是脉冲宽度调制,也就是占空比可变的脉冲波形。
2.适用条件:PWM所应用的场景必须为惯性系统,像led,当立即变为低电平时,led并不会瞬间熄灭,而是具有惯性,在短时间内为逐渐熄灭。
3.应用:智能车,机器人等项目。呼吸灯、驱动电机等。

二、频率

频率为Ts的倒数,频率越大,则等效模拟信号越平稳。(即输出的方波整体上较为密集)

三、占空比(Duty Ratio)

1.定义:占空比指在一个脉冲循环内,通电时间相对于总时间所占的比例。(或者说在一个周期中,高电平的时间占整个周期的时间
2.计算:D=Ton/Ts(Ton为一个周期内高电平的时间、Ts为高低电平变换周期的时间)
3.作用:频率一定时,可以通过改变占空比来调节电压
例如高电平为5V,低电平为0V时,占空比为80%时,可以看作为4/5处的电压,即4V。
STM32使用PWM_第1张图片

四、分辨率

1.定义:是指PWM最小能设定到的高电平时间所占周期的比例,即最小占空比
2.在一个时钟下,若降低频率,则周期变大,分辨率增大。

五、STM32使用pwm

1.输出比较OC(Output Compare)

如图
STM32使用PWM_第2张图片
流程:在进行CNT与CCR比较后,其结果在经过输出比较电路后,通过TIM_CH1输出到GPIO引脚上。

原理:通过进行对CNT计数器CCR捕获比较寄存器的比较,来输出一个电平不断跳变的PWM方波。
每当CNT=RCC时,就会进行一次电平翻转,CNT>CCR且小于ARR(即在一个周期内)时输出高电平。

2.输出比较电路

STM32使用PWM_第3张图片

原理:当CNT大于或等于CCR时,传输信号至控制器,后改变其输出的电平。

3.通用计时器

通用计时器共有4个RCC寄存器,且他们公用一个CNT计数器。

六、通过STM32输出50%占空比的PWM

1.思路

1.RCC开启时钟(GPIO和TIM)
2.选择时基单元的时钟源(定时中断选择内部时钟源)
3.配置时基单元(预分频器、自动重装器、计数模式)
4.配置CCR的值、输出比较模式、极性选择、输出使能的等参数
5.配置GPIO(PWM对应的GPIO使用复用推挽输出模式)

2.代码(PWM.c)

void PWM_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//GPIO初始化
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启通用定时器TIM2的时钟
	TIM_InternalClockConfig(TIM2);//选择时基单元的时钟(默认使用内部时钟)
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频,1表示不分频
	//滤波器作用:滤掉信号的抖动干扰
	//滤波器原理:在一个固定的时钟频率f下采样,若连续N个采样点电平一致,表示输入信号稳定,则输出
	//若N个采样点电平不相同,表示信号有抖动,则直接输出低电平或输出上一次的电平
	//采样频率由内部时钟直接来或由内部时钟加时钟分频来
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器模式(向上/向下/中间3个)
	TIM_TimeBaseInitStructure.TIM_Period=100-1;//周期(10K的频率下计1w个数即为1s)(ARR)
	TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//预分频器(72M对7200分频,得到10K的计数频率)(PSC)
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器(高级计数器才有)
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化结构体
	TIM_OCInitTypeDef TIM_OCInit_InitStructure;
	TIM_OCStructInit(&TIM_OCInit_InitStructure);//给结构体赋初值,以免对高级定时器等造成干扰
	
	TIM_OCInit_InitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较的模式
	//TIM_OCMode_Timing        冻结模式            
	//TIM_OCMode_Active        相等时置有效电平        
	//TIM_OCMode_Inactive      相等时置无效电平
	//TIM_OCMode_Toggle        相等时电平翻转      
	//TIM_OCMode_PWM1          PW1模式         
	//TIM_OCMode_PWM2		   PW2模式
	TIM_OCInit_InitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出比较的极性
	//TIM_OCPolarity_High      极性不翻转,REF有效是高电平,REF有效时输出高电平
	//TIM_OCPolarity_Low  		REF电平取反,有效电平为低电平
	TIM_OCInit_InitStructure.TIM_OutputState=ENABLE;//设置输出使能
	TIM_OCInit_InitStructure.TIM_Pulse=50;//设置CCR
	TIM_OC1Init(TIM2,&TIM_OCInit_InitStructure);
	//初始化输出比较单元
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}

3.计算

在这里插入图片描述

4.示波器检测

STM32使用PWM_第4张图片

你可能感兴趣的:(STM32,stm32,单片机,嵌入式硬件)