stm32 笔记 PWM及HAL库应用
创始人
2024-03-14 13:33:16
0

stm32 PWM原理

 STM32 使用一个定时器作为 PWM 输出,在上图中,ARR 即为重装载值。在计数器的值大于CRRx的值并且小于 ARR 之间,即区分高低电平。输出在图中分别有 ① 和 ② 两种情况.

分别为:

①CRR 和 ARR 区间为低电平。

②CRR 和 ARR 区间为高电平。

设置输出方式

有两个配置可以配置输出方式:

PWM 模式 1–– 在递增计数模式下,只要 TIMx_CNTTIMx_CCR1,通道 1 便为无效状态,否则为有效状态。

PWM 模式 2–– 在递增计数模式下,只要 TIMx_CNTTIMx_CCR1,通道 1 便为有效状态,否则为无效状态。

TIMx_CNT即为当前计数值

其中 PWM 模式 1 和模式 2 完全相反。

 除了设置PWM模式之外,还可以设置 CERR:CC1P 位,置 0 高电平有效,置 1 低电平有效。

 例:

如果设置为 PWM1 模式,CC1P 设置为 0,即为:①波形

如果设置为 PWM1 模式,CC1P 设置为 1,即为:②波形

 初始化 PWM

TIM_HandleTypeDef TIM3_Handler;         //定时器3PWM句柄 
TIM_OC_InitTypeDef TIM3_CH4Handler;	    //定时器3通道4句柄void TIM3_PWM_Init()
{ TIM3_Handler.Instance=TIM3;            //定时器3TIM3_Handler.Init.Prescaler=90-1;       //定时器分频TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式TIM3_Handler.Init.Period=500-1;          //自动重装载值HAL_TIM_PWM_Init(&TIM3_Handler);       //初始化PWMTIM3_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1TIM3_CH4Handler.Pulse=250;            //设置默认占空比TIM3_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低  cc1p为0HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);//配置TIM3通道4HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM通道4
}

 在上边我们设置了 90分频(Prescaler),我当前机器设置的是 90mhz,90 分频后即为 1mhz 即一秒计数 1000 次,重装载值 (Period)设置为 500。也就说,对于当前 PWM 周期为 500ms。

在之后,我们设置了 TIM3_CH4Handler.Pulse=250; 这即是默认的输出占空比。

输出波形如图所示:

 

设置 GPIO 状态

在芯片手册中,我们发现 PB1 可以被复用为 TIM3,于是做出如下设置: 

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM3_CLK_ENABLE();			//使能定时器3__HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIOB时钟GPIO_Initure.Pin=GPIO_PIN_1;           	//PB1GPIO_Initure.Mode=GPIO_MODE_AF_PP;  	//复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速GPIO_Initure.Alternate= GPIO_AF2_TIM3;	//PB1复用为TIM3_CH4HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}

 我们想让 PB1 输出 PWM 波,需要开启时钟这些常规配置。并且需要使用GPIO_Initure.Alternate= GPIO_AF2_TIM3; 使 PB1 复用成 TIM3。这样才可以输出 PWM 波。

编写设置 PWM 值函数

因为我们刚才在初始化的时候用了:

HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4)

HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4)

均是 CHANNEL_4 使用了通道4。

//设置TIM通道4的占空比
//compare:比较值
void TIM_SetTIM3Compare4(u32 compare)
{TIM3->CCR4=compare; 
}

全部代码

#include "sys.h"
#include "delay.h"TIM_HandleTypeDef TIM3_Handler;         //定时器3PWM句柄 
TIM_OC_InitTypeDef TIM3_CH4Handler;	    //定时器3通道4句柄void TIM3_PWM_Init()
{ TIM3_Handler.Instance=TIM3;            //定时器3TIM3_Handler.Init.Prescaler=90-1;       //定时器分频TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式TIM3_Handler.Init.Period=500-1;          //自动重装载值HAL_TIM_PWM_Init(&TIM3_Handler);       //初始化PWMTIM3_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1TIM3_CH4Handler.Pulse=250;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%TIM3_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低  cc1p为0HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);//配置TIM3通道4HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM通道4
}void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM3_CLK_ENABLE();			//使能定时器3__HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIOB时钟GPIO_Initure.Pin=GPIO_PIN_1;           	//PB1GPIO_Initure.Mode=GPIO_MODE_AF_PP;  	//复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速GPIO_Initure.Alternate= GPIO_AF2_TIM3;	//PB1复用为TIM3_CH4HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}//设置TIM通道4的占空比
//compare:比较值
void TIM_SetTIM3Compare4(u32 compare)
{TIM3->CCR4=compare; //因为使用了通道4,所以需要修改 CCR4 寄存器
}int main(void)
{GPIO_InitTypeDef GPIO_Initure;HAL_Init();                     //初始化HAL库    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180MhzTIM3_PWM_Init();while(1){TIM_SetTIM3Compare4(0);	//因为使用了 PWM模式1 以及cc1p0 所以设置0是最暗 设置500是最亮}
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...