历史上的今天
今天是:2026年01月11日(星期日)
2023年01月11日 | stm32的PWM实现过程
2023-01-11 来源:zhihu
stm32的PWM实现过程
PWM是定时器扩展出来的一个功能(本质上是使用一个比较计数器的功能),配置过程一般为选定定时器、复用GPIO口、选择通道(传入比较值)、使能相应系统时钟、设定相应的预分频、计数周期、PWM模式(有两种)、电平极性等。具体介绍如下:
一、定时器的特点归类
STM32中一共有11个定时器,即 2个看门狗定时器、1个系统嘀嗒定时器(SysTick)及8个Timer定时器,详情如下表所示。

二、定时器所在时钟线路

三、PWM波形产生的原理
通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。
这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
四、STM32产生PWM的配置方法
1、配置GPIO口:
查看具体的GPIO引脚,以及查看GPIO口的复用功能(参考手册),我们这块用的是PC6。
a.定时器1的引脚复用功能映像:

b.定时器2的引脚复用功能映像:

c.定时器3的引脚复用功能映像:

d.定时器4的引脚复用功能映像:

根据以上重映像表,我们使用定时器3的通道2作为PWM的输出引脚,所以需要对PB5引脚进行配置,对IO口操作代码:
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //选择Timer3完全重映像
//选择定时器3的通道1作为PWM的输出引脚TIM3_CH1->PB6 GPIOC.6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化引脚
2、初始化定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定义初始化结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = 255; //自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler =7199; //TIMX预分频的值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据以上功能对定时器进行初始化
3、设置TIM3_CH1的PWM模式,使能TIM3的CH1输出
TIM_OCInitTypeDef TIM_OCInitStructure;//定义结构体
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式,TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出比较极性低
TIM_OC1Init(TIM3, &TIM_OCInitStructure);//根据结构体信息进行初始化
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能定时器TIM2在CCR1上的预装载值
4、使能定时器3
TIM_Cmd(TIM3, ENABLE); //使能定时器TIM3
5、使用PWM
经过上述操作,我们只需调用函数(如下)给通道1传值即可实现PWM波形正常输出。
static void PWM_Channel1_Out(u16 pwm)
{
TIM3->CCR1 = pwm;
}
史海拾趣
|
VS2005 开发WINCE应用程序时,创建项目时必须从“智能设备”这创建(win32,mfc的应用程序)?然后在选择相应的SDK,不能从WIN32或者MFC出创建?… 查看全部问答> |
|
小弟想学习嵌入式软件的建模开发,准备学习Rhapsody ,但发现我的Rhapsody 软件安装了后却没有帮助文档,请哪个大侠能否给点资料,万份感谢!!!… 查看全部问答> |
|
用DNW烧linux的zIamge.bins后,,,,启动后DNW终端就一直停在这个画面 是不是我在编译镜像之前有些设置没有设置好咧..? 还是 [ 本帖最后由 3108009356 于 2011-5-5 00:02 编辑 ]… 查看全部问答> |
|
这是用430写的 大虾指点下 #include \"MSP430G2553.h\"#include \"delay.h\" #define uchar unsigned char#define uint unsigned int #define DataDir P1DIR#define DataPort P1OUT #defin ...… 查看全部问答> |
|
STM32+物联网项目方案有奖竟赛--赠野火最新STM32开发板一套 本帖最后由 paulhyde 于 2014-9-15 03:41 编辑 我们论坛里有很多学生和初学者,很多人都是埋头看例程,埋头看手册,很少有人抬起头来思考真正的行业应用,这次的活动是为了让大家能够将学习到的单片机知识和实际的应用做一个结合。 由于征 ...… 查看全部问答> |
|
特点:电路简单,性能稳定,兼容性/容错能力强(针对低端充电器所使用的便宜的物料、变压器),针对电容触摸屏手机在不加Y电容情况下可以实现无干扰输出,全电压输入,最大可以做到5V/1A(5W)优点:1. 硬性 ...… 查看全部问答> |
|
3.1 ARM微处理器的指令集概述 3.1.1 ARM微处理器的指令的分类与格式 ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过 ...… 查看全部问答> |




