历史上的今天

今天是:2024年10月05日(星期六)

正在发生

2018年10月05日 | 【STM32电机方波】记录4——PWM输出配置

发布者:WanderlustGlow 来源: eefocus关键字:STM32  PWM  输出配置 手机看文章 扫描二维码
随时随地手机看文章

PWM生成原理:

 通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。 这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。 而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。 如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为 A/(N+1) 。

STM32产生PWM的配置方法:

1、配置GPIO口:

  配置IO口的时候无非就是开启时钟,然后选择引脚、模式、速率,最后就是用结构体初始化。不过在32上,不是每一个IO引脚都可以直接使用于PWM输出,因为在硬件上已经规定了用某些引脚来连接PWM的输出口。下面是定时器的引脚重映像,其实就是引脚的复用功能选择:

  a.定时器1/8的引脚配置及复用功能映像:

【STM32电机方波】记录4——PWM输出配置
【STM32电机方波】记录4——PWM输出配置
根据以上重映像表,我们使用定时器1的通道TIM1__CH2作为PWM的输出通道,若选择PA9引脚则应进行配置,如下:

{

 GPIO_InitTypeDef GPIO_InitStructure;//定义结构体

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);

//使能 GPIO外设和AFIO复用功能模块时钟

 //GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); //选择Tim1完全重映像,即用了 PE11

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  //TIM_CH2

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽功能

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 

 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化引脚

}


产生六路PWM互补输出的GPIO配置:

{

  GPIO_InitTypeDef   GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;   //PA8、9、10  

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;   //PB13、14、15  

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

}


产生六路PWM互补输出的TIM1设置:

{

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定义时基结构体

TIM_OCInitTypeDef  TIM_OCInitStructure;//定义输出结构体

TIM1_BDTRInitTypeDef TIM1_BDTRInitStructure; //定义死区结构体


RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM1, ENABLE); //使能定时器1时钟


 

TIM_TimeBaseStructure.TIM_Period = arr; //自动重装载寄存器ARR的值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //TIM1预分频器PSC的值

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割,不分频

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据以上功能对定时器进行初始化


 

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                     //选择定时器模式,TIM脉冲宽度调制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;          //比较输出使能

TIM_OCInitStructure.TIM_OutputState = TIM_OutputNState_Enable;       //互补端输出使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                   //输出比较极性

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;              //输出互补端极性

//TIM1_OCInitStructure.TIM1_OCIdleState = TIM1_OCIdleState_Reset;     //死区后输出状态

//TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset;  //死区后互补端输出状态

TIM_OCInitStructure.TIM_Pulse = ccr1;         //设置通道CH1/CH1N占空比

TIM_OC1Init(TIM1, &TIM_OCInitStructure);   //通道CH1/CH1N初始化

TIM_OCInitStructure.TIM_Pulse = ccr2;         //设置通道CH2/CH2N占空比

 

TIM_OC2Init(TIM1, &TIM_OCInitStructure);   //通道CH2/CH2N初始化

TIM_OCInitStructure.TIM_Pulse = ccr3;        //设置通道CH3/CH3N占空比

TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //通道CH3/CH3N初始化


 

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);

TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);


 

TIM1_BDTRInitStructure.TIM1_OSSRState = TIM1_OSSRState_Enable;                          //运行模式下输出选择

TIM1_BDTRInitStructure.TIM1_OSSIState = TIM1_OSSIState_Enable;                            //空闲模式下输出选择

TIM1_BDTRInitStructure.TIM1_LOCKLevel = TIM1_LOCKLevel_OFF;                              //锁定设置

TIM1_BDTRInitStructure.TIM1_DeadTIM1 = 0xF2;                                                          //死区时间,2us

TIM1_BDTRInitStructure.TIM1_Break = TIM1_Break_Enable;                                          //刹车功能使能

TIM1_BDTRInitStructure.TIM1_BreakPolarity =TIM1_BreakPolarity_High;                     //刹车输入极性

TIM1_BDTRInitStructure.TIM1_AutomaticOutput =TIM1_AutomaticOutput_Enable;    //自动输出使能


 

 

TIM1_BDTRConfig(&TIM1_BDTRInitStructure); 


TIM_Cmd(TIM1, ENABLE); //使能TIM1

TIM1_CtrlPWMOutputs(ENABLE); //使能TIM1的主输出

}

至此,用TIM1产生6路PWM互补输出的配置结束。


TIM1输出初始化缺省值:

{

TIM1_OCMode = TIM1_OCMode_Timing;

TIM1_OutputState = TIM1_OutputState_Disable;

TIM1_OutputNState = TIM1_OutputNState_Disable;

TIM1_Pulse = TIM1_Pulse_Reset_Mask;

TIM1_OCPolarity = TIM1_OCPolarity_High;

TIM1_OCNPolarity = TIM1_OCNPolarity_High;

TIM1_OCIdleState = TIM1_OCIdleState_Reset;

TIM1_OCNIdleState = TIM1_OCNIdleState_Reset;

}


TIM1死区初始化缺省值:

{

TIM1_OSSRState = TIM1_OSSRState_Disable;

TIM1_OSSIState = TIM1_OSSIState_Disable;

TIM1_LOCKLevel = TIM1_LOCKLevel_OFF;

TIM1_DeadTime = TIM1_DeadTime_Reset_Mask;

TIM1_Break = TIM1_Break_Disable;

TIM1_BreakPolarity = TIM1_BreakPolarity_Low;

TIM1_AutomaticOutput = TIM1_AutomaticOutput_Disable;

}



主要完成任务:

1、对无霍尔BLDC电机程序作了更深层的理解,尝试修改程序将 PWM_OFF的过零检测模式换成PWM_ON,删除程序冗余部分,对TIM 高级定时器的程序段作了详细注释,加深印象。

2、对有霍尔BLDC电机程序进行了解及解读,基本上理解其运行原理及程序编写方式。

带霍尔元件的BLDC电机:

与不带霍尔元件的电机的区别除了少了启动检测外,多了EXTI 外部中断,电机的转动程序在此中断服务子程序中。霍尔元件的检测采用了三个中断线路捕获转子位置。

对于其PWM输出与无霍尔元件BLDC电机相同,换向也是用六步换向为霍尔六步换向,但无过零检测即无ADC 外设的参与。


关键字:STM32  PWM  输出配置 引用地址:【STM32电机方波】记录4——PWM输出配置

上一篇:关于STM32中NSS位的用法
下一篇:【STM32电机方波】记录3——TIM1时基初始化配置

推荐阅读

我们来看看我们的time.c文件。timer.c文件代码如下://通用定时器 3中断初始化//arr:自动重装值。 psc:时钟预分频数//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.//Ft=定时器工作频率,单位:Mhz//这里使用的是定时器 3!void TIM3_Int_Init(u16 arr,u16 psc){ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef N...
近日,格兰仕宣布与SiFive China联合开发了AIoT芯片——BF-细滘、NB-狮山,会用于所有格兰仕的家电产品,以加速实现智能家居。 同时,格兰仕在最近上市的16款新产品,包括微波炉、空调、冰箱等,已全部搭载了BF-细滘这款物联网芯片。 接下来,双方还将开发升级的物联网芯片BF-狮山,以及应用于智能家居的狮山操作系统。据了解,这些芯片和操作系统均应用R...
谈到医疗机器人,许多人都会起到美国Intuitive surgical公司研发的达芬奇机器人,它是世界第一款手术机器人,代表着机器人在医疗行业应用的重要里程碑。不过,达芬奇仍然是由人类控制的机器系统。随着人工智能技术的进步发展,医疗行业又发生了巨大的变化。利用机器学习的方法,可以对不同病例进行学习,再结合所有医学知识库的知识,能够快速诊断出病情...

史海拾趣

问答坊 | AI 解惑

H2000功放稳压模块及其应用

H2000功放稳压模块及其应用      文摘来源;主要摘自(电子制作)       H2000功放稳压模块及其应用       H2000Ⅱ大功率稳压模块是针对目前音频功放现状,为解 ...…

查看全部问答∨

8路温度转换上下限修改

谁能告诉我怎样存储修改呀?…

查看全部问答∨

有没有对北汽福田了解的兄弟?

有没有对北汽福田了解的哥们? 说说它的各方面情况,(四人间宿舍,有食堂,工资2500,试用期6个月,一签5年) 主要是技术和以后的发展怎么样?工资压力怎么样?新人刚进去公司会怎么安排?有没有人带你 ? 如果合同不到期辞了行不行?…

查看全部问答∨

键盘过滤驱动

哪位达人有这方面的资料,请帮帮忙,框架原理也了解一些, 要求能与上位机通信(传送HOOK到的scancode及flags) (最好能有源码),谢谢,比较急 发到邮箱也可以, mail:lys_ok@163.com…

查看全部问答∨

大家想不想弄个魔方机器人呢

大家想不想弄个魔方机器人呢, 最近看了些视频,关于魔方机器人的,大家有没有兴趣呢 弄个出来玩一下, 先给大家传几个视频看看 http://group.chinaaet.com/119/3417   要毕业了,要毕业的朋友可以用来当个毕设来搞 这东西挺好玩的 [ ...…

查看全部问答∨

变频电源的应用目的及领域

  变频电源(高频开关电源)是由整个电路构成交流一直流一交流一滤波的变频装置,得到了广泛应用。变频电源不仅能模拟输出不同国家的电网指标,而且也为出口电器厂商在设计开发、生产、检测等应用中提供纯净可靠的、低谐波失真的、高稳定的电压和 ...…

查看全部问答∨

lm3445的led调光?

关于lm3445的led调光电路,lm3445要如何才可以控制调光,用单片机可以实现调光控制吗?…

查看全部问答∨

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第十八章 TFTLCD显示实验

第十八章 TFTLCD显示实验 上一章我们介绍了OLED模块及其显示,但是该模块只能显示单色/双色,不能显示彩色,而且尺寸也较小。本章我们将介绍ALIENTEK 2.8寸TFT LCD模块,该模块采用TFTLCD面板,可以显示16位色的真彩图片。在本章中,我们将使用战舰 ...…

查看全部问答∨

晒WEBENCH设计的过程 +基于LM2596芯片的24V输入5V@3A单片机控制板供电电源设计

一、方案介绍:           在复杂的工控设备中,通常由多个控制板相互配合来实现不同的功能。在供电设计上,通常由大功率开关电源产生的24V电压来为各个子系统控制板供电。在制作基于5V电源工作的MCU控制板中,电 ...…

查看全部问答∨

发一个51最小系统

51单片机最小系统 1、将单片机的40个引脚全部引出,方便内嵌到您的系统;2、板载USB转串口芯片PL2303实现程序下载以及串口通信,并可为其他板子下载程序;3、板载8个LED,可做流水灯试验,无需外接,使用方便;4、两个中断按键,实现按键扫面、按键 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved