stmf407stm32f407 pwm输出出

posts - 9,&
comments - 2,&
trackbacks - 0
一. & TIMER分类:
STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。
计数器分辨率
计数器类型
预分频系数
产生DMA请求
捕获/比较通道
向上,向下,向上/向下
1-65536之间的任意数
向上,向下,向上/向下
1-65536之间的任意数
1-65536之间的任意数
其中TIM1和TIM8是能够产生3对PWM互补输出,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。
二、PWM波形产生的原理:
产生波形原理来源:/thread-.html通用定时器可以利用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的引脚复用功能映像:
  b.定时器2的引脚复用功能映像:
  c.定时器3的引脚复用功能映像:
  d.定时器4的引脚复用功能映像:
&根据以上重映像表,我们使用定时器3的通道2作为PWM的输出引脚,所以需要对PB5引脚进行配置,对IO口操作代码:
GPIO_InitTypeDef GPIO_InitS//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB
| RCC_APB2Periph_AFIO, ENABLE);//使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //选择Timer3部分重映像
//选择定时器3的通道2作为PWM的输出引脚TIM3_CH2-&PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//复用推挽功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化引脚
2、初始化定时器: 
TIM_TimeBaseInitTypeDef
TIM_TimeBaseS//定义初始化结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = //自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler = //TIMX预分频的值
TIM_TimeBaseStructure.TIM_ClockDivision = <span style="color: #; //时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据以上功能对定时器进行初始化
3、设置TIM3_CH2的PWM模式,使能TIM3的CH2输出:
TIM_OCInitTypeDef
TIM_OCInitS//定义结构体
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//选择定时器模式,TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_L//输出比较极性低
TIM_OC2Init(TIM3, &TIM_OCInitStructure);//根据结构体信息进行初始化
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); &//使能定时器TIM2在CCR2上的预装载值
4、使能定时器3:
TIM_Cmd(TIM3, ENABLE);
//使能定时器TIM3
经过以上的操作,定时器3的第二通道已经可以正常工作并输出PWM波了,只是其占空比和频率都是固定的,我们可以通过改变TIM3_CCR2,则可以控制它的占空比。修改占空比的函数为:TIM_SetCompare2(TIM3,n); &n不同,占空比不同。
5、修改pwm波形的占空比:
编写一个函数:void TIM3_PWM_Init(u16 arr,u16 psc);将以上所有的代码都加进来这个函数中,只要在main函数中调用该函数进行初始化,然后使用TIM_SetCompare2()函数修改PWM的占空比就可以在PB5脚得到需要的PWM波形了。关于频率以及占空比的计算方法有以下例子:
int main(void)
{  TIM3_PWM_Init(<span style="color: #99,<span style="color: #3);//频率为:72*10^6/(9999+1)/(143+1)=50Hz  TIM_SetCompare2(TIM3,<span style="color: #99);//得到占空比为50%的pwm波形
  while(<span style="color: #);
&可参考:/wangh0802PositiveANDupward/archive//2839313.html
阅读(...) 评论()STM32F407 PWM输出脉冲数 - 【stm32/stm8】 -
电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 6493|回复: 7
STM32F407 PWM输出脉冲数
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
怎么实现在STM32F407上 TIM1 实现输出 精确脉冲数
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
怎么没人用到这方面的东西拿
在线时间2156 小时
威望50472分
芯币38877枚
TA的帖子TA的资源
本身就是定时器产生的PWM,这个还需要算吗
产生pwm信号 是对的 问题是怎么我想让他输出多少个脉冲就输出多少个脉冲&
&&&&&&&&&&
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
回复 板凳 tiankai001 的帖子
产生pwm信号 是对的 问题是怎么我想让他输出多少个脉冲就输出多少个脉冲
在线时间4 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 130, 距离下一级还需 70 积分
一粒金砂(中级), 积分 130, 距离下一级还需 70 积分
敢问楼主解决了没有?
在线时间5 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
同求,我也遇到这个问题,想问问楼主解决了没?
在线时间2195 小时
威望13847分
芯币24083枚
TA的帖子TA的资源
这些东西例程中都有,为什么不看看例程呢?再用示波器看看就可以实现了。
在线时间5 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
并没有解决,搁浅中
资源大师勋章
在下载中心贡献超过4000份资料
EEWORLD 官方微信
EE福利 唾手可得
Powered bySTM32 PWM输出总结_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32 PWM输出总结
&&STM32 PWM输出总结
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢随笔 - 55&
文章 - 0&评论 - 8&trackbacks - 0
上一篇文章关于STM32基本的计数原理明白之后,该文章是在其基础上进行拓展,讲述关于STM32比较输出的功能,以输出PWM波形为实例来讲述。
提供实例工程中比较实用的函数:只需要调用该函数,参数为频率和占空比
void TIM2_CH2_PWM(uint32_t Freq, uint16_t Dutycycle);
先看一下实例中1KHz、20%占空比波形图 TIM2_CH2_PWM(1000, 20);
关于本文的更多详情请往下看。
Ⅱ、实例工程下载
笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。
笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。
提供下载的软件工程是STM32F417的,但F4其他型号也适用(适用F4其他型号: 关注微信,回复&修改型号&)。
STM32F4_TIM输出PWM波形(可调频率、占空比)实例:
STM32F4资料:
& 访问密码 53e7
Ⅲ、原理描述
上一篇文章讲述的就是上图中&计数&红色部分,也就是开始到结束的时间,该文章是讲述在这个计数的中间加一个值(比较值),当计数到这个比较值的时候就对输出的引脚进行反向,直到计满(一个周期)。循环下去。
通用TIM框图:
上面两图截取&STM32F4x5、x7参考手册&建议下载手册参看。
我上面说的&比较值&就是TIM框图中比较部分的&Capture/Compare x register&比较寄存器,这个值就会决定输出引脚的电平。
Ⅳ、源代码分析
笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为建立的工程,主要以库的方式来讲述。
该函数位于bsp.c文件下面;
重点注意:
A.外设RCC时钟的配置要在其外设初始化的前面;
B.匹配对应时钟。
比如:RCC_APB2外设不要配置在RCC_APB1时钟里面
【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】
2.TIM比较输出配置
该函数位于timer.c文件下面;
TIM2时基单元配置是上一篇文章相关的内容,是及时的配置,在该文中也就是对一个周期的配置。
TIM2通道2:PWM1模式配置是对占空比的配置。
tim2_period = TIM2_COUNTER_CLOCK/Freq - 1;
tim2_pulse& = (tim2_period + 1)*Dutycycle / 100;
函数开始是对周期和占空比的一个换算公式,也比较简单。
决定输出频率和占空比主要由这三个参数(TIM2_PRESCALER_VALUE、tim2_period、tim2_pulse)决定的。
以今天工程输出1KHz,20%来举例说明:
TIM2_PRESCALER_VALUE = 168M/2 / 42M - 1 = 1 (也就是2分频)
tim2_period = 42000 - 1
tim2_pulse = 8400
频率1KHz& =& 42M / 4200
占空比20%& =& 8400/42000
关于笔者提供的软件工程实例,可关注微信,在会话框回复&关于工程&,有关于工程结构描述、型号修改等讲述。
以上总结仅供参考,若有不对之处,敬请谅解。
更多精彩文章我讲第一时间在微信公众号里面分享。
本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索&EmbeddDeveloper& 或者扫描下面二维码、关注,将有更多精彩内容等着你。
阅读(...) 评论()

我要回帖

更多关于 stm32输出pwm控制电机 的文章

 

随机推荐