关于STM32的PWM模式配置 ,核心代码如下,以原子的mini板STM32F103RCT6为例子
void TIM1_PWM_Init(u16 arr,u16 psc)//定时器1的PWM初始化
{
/*结构体变量定义*/
GPIO_InitTypeDef GPIO_Initstrue;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstrue;
TIM_OCInitTypeDef TIM_OCInitstrue;
/*-------------*/
/*开启TIM1时钟,配置对应管脚(PA8)为复用输出*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA,ENABLE);//使能TIM1和GPIOA时钟
GPIO_Initstrue.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽
GPIO_Initstrue.GPIO_Pin = GPIO_Pin_8;
GPIO_Initstrue.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstrue);//初始化IO口为复用推挽
/*---------------------------------------*/
/*设置TIM1的ARR和PSC*/
TIM_TimeBaseInitstrue.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitstrue.TIM_Period = arr;//设置自动重装载值,决定周期
TIM_TimeBaseInitstrue.TIM_Prescaler = psc;//设置预分频值,决定周期
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitstrue);//定时器初始化
/*设置TIM1_CH1的PWM模式,通道,使能TIM1的CH1输出*/
TIM_OCInitstrue.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitstrue.TIM_OCMode = TIM_OCMode_PWM2;//PWM模式2:向上计数,CNT TIM_OCInitstrue.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高 TIM_OC1Init(TIM1,&TIM_OCInitstrue);//通道1输出PWM TIM_CtrlPWMOutputs(TIM1,ENABLE);//TIM1,8需要该函数MOE主输出使能 TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH1的CCR1预装载寄存器使能 TIM_ARRPreloadConfig(TIM1,ENABLE);//使能TIM1在ARR上的预装载寄存器 TIM_Cmd(TIM1,ENABLE);//使能TIM1定时器 } 步骤(相关寄存器与函数) 首先,应当使能对应的定时器与IO口时钟。因为PWM是从定时器的一个通道输出而来的。 第二步,通过ARR,PSC寄存器的值来控制PWM波的周期。如该代码,频率为72000K/(899+1)=80KHz TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitstrue);//定时器初始化 第三步,设置TIM1-CH1的PWM模式,通道 因为min板的LED接PA8,且为低电平亮,所以PWM模式2,CNT TIM_OC1Init(TIM1,&TIM_OCInitstrue);//通道1输出PWM 第四步,使能CH1通道(也是使能CCR1比较寄存器),使能ARR预装载寄存器。 TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH1的CCR1预装载寄存器使能 TIM_ARRPreloadConfig(TIM1,ENABLE);//使能TIM1在ARR上的预装载寄存器 第五步,使能TIM1定时器 TIM_Cmd(TIM1,ENABLE);//使能TIM1定时器 第五步,仅对于高级定时器才需要此步。F103RCT6的高级定时器为TIM1和8,所以需要。使能刹车和死区寄存器(TIM1_BDTR)的MOE位,以使能整个OCx输出。库函数为 TIM_CtrlPWMOutputs(TIM1,ENABLE);//TIM1,8需要该函数MOE主输出使能 第六步,占空比的修改。TIM_SetCompare1(TIM1,a);这个值当然就是CCR1里装载的值 ,但不能大于arr的值! 哦,对了,也有端口重映射的PWM输出。粘上代码如下 这里我们是假设一下,要把PB5用作定时器的PWM输出引脚,所以要重映射配置, 所以需要开启AFIO时钟。同时设置重映射。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 注意与总结 ARR寄存器的值即自动重装载值,和预分频值共同决定PWM周期。CCRx寄存器的值则是决定着占空比。根据原理,CCRx寄存器的值必须不能大于ARR寄存器的值。。。还有的朋友会疑惑,为啥一个定时器可以同时输出四个通道的PWM,却只有一个CNT计数寄存器,这个嘛,他有一个CNT计数器,却每个通道对应一个CCRx寄存器,这样一来计数归计数,他和四个CCRx寄存器接连比较输出各自的PWM并不矛盾。。。
上一篇:STM32 TIM1输入捕获配置
下一篇:STM32 多个定时器PWM波输出频率不同。
推荐阅读最新更新时间:2024-11-11 15:41
设计资源 培训 开发板 精华推荐
- AD8532ARZ1 单电源直接接入调制解调器的典型应用
- 使用 Richtek Technology Corporation 的 RT7257D 的参考设计
- LT4275BHMS IEEE 802.3at(类型 2)25.5W 受电器件的典型应用电路
- NCP380LSNAJAGEVB,笔记本USB开关评估板
- 可调强光手电筒
- LTC3778EF 演示板,高效笔记本 CPU 电源,超低电压 Tualatin,Vin = 7.5V - 24V,Vcore = 1.1V/13Amax + VID
- LT6656AIS6-1.25、1.25V 升压输出电流电压基准的典型应用
- AD5315 4 缓冲 10 位 DAC 在 10 引脚 MSOP 中的典型应用
- 基于ESP8266的HOMEKIT单开关配件
- CPU防着凉电路
- 有奖直播:ST60 非接触式连接器及应用探索
- 国产FPGA有奖直播:安路全新FPSoC产品SF1系列(FPGA+MCU),Demo板介绍和案例解析
- 【有奖直播】 聚焦语音识别核心技术,走进Microchip Timberwolf™音频处理器研讨会
- 雷柏、京造的无线充电鼠标垫,等你拆开看——EEWorld邀你来玩拆解(第三期)
- 实战分享|从零开始,设计一款靠谱的开关电源
- 泰克专家邀你了解大数据时代全新解决方案,参与翻盖有礼!
- 邀你参加2018年论坛体验问卷调查
- TE可穿戴解决方案助你打造暖心大白,答题赢TTI好礼
- ADI软件定义无线电(SDR)专题文章
- 报名有礼:【TI C2000在实时控制系统中的新特性】网络直播诚邀您参与!